kubernetes cluster由Master 和Node节点组成,节点上运行着若干个Kubernetes服务。
Master节点上运行着的Daemon服务包括kube-apiserver、kube-scheduler、kube-controller-manager、etcd和pod网络(flannel)
API Server提供 HTTP/HTTPS RESTful API,即Kubernetes API。API Server是Kubernetes Cluster的前端接口,各种客户端工具(CLI或UI)以及Kubernetes其他组件可以通过它管理Cluster的各种资源。
Scheduler 负责决定将Pod放在哪个Node上运行。Scheduler在调度时会充分考虑Cluster的拓扑结构,当前各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。
Controller Manager 负责管理Cluster各种资源,保证资源处于预期的状态。Controller Manager有多种controller组成,包括replication controller,endpoints controller,namespace controller,serviceaccounts controller等。
etcd数据库负责保存Kuberneter Cluster的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速地通知Kubernetes相关组件。
Pod要能够在集群的多个节点之间进行通信,必须部署Pod网络,flannel是其中一个可选方案。
Node节点是Pod运行的地方,Kubernetes支持Docker、rkt等容器Runtime。Node上运行的kubernetes组件包括kubectl、kube-proxy和Pod网络。
kubelet是Node的agent,当Scheduler确定在某个Node上运行Pod后,会将Pod的具体配置信息发送给该节点的kubelete,kubelete根据这些信息创建和运行容器,并向Master报告运行状态。
service在逻辑上代表了后端的多个pod,外界通过service访问Pod。service接收到的请求是如何转发到Pod的呢?这就是kube-proxy要完成的工作。如果有多个副本,也起到load balance的作用。
Pod要能够在集群的多个节点之间进行通信,必须部署Pod网络,flannel是其中一个可选方案。
这里的Master节点也可以作为Node节点,在上面运行应用,所以Master节点上也有kubelet和kube-proxy。
几乎所有的Kubernetes组件本身也是运行在Pod里:
root@k8s-master:~# kubectl get pod -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-fb8b8dccf-fnlxl 1/1 Running 0 59m 10.244.0.2 k8s-master
kube-system coredns-fb8b8dccf-vb7jj 1/1 Running 0 59m 10.244.0.3 k8s-master
kube-system etcd-k8s-master 1/1 Running 0 58m 192.168.24.136 k8s-master
kube-system kube-apiserver-k8s-master 1/1 Running 0 58m 192.168.24.136 k8s-master
kube-system kube-controller-manager-k8s-master 1/1 Running 0 59m 192.168.24.136 k8s-master
kube-system kube-flannel-ds-amd64-cpjnd 1/1 Running 0 43m 192.168.24.136 k8s-master
kube-system kube-flannel-ds-amd64-kt45p 1/1 Running 0 39m 192.168.24.137 k8s-node1
kube-system kube-proxy-5fdss 1/1 Running 0 59m 192.168.24.136 k8s-master
kube-system kube-proxy-vkq2p 1/1 Running 0 39m 192.168.24.137 k8s-node1
kube-system kube-scheduler-k8s-master 1/1 Running 0 59m 192.168.24.136 k8s-master
root@k8s-master:~#
系统组件都放在kube-system namespace中。这里有一个coredns组件,它为Cluster提供DNS服务。
kubelet是唯一没有一容器形式运行的kubernetes组件,它在Ubuntu中通过Systemd服务运行。
root@k8s-master:~# systemctl status kubelet.service
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: active (running) since Sun 2019-06-09 19:23:55 PDT; 1h 5min ago
Docs: https://kubernetes.io/docs/home/
Main PID: 47268 (kubelet)
Tasks: 18
Memory: 59.3M
CPU: 1min 41.929s
CGroup: /system.slice/kubelet.service
└─47268 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-conta
...
为了更好的理解Kubernetes架构,我们部署一个应用来演示各个组件之间是如何写作的。
root@k8s-master:~# kubectl run httpd-app --image=httpd --replicas=2
deployment.apps/httpd-app created
root@k8s-master:~# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
httpd-app 2/2 2 2 48s
root@k8s-master:~#
root@k8s-master:~# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
httpd-app-6df58645c6-97td2 1/1 Running 0 58s 10.244.1.3 k8s-node1
httpd-app-6df58645c6-9ldpd 1/1 Running 0 58s 10.244.1.4 k8s-node2
root@k8s-master:~#
注意:
kubectl get pod
时API Server 会从etcd中读取这些数据。