每天打卡5分钟,学会k8s 第四章集群架构

今天讲的是kubernetes的架构简讲吧,kuberbetes cluster有Master和Node【slave】组成,节点上运行多个kubernetes服务。

Master 节点

Master是kubernetes cluster的大脑,运行着的Daemon服务包括kube-apiserver、kube-scheduler、kube-controller-manager、etcd和pod网络(例如flannel)。

每天打卡5分钟,学会k8s 第四章集群架构_第1张图片

  1. API Server(kube-apiserver)

这个提供了Rest API,也就是我们应用层所说的前端接口,各种客户端工具CLI/UI管理的资源的东西,如果你 需要进行二次开发的话,这个服务需要掌握。

  1. scheduler(kube-scheduler)

负责讲Pod放在那个Node上运行,也就是调度时会充分考虑cluster的拓扑结构,当前各个节点的负载,以及应用对高可用、数据亲和性的需求

  1. Controller Manager

负责Cluster各种资源,保护资源处于预期的状态,也就是运行的服务器资源,控制在一个合适的地方,不会像老AMD CPU那种情况。一方有难,八方围观。在Controller有可以分了好几种Controller,replication、endpoints、namescpace、serviceaccounts等

不同的controller管理的不同的资源,例如 replication 管理的是deployment、statefulset、daemonset的生命周期,namespace管理的是Namespace资源

4.etcd

etcd是一个key/value分布式数据库,由于他是go写的。所以这东西也就成为了k8s用来保存资状态信息和配置信息使用,自带的负载均衡里的服务发现也用到它。

  1. pod网络

这个比较重要了,因为docker是不能跨主机通信的。如果要跨主机通信,就必须自己手动开启port映射,如果你的容器过多,那你操作就很麻烦。flannel刚好就帮你解决了这个问题,当然还有其他的网络方案,这是flannel用的人多,资料多一点。

Node节点

所有的node是pod打工的地方,kubernetes支持docker、rkt等容器Runtime。Node上运行的组件有Kubelet、kube-proxy和Pod网络。

每天打卡5分钟,学会k8s 第四章集群架构_第2张图片

Kubelet

kubelet是node的agent。当scheduler确定在某个node上运行pod后,会将pod的具体配置image、volume等信息发送该街道到kubelet然后根据这些信息创建和运行容器,并向master报告状态。

kube-proxy

service在逻辑上代表了后端的多个pod,外界是通过service访问pod。service接收到request需要通过proxy进行代理pod进行容器交换,如果你的pod是多个副本的话,这里也会帮你自动进行负载均衡。也就是说如果你使用了k8s无效在使用nginx进行手动负载均衡这些愚蠢的操作。我看到很多php的教程是这么搞docker。

下面我们就看看完整的结构图

每天打卡5分钟,学会k8s 第四章集群架构_第3张图片

从图中你会发现master也存在kubelet和kube-proxy,那是因为master也可以运行应用,如果你好奇的话可以去试试使用rancher,就算是单节点它也可以创建pod容器的。

我们要查看k8s上已经运行的pod可以用下面的命令,和你用docker ps一样频繁

kubectl get pod --all-namespaces -o wide

每天打卡5分钟,学会k8s 第四章集群架构_第4张图片

k8s的系统组件被放到了kube-system namespace中。这里有一个kube组件,它为cluster提供了dns服务。这个服务在k8s初始化的时候作为附加服务安装

kubelet是唯一没有以容器形式运行的k8s组件,它在ubuntu中通过systemd服务中。你可以使用进行查看服务信息

systemctl status kubelet

用例子把他们串起来

以下所有的命令都是第一章有说到

kubectl run httpd-app --image=httpd --replicas=2

每天打卡5分钟,学会k8s 第四章集群架构_第5张图片

k8s部署了deployment httpd-app,有两个副本pod,分别运行在k8s-node1和k8s-node2

每天打卡5分钟,学会k8s 第四章集群架构_第6张图片

他们运作的步骤是这样的

  1. kubectl发送部署请求到API Server
  2. API Server通知Controller Mananger创建一个deployment pod
  3. Scheduler执行调度任务、将两个pod分别分发到两个集群节点上
  4. 收到信息的节点,会自己创建并运行pod,应用的配置和当前运行状态信息保存在etcd中,执行kubectl get pod时API Server会从etcd中读取这些数据,flannel会为每个pod进行分配ip。

你可能感兴趣的:(每天打卡5分钟,学会k8s 第四章集群架构)