kubernetes cluster由master和node组成,节点上运行着若干kubernetes服务。
(1).master节点:
master节点是Kubernetes Cluster的大脑,运行着daemon服务:kube-apiserver,kube-scheduler,kube-controller-manager,etcd和pod网络(例如calico)
API Server(kube-apiserver)
API Server提供http/https resful api,即kubernetes api,api server是kubernetes cluster的前端接口,各种客户端工具(cli或者ui)
以及kubernetes其他组件可以通过它管理cluster的各种资源。
scheduler(kube-scheduler)
scheduler负责决定将pod放在哪个node上运行,scheduler在调度时会充分考虑cluster的拓扑结构,当前各个节点的负载,以及应用对高可用,性能,数据亲和性的需求。
controller manager(kube-controller-manager)
controller manager负责管理cluster各类资源,保证资源处于预期的状态,controller manager 由多种 controller组成,包括replication controller,endpoints controller,namespace controller, service accounts controller等
不同的controller管理不同的资源,例如replication controller管理deplayment,statefulset,daemonset的生命周期,namespace controller管理namespace资源
etcd
etcd负责保存kubernetes cluster的配置信息和各种资源的状态信息。当数据变化时,etcd会快速的通知kubernetes相关组件
pod网络
pod要能够相互通讯,kubernetes cluster必须部署pod网络,flaneel,calico是其中的可选方案。
(2).node
node是pod运行的地方,kubernetes支持docker,rkt等容器runtime。node上运行的kubernetes组件有kubelet,kubelet-proxy和pod网络(例如calico,flannel)
kubelet
kubelet是node的agent,当scheduler确定在某个node上运行pod后,会将pod的具体配置信息(image,volume等)发送给节点kubelet,kubelet根据这些信息创建和运行容器,并向master报告运行状态。
kube-proxy
service在逻辑上代表了后端的多个pod,外界通过service访问pod。service接收到的请求是如何转发到pod的呢?这就是kube-proxy要完成的工作?
每个node都会运行kube-proxy服务,它负责将访问service的tcp/udp数据流转发到后端容器,如果有多个副本,kube-proxy会实现负载均衡
pod网络
pod能够互相通讯,kubernetes cluster必须部署pod网络。
架构图如下:
(3).实例部署
部署应用说明各个组件之间如何协作。
执行命令:
kubectl run httpd-app --image=httpd --replicas=2
等待一段时间,应用部署完成。
Kubernetes 部署了 deployment httpd-app,有两个副本 Pod,分别运行在 k8s-node1 和 k8s-node2。
详细讨论整个部署过程。
① kubectl 发送部署请求到 API Server。
② API Server 通知 Controller Manager 创建一个 deployment 资源。
③ Scheduler 执行调度任务,将两个副本 Pod 分发到 k8s-node1 和 k8s-node2。
④ k8s-node1 和 k8s-node2 上的 kubectl 在各自的节点上创建并运行 Pod。
补充两点:
1. 应用的配置和当前状态信息保存在 etcd 中,执行 kubectl get pod 时 API Server 会从 etcd 中读取这些数据。
2. flannel 会为每个 Pod 都分配 IP。因为没有创建 service,目前 kube-proxy 还没参与进来。