k8s的集群由master和node组成,节点上运行着若干k8s服务。前端
master节点之上运行着的后台服务有kube-apiserver 、kube-scheduler、kube-controller-manager、etcd和pod网络。以下图所示node
API Server是k8s的前端接口,各类客户端工具以及k8s其余组件能够经过它管理集群的各类资源。bootstrap
scheduer负责决定将pod放在哪一个node上运行。另外scheduler在调度时会充分考虑集群的架构,当前各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。后端
负责管理集群的各类资源,保证资源处于预期的状态。api
负责保存k8s集群的配置信息和各类资源的状态信息,当数据发生变化时,etcd会快速的通知k8s相关组件。网络
pod要可以相互通讯,k8s集群必须掌握pod网络,fannel是其中一个可选的方案。架构
node是pod运行的地方。node上运行的k8s组件有kublet、kube-proxy和pod网络(例如flannel),以下图所示:负载均衡
是node的agent,当scheduler去肯定在某个node上运行pod后,会将pod的具体配置信息发送给该节点的kubelet,kubelet会根据遮羞信息建立和运行容器,并向master报告运行状态。ide
每一个node都会运行kube-proxy服务,外界经过service访问pod,kube-proxy负责将降访问service的TCP/UDP数据流转发到后端的容器。若是有多个副本,kube-proxy会实现负载均衡。工具
pod能可以互相通讯,k8s集群必须部署pod网络,flannel是其中一个能够选择的方案
为何 k8s-master 上也有 kubelet 和 kube-proxy 呢?
这是由于 Master 上也能够运行应用,即 Master 同时也是一个 Node。
几乎全部的 Kubernetes 组件自己也运行在 Pod 里,执行以下命令:
[root@ken ~]# kubectl get pod --all-namespaces -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system coredns-78d4cf999f-dbxpc 1/1 Running 0 4h40m 10.244.0.2 ken <none> <none> kube-system coredns-78d4cf999f-q9vq2 1/1 Running 0 4h40m 10.244.0.3 ken <none> <none> kube-system etcd-ken 1/1 Running 0 4h39m 172.20.10.2 ken <none> <none> kube-system kube-apiserver-ken 1/1 Running 0 4h39m 172.20.10.2 ken <none> <none> kube-system kube-controller-manager-ken 0/1 CrashLoopBackOff 23 4h39m 172.20.10.2 ken <none> <none> kube-system kube-flannel-ds-amd64-bq6jx 1/1 Running 0 4h4m 172.20.10.9 host2 <none> <none> kube-system kube-flannel-ds-amd64-fd8mv 1/1 Running 0 4h24m 172.20.10.2 ken <none> <none> kube-system kube-flannel-ds-amd64-ssqcl 1/1 Running 0 4h5m 172.20.10.7 host1 <none> <none> kube-system kube-proxy-7cnsr 1/1 Running 0 4h5m 172.20.10.7 host1 <none> <none> kube-system kube-proxy-gwmr2 1/1 Running 0 4h40m 172.20.10.2 ken <none> <none> kube-system kube-proxy-n6zxl 1/1 Running 0 4h4m 172.20.10.9 host2 <none> <none> kube-system kube-scheduler-ken 0/1 CrashLoopBackOff 21 4h39m 172.20.10.2 ken <none> <none>
Kubernetes 的系统组件都被放到kube-system namespace 中。这里有一个kube-dns 组件,它为 Cluster 提供 DNS 服务,咱们后面会讨论。kube-dns是在执行kubeadm init 时做为附加组件安装的。
kubelet 是惟一没有以容器形式运行的 Kubernetes 组件,它在系统中经过 Systemd 运行。
[root@ken ~]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/kubelet.service.d └─10-kubeadm.conf Active: active (running) since Tue 2019-01-29 10:39:16 CST; 4h 44min ago Docs: https://kubernetes.io/docs/ Main PID: 6350 (kubelet) Tasks: 35 Memory: 87.7M CGroup: /system.slice/kubelet.service └─6350 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kub... ...
部署httpd应用
[root@ken ~]# kubectl run httpd-ken --generator=run-pod/v1 --image=httpd --replicas=2 pod/httpd-ken1 created
等待一段时间,应用部署完成。
[root@ken ~]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE httpd-ken 2/2 2 2 20m
k8s 部署了k8s httpd-ken,有两个副本 Pod,分别运行在k8s-node1和k8s-node2。
[root@ken ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES httpd-ken-5c949b96f-9cd52 1/1 Running 0 3m50s 10.244.1.3 host1 <none> <none> httpd-ken-5c949b96f-twdsd 1/1 Running 0 3m50s 10.244.2.3 host2 <none> <none>
整个部署过程:
① kubectl 发送部署请求到 API Server。
② API Server 通知 Controller Manager 建立一个 deployment 资源。
③ Scheduler 执行调度任务,将两个副本 Pod 分发到 k8s-node1 和 k8s-node2。
④ k8s-node1 和 k8s-node2 上的 kubectl 在各自的节点上建立并运行 Pod。
补充两点:
应用的配置和当前状态信息保存在 etcd 中,执行kubectl get pod 时 API Server 会从 etcd 中读取这些数据。
flannel 会为每一个 Pod 都分配 IP。由于没有建立 service,目前 kube-proxy 还没参与进来。