CNI 和 kube-proxy 区别
CNI
分为overlay网络和underlay网络,目的是集群中的pod可以相互连通,CNI 关注 Pod ip, 在pod被调度到特定节点后,分配pod ip,同时创建虚拟设备,使集群的每个节点都能访问。Calico是其实现方式之一,
1
2
3
4
5
6
7
8
9
10
11
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.130.29.1 0.0.0.0 UG 100 0 0 ens32
10.130.29.0 0.0.0.0 255.255.255.0 U 100 0 0 ens32
10.244.0.0 0.0.0.0 255.255.255.0 U 0 0 0 *
10.244.0.137 0.0.0.0 255.255.255.255 UH 0 0 0 calid3c6b0469a6
10.244.0.138 0.0.0.0 255.255.255.255 UH 0 0 0 calidbc2311f514
10.244.0.140 0.0.0.0 255.255.255.255 UH 0 0 0 califb4eac25ec6
10.244.1.0 10.130.29.81 255.255.255.0 UG 0 0 0 tunl0 #7
10.244.2.0 10.130.29.82 255.255.255.0 UG 0 0 0 tunl0
如上 10.244.0.0/16
是 Pod IP CIDR , 10.130.29.81
集群中的节点,发送消息到 10.244.1.141
, 根据第七条路由规则,先经过10.130.29.81
在节点上,有规则:
1
10.244.1.141 0.0.0.0 255.255.255.255 UH 0 0 0 cali4eac25ec62b
发送消息到设备cali4eac25ec62b,到达对应的pod
kube-proxy
k8s中的pod,可能经常创建和销毁,ip也会随之变化,而service 对应的ClusterIP不会因为Pod状态改变而变,是个虚拟ip,存在于iptables或者ipvs生成路由规则中。
kube-proxy’s 主要是将 Cluster IP 重定向到 Pod IP, 起到负载均衡的作用。kube-proxy 两种模式IPVS
and iptables
. (user-namespace 弃用), 比如使用ipvs , ipvsadm 命令会出现如下重定向规则:
1
2
3
4
5
6
7
8
9
10
11
12
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.96.0.1:443 rr
-> 10.130.29.80:6443 Masq 1 6 0
-> 10.130.29.81:6443 Masq 1 1 0
-> 10.130.29.82:6443 Masq 1 0 0
TCP 10.96.0.10:53 rr
-> 10.244.0.137:53 Masq 1 0 0
-> 10.244.0.138:53 Masq 1 0 0
...
默认的CoreDNS Cluster IP 是10.96.0.10
,其背后对应两个pod, Pod IP为 10.244.0.137
and 10.244.0.138
.
上面显示的是rr负载策略,还有以下可以选择:
- rr: round-robin
- lc: least connection (smallest number of open connections)
- dh: destination hashing
- sh: source hashing
- sed: shortest expected delay
- nq: never queue
若想让客户端每次连接相同的pod, 而不是轮询的方式,可设置 service.spec.sessionAffinity 设置为
ClientIP,
其原理为在iptables添加一条recent记录,同时在原先的路由规则中添加-m:recent 表示使用这条记录;
DNS
CoreDNS
kubernetes 中的服务发现,使用自定义的域名格式定位到具体的pod或者service,
- Headless Service:无头服务,就是把 clusterIP 设置为 None 的,会被解析为指定 Pod 的 IP 列表,同样还可以通过
podname.servicename.namespace.svc.cluster.local
访问到具体的某一个 Pod。
Pod默认的域名解析器为kube-system中的coredns,具体地,查看某个pod下的resolv.conf文件,可以看到域名解析地址为10.96.0.10,其对应的就是coredns的clusterip
[root@rpc-75d9b7d7c9-2zzrx rpc-release]# cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
参考链接: