一、cluster ip
Cluster IP 是 Kubernetes 中 Service 的 IP 地址,它是一个虚拟 IP 地址,用于集群内的 Pod 相互通信。
例如:
- Cluster IP:2.2.2.2
- 负载的真实Pod IP:1.1.1.1
场景:
Pod A 的 IP 地址是 1.1.1.1,Pod B 的 IP 地址是 3.3.3.3。Pod B 要访问 Cluster IP 2.2.2.2。
流程:
- Pod B 发送一个请求到 Cluster IP 2.2.2.2。
- Kube-proxy 拦截了这个请求。
- iptables 将执行 NAT 规则,将 Cluster IP 2.2.2.2 转换为 Pod A 的 IP 地址 1.1.1.1。
- Kube-proxy 将请求转发到 Pod A。
- Pod A 处理请求,并返回响应。
- 响应通过 Kube-proxy 转发给 Pod B。
- iptables 将执行 NAT 规则,将 Pod A 的 IP 地址 1.1.1.1 转换回 Cluster IP 2.2.2.2。
报文:
- 去向:
- 发送者:Pod B
- 目的地:Cluster IP 2.2.2.2
- NAT 后:发送者:Pod B,目的地:Pod A
- 回向:
- 发送者:Pod A
- 目的地:Pod B
- 反转 NAT 后:发送者:Cluster IP 2.2.2.2,目的地:Pod B
总结:
Cluster IP 是 Kubernetes 中 Service 的 IP 地址,用于集群内的 Pod 相互通信。当 Pod 访问 Cluster IP 时,Kube-proxy 会拦截请求,并通过 NAT 规则将请求转发到后端 Pod。响应通过同样的过程返回给 Pod。
补充说明:
- 在本例中,Pod A 和 Pod B 都在同一个节点上。如果 Pod A 和 Pod B 在不同的节点上,Kube-proxy 还需要在节点之间进行负载均衡。
- Kube-proxy 还会维护一个连接池,以提高 Pod 之间的通信效率。
二、Node Port
Node Port 是k8s对外暴露服务的一种方式,通过访问节点保留的端口来访问k8s后端负载的pod.
例如:
client ip : 1.1.1.30
node1 ip : 2.2.2.30
pod a : 1.1.1.1
client 访问 node1的38888端口后面的服务:
报文: srt: 1.1.1.30 dest: 2.2.2.30:38888
node节点接到报文后:Kube-proxy 拦截并查看iptables规则将dest: 2.2.2.30:38888 nat 为真实负载的poda 1.1.1.1.此时报文为 srt: 1.1.1.30 dest: 1.1.1.1:443,
**此时报文被发送到真实的pod,但有个问题,poda会直接将数据包丢给client ip ,client 收到数据包不能处理,因为client无法访问真实的pod ip.
此时就需要在node1接收到数据包之后也将srt ip 转换:
nat前: srt: 1.1.1.30 (client ip ) dest: 2.2.2.30:38888 (node ip + 端口)
nat后: srt: 2.2.2.30 (node ip ) dest: 1.1.1.1:443 (真实的pod ip + 端口)
此时pod a接收到数据包就会把回包丢给node1 ,node 1接受到后执行反转nat :
发送回client到包为
nat前: srt: 1.1.1.1:443 (真实的pod ip ) dest: 2.2.2.30 (node ip )
nat后: srt: 2.2.2.30 (node ip ) dest: 1.1.1.30 (client ip )