K8S基礎組件
Master 節點
整個集羣的控制中樞
Kube-APIServer
集羣控制中樞,各個模塊之間的信息交互都需要經過Kube-APIServer,同時也是集羣管理,資源配置,集羣安全機制的入口
Controller-Manager
集羣的狀態管理器,保證Pod或其他資源達到期望值,需要和APIServer進行通信,在需要的時候創建、更新或刪除它所管理的資源
Scheduler
集羣的調度中心,根據指定的一系列條件,選擇一個或一批最佳的節點,部署Pod
ETCD
鍵值數據庫,保存一些集羣的信息,生產環境中建議部署三個或三個以上奇數個節點
Node 節點
worker/node節點
Kubelet
負責監聽和上報節點上Pod狀態,與master節點通信並管理節點上面的Pod
Kube-porxy
負責Pod之間的通信和負載均衡,將指定的流量分發到後端正確的機器上
[root@master01 ~]# netstat -lntp | grep kube-proxy
tcp 0 0 0.0.0.0:30929 0.0.0.0:* LISTEN 998/kube-proxy
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 998/kube-proxy
tcp6 0 0 :::10256 :::* LISTEN 998/kube-proxy
ipvs 和 iptables 區別
從k8s的1.8版本開始,kube-proxy引入了IPVS模式,IPVS模式與iptables同樣基於Netfilter,但是ipvs採用的hash表,iptables採用一條條的規則列表。iptables又是爲了防火牆設計的,集羣數量越多iptables規則就越多,而iptables規則是從上到下匹配,所以效率就越是低下。因此當service數量達到一定規模時,hash查表的速度優勢就會顯現出來,從而提高service的服務性能
ipvs 模式
在這種模式下,kube-proxy監聽API Server中service和endpoint的變化情況,調用netlink接口創建相應的ipvs規則,並定期將ipvs規則與Kubernetes服 Services和Endpoints同步。保證IPVS狀態。
當訪問Services時,IPVS將流量定向到後端pod之一。
[root@master01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 127.0.0.1:30929 rr
-> 172.18.71.5:8443 Masq 1 0 0
TCP 172.17.0.1:30929 rr
-> 172.18.71.5:8443 Masq 1 0 0
TCP 172.31.112.128:30929 rr
-> 172.18.71.5:8443 Masq 1 0 0
TCP 192.168.44.10:30929 rr
-> 172.18.71.5:8443 Masq 1 0 0
TCP 192.168.44.236:30929 rr
-> 172.18.71.5:8443 Masq 1 0 0
TCP 10.96.0.1:443 rr
-> 192.168.44.10:6443 Masq 1 0 0
-> 192.168.44.11:6443 Masq 1 0 0
-> 192.168.44.12:6443 Masq 1 0 0
TCP 10.96.0.10:53 rr
-> 172.29.55.5:53 Masq 1 0 0
TCP 10.96.0.10:9153 rr
-> 172.29.55.5:9153 Masq 1 0 0
TCP 10.96.223.156:8000 rr
-> 172.20.59.196:8000 Masq 1 0 0
TCP 10.107.33.199:443 rr
-> 172.18.71.5:8443 Masq 1 0 0
TCP 10.109.10.62:443 rr
-> 172.21.231.133:4443 Masq 1 2 0
UDP 10.96.0.10:53 rr
-> 172.29.55.5:53 Masq 1 0 0
[root@master01 ~]# netstat -lntp | grep kube-proxy
tcp 0 0 0.0.0.0:30929 0.0.0.0:* LISTEN 998/kube-proxy
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 998/kube-proxy
tcp6 0 0 :::10256 :::* LISTEN 998/kube-proxy
[root@master01 ~]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.96.223.156 <none> 8000/TCP 4d8h
kubernetes-dashboard NodePort 10.107.33.199 <none> 443:30929/TCP 4d8h
[root@master01 ~]# kubectl get po -n kubernetes-dashboard -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dashboard-metrics-scraper-7645f69d8c-rkntb 1/1 Running 3 4d8h 172.20.59.196 master02 <none> <none>
kubernetes-dashboard-78cb679857-sptx2 1/1 Running 5 4d8h 172.18.71.5 master03 <none> <none>
itables 模式
在這種模式下,kube-proxy監視API Server中service和endpoint的變化情況。對於每個service,它都生成相應的iptables規則,這些規則捕獲到service的clusterIP和port的流量,並將這些流量隨機重定向到service後端Pod。對於每個endpoint對象,它生成選擇後端Pod的iptables規則。
Pod
Calico
符合CNI標準的網絡插件,給每一個Pod生成一個唯一的IP地址,並把每個節點當作一個路由
[root@master01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.44.2 0.0.0.0 UG 0 0 0 ens33
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.71.0 192.168.44.12 255.255.255.192 UG 0 0 0 tunl0
172.20.59.192 192.168.44.11 255.255.255.192 UG 0 0 0 tunl0
172.21.231.128 192.168.44.14 255.255.255.192 UG 0 0 0 tunl0
172.29.55.0 192.168.44.13 255.255.255.192 UG 0 0 0 tunl0
172.31.112.128 0.0.0.0 255.255.255.192 U 0 0 0 *
192.168.44.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
172.21.231.128 192.168.44.14 255.255.255.192 UG 0 0 0 tunl0
[root@master01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.44.2 0.0.0.0 UG 0 0 0 ens33
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.71.0 192.168.44.12 255.255.255.192 UG 0 0 0 tunl0
172.20.59.192 192.168.44.11 255.255.255.192 UG 0 0 0 tunl0
172.21.231.128 192.168.44.14 255.255.255.192 UG 0 0 0 tunl0
172.29.55.0 192.168.44.13 255.255.255.192 UG 0 0 0 tunl0
172.31.112.128 0.0.0.0 255.255.255.192 U 0 0 0 *
192.168.44.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
172.21.231.128 192.168.44.14 255.255.255.192 UG 0 0 0 tunl0
node02 ip 192.168.44.14
CoreDNS
k8s 內部集羣service解析,將service名稱解析成IP地址,然後通過service的IP地址連接到對應的應用上。
[root@master01 ~]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 4d9h
metrics-server ClusterIP 10.109.10.62 <none> 443/TCP 4d9h
Metrics-Server
採集容器數據
[root@master01 ~]# kubectl top po -n kube-system
NAME CPU(cores) MEMORY(bytes)
calico-kube-controllers-5f6d4b864b-k45q5 3m 20Mi
calico-node-58hbg 15m 110Mi
calico-node-dlj65 16m 107Mi
calico-node-jqb6h 14m 107Mi
calico-node-r8fl5 15m 105Mi
calico-node-wv4vx 16m 105Mi
coredns-867d46bfc6-ljdjr 2m 11Mi
metrics-server-595f65d8d5-6k4wq 4m 16Mi
[root@master01 ~]# kubectl top node -n kube-system
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master01 111m 5% 953Mi 51%
master02 105m 5% 992Mi 53%
master03 110m 5% 1011Mi 54%
node01 56m 2% 538Mi 28%
node02 54m 2% 523Mi 28%