Kubernetes 基础概念整理
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%