我不确定 CNI 插件和 Kubernetes 中的 Kube-proxy 有什么区别。根据我从文档中得到的信息,我得出以下结论:
Kube-proxy 负责与主节点通信和路由。
CNI 通过为 pod 和服务分配 IP 地址来提供连接,并通过其路由守护程序提供可达性。
路由似乎是两者之间的重叠功能,是真的吗?
亲切的问候,查尔斯
我不确定 CNI 插件和 Kubernetes 中的 Kube-proxy 有什么区别。根据我从文档中得到的信息,我得出以下结论:
Kube-proxy 负责与主节点通信和路由。
CNI 通过为 pod 和服务分配 IP 地址来提供连接,并通过其路由守护程序提供可达性。
路由似乎是两者之间的重叠功能,是真的吗?
亲切的问候,查尔斯
覆盖网络
Kubernetes 假设每个 pod 都有一个 IP 地址,并且您可以使用该 IP 地址与该 pod 内的服务进行通信。当我说“覆盖网络”时,这就是我的意思(“允许您通过 IP 地址引用 pod 的系统”)。
所有其他 Kubernetes 网络的东西都依赖于正常工作的覆盖网络。
有很多覆盖网络后端(印花布、法兰绒、编织),而且情况非常混乱。但就我而言,覆盖网络有两个职责:
KUBE-代理
只是为了了解 kube-proxy,以下是 Kubernetes 服务的工作原理!服务是 Pod 的集合,每个 Pod 都有自己的 IP 地址(如 10.1.0.3、10.2.3.5、10.3.5.6)
因此,当您向 my-svc.my-namespace.svc.cluster.local 发出请求时,它会解析为 10.23.1.2,然后本地主机上的 iptables 规则(由 kube-proxy 生成)将其重定向到 10.1 之一。 0.3 或 10.2.3.5 或 10.3.5.6 随机。
简而言之,overlay networks
定义可用于通信 Kubernetes 各个组件的底层网络。Whilekube-proxy
是一个生成 IP 表魔法的工具,它可以让你连接到 kubernetes 中的任何 pod(使用服务),无论该 pod 存在于哪个节点上。
此答案的部分内容来自此博客:
https://jvns.ca/blog/2017/10/10/operating-a-kubernetes-network/
希望这能让您简要了解 Kubernetes 网络。
kubernetes中有两种IP:ClusterIP和Pod IP。
CNI 关心 Pod IP。
CNI Plugin 专注于构建一个覆盖网络,没有它,Pods 将无法相互通信。CNI 插件的任务是在 Pod 调度时为其分配 Pod IP,并为该 IP 构建一个虚拟设备,并使该 IP 可从集群的每个节点访问。
在 Calico 中,这是通过 N 条主机路由(N=caliveth 设备的数量)和 tun0 上的 M 条直接路由(M=K8s 集群节点的数量)来实现的。
$ 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
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
是集群中的一个节点。你可以想象,如果你有一个 TCP 请求10.244.1.141
,它将10.130.29.81
按照第 7 条规则发送到。在 上10.130.29.81
,会有这样的路由规则:
10.244.1.141 0.0.0.0 255.255.255.255 UH 0 0 0 cali4eac25ec62b
这最终会将请求发送到正确的 Pod。
我不确定为什么守护进程是必要的,我猜守护进程是为了防止它创建的路由规则被手动删除。
kube-proxy 的工作相当简单,它只是将请求从 Cluster IP 重定向到 Pod IP。
kube-proxy 有两种模式,IPVS
和iptables
. 如果您的 kube-proxy 正在运行IPVS
模式,您可以通过在集群中的任何节点上运行以下命令来查看 kube-proxy 创建的重定向规则:
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 IP 的真实服务器:10.244.0.137
和10.244.0.138
。
这条规则是 kube-proxy 要创建的,也是 kube-proxy 创建的。
PSiptables
模式几乎一样,只是iptables规则看起来很难看。我不想把它贴在这里。:p
我的 2 美分,如果不准确,请纠正我
Kube-proxy 控制 K8s 网络通信,网络基于 CNI 插件。
CNI 插件实现 CNI
CNI 是用于简化网络通信的覆盖网络