今天讲的是kubernetes的架构简讲吧,kuberbetes cluster有Master和Node【slave】组成,节点上运行多个kubernetes服务。
Master 节点
Master是kubernetes cluster的大脑,运行着的Daemon服务包括kube-apiserver、kube-scheduler、kube-controller-manager、etcd和pod网络(例如flannel)。
- API Server(kube-apiserver)
这个提供了Rest API,也就是我们应用层所说的前端接口,各种客户端工具CLI/UI管理的资源的东西,如果你 需要进行二次开发的话,这个服务需要掌握。
- scheduler(kube-scheduler)
负责讲Pod放在那个Node上运行,也就是调度时会充分考虑cluster的拓扑结构,当前各个节点的负载,以及应用对高可用、数据亲和性的需求
- 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用来保存资状态信息和配置信息使用,自带的负载均衡里的服务发现也用到它。
- pod网络
这个比较重要了,因为docker是不能跨主机通信的。如果要跨主机通信,就必须自己手动开启port映射,如果你的容器过多,那你操作就很麻烦。flannel刚好就帮你解决了这个问题,当然还有其他的网络方案,这是flannel用的人多,资料多一点。
Node节点
所有的node是pod打工的地方,kubernetes支持docker、rkt等容器Runtime。Node上运行的组件有Kubelet、kube-proxy和Pod网络。
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。
下面我们就看看完整的结构图
从图中你会发现master也存在kubelet和kube-proxy,那是因为master也可以运行应用,如果你好奇的话可以去试试使用rancher,就算是单节点它也可以创建pod容器的。
我们要查看k8s上已经运行的pod可以用下面的命令,和你用docker ps一样频繁
kubectl get pod --all-namespaces -o wide
k8s的系统组件被放到了kube-system namespace中。这里有一个kube组件,它为cluster提供了dns服务。这个服务在k8s初始化的时候作为附加服务安装
kubelet是唯一没有以容器形式运行的k8s组件,它在ubuntu中通过systemd服务中。你可以使用进行查看服务信息
systemctl status kubelet
用例子把他们串起来
以下所有的命令都是第一章有说到
kubectl run httpd-app --image=httpd --replicas=2
k8s部署了deployment httpd-app,有两个副本pod,分别运行在k8s-node1和k8s-node2
他们运作的步骤是这样的
- kubectl发送部署请求到API Server
- API Server通知Controller Mananger创建一个deployment pod
- Scheduler执行调度任务、将两个pod分别分发到两个集群节点上
- 收到信息的节点,会自己创建并运行pod,应用的配置和当前运行状态信息保存在etcd中,执行kubectl get pod时API Server会从etcd中读取这些数据,flannel会为每个pod进行分配ip。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。