k8s —— 架構 (轉發)
master節點
k8s的叢集由master和node組成,節點上執行著若干k8s服務。
master節點之上執行著的後臺服務有kube-apiserver 、kube-scheduler、kube-controller-manager、etcd和pod網路。如下圖所示
1. API Server(kube-apiserver)
API Server是k8s的前端介面,各種客戶端工具以及k8s其他元件可以通過它管理叢集的各種資源。
2.Scheduler(kube-scheduler)
scheduer負責決定將pod放在哪個node上執行。另外scheduler在排程時會充分考慮叢集的架構,當前各個節點的負載,以及應用對高可用、效能、資料親和性的需求。
3.Controller Manager(kube-controller-manager)
負責管理叢集的各種資源,保證資源處於預期的狀態。
4.etcd
負責儲存k8s叢集的配置資訊和各種資源的狀態資訊,當資料發生變化時,etcd會快速的通知k8s相關元件。
5.pod網路
pod要能夠相互通訊,k8s叢集必須掌握pod網路,fannel是其中一個可選的方案。
node節點
node是pod執行的地方。node上執行的k8s元件有kublet、kube-proxy和pod網路(例如flannel),如下圖所示:
1.kubelet
是node的agent,當scheduler去確定在某個node上執行pod後,會將pod的具體配置資訊傳送給該節點的kubelet,kubelet會根據遮羞資訊建立和執行容器,並向master報告執行狀態。
2.kube-proxy
每個node都會執行kube-proxy服務,外界通過service訪問pod,kube-proxy負責將降訪問service的TCP/UDP資料流轉發到後端的容器。如果有多個副本,kube-proxy會實現負載均衡。
3.pod網路
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-