Kubernetes CNI 与 Kube-proxy
Kubernetes CNI vs Kube-proxy
我不确定 CNI 插件和 Kubernetes 中的 Kube-proxy 有什么区别。根据我从文档中得到的内容,我得出以下结论:
kube-proxy负责与master节点的通信和路由。
CNI 通过为 pods 和服务分配 IP 地址来提供连接性,并通过其路由守护程序提供可达性。
路由似乎是两者之间的重叠功能,是这样吗?
亲切的问候,
查尔斯
叠加网络
Kubernetes 假定每个 pod 都有一个 IP 地址,并且您可以使用该 IP 地址与该 pod 内的服务进行通信。当我说“覆盖网络”时,这就是我的意思(“允许您通过 IP 地址引用 pod 的系统”)。
所有其他 Kubernetes 网络都依赖于覆盖网络的正常工作。
有很多覆盖网络后端(calico、flannel、weave),情况相当混乱。但就我而言,覆盖网络有两个职责:
- 确保您的 pods 可以在集群外发送网络请求
- 保持节点到子网的稳定映射,并使用该映射更新集群中的每个节点。添加和删除节点时做正确的事情。
KUBE-PROXY
只是为了了解kube-proxy,下面是Kubernetes服务的工作原理!服务是 pods 的集合,每个服务都有自己的 IP 地址(如 10.1.0.3、10.2.3.5、10.3.5.6)
- 每个 Kubernetes 服务都有一个 IP 地址(例如 10.23.1.2)
- kube-dns 将 Kubernetes 服务 DNS 名称解析为 IP 地址(因此 my-svc.my-namespace.svc.cluster.local 可能映射到 10.23.1.2)
- kube-proxy 设置 iptables 规则,以便在它们之间进行随机负载平衡。
所以当你向 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 的各种组件进行通信的底层网络。虽然 kube-proxy
是一种生成 IP 表的工具,它可以让您连接到 kubernetes 中的任何 pod(使用服务),无论该 pod 存在于哪个节点上。
部分答案摘自此博客:
https://jvns.ca/blog/2017/10/10/operating-a-kubernetes-network/
希望这能让您简要了解 kubernetes 网络。
kubernetes中有两种IP:ClusterIP和Pod IP。
CNI
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
是集群中的一个节点。你可以想象,如果你有一个到 10.244.1.141
的 TCP 请求,它将按照第 7 条规则发送到 10.130.29.81
。而在10.130.29.81
上,会有这样一条路由规则:
10.244.1.141 0.0.0.0 255.255.255.255 UH 0 0 0 cali4eac25ec62b
这最终会将请求发送到正确的 Pod。
我不确定为什么守护进程是必需的,我猜守护进程是为了防止它创建的路由规则被手动删除。
kube-代理
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创建的。
P.S。 iptables
模式几乎一样,但是iptables规则看起来很难看。我不想在这里粘贴它。 :p
我的2美分,不准确请指正
kube-proxy控制K8s网络通信,网络基于CNI插件
CNI 插件实现 CNI
CNI是用于简化网络通信的overlay网络
我不确定 CNI 插件和 Kubernetes 中的 Kube-proxy 有什么区别。根据我从文档中得到的内容,我得出以下结论:
kube-proxy负责与master节点的通信和路由。
CNI 通过为 pods 和服务分配 IP 地址来提供连接性,并通过其路由守护程序提供可达性。
路由似乎是两者之间的重叠功能,是这样吗?
亲切的问候, 查尔斯
叠加网络
Kubernetes 假定每个 pod 都有一个 IP 地址,并且您可以使用该 IP 地址与该 pod 内的服务进行通信。当我说“覆盖网络”时,这就是我的意思(“允许您通过 IP 地址引用 pod 的系统”)。
所有其他 Kubernetes 网络都依赖于覆盖网络的正常工作。
有很多覆盖网络后端(calico、flannel、weave),情况相当混乱。但就我而言,覆盖网络有两个职责:
- 确保您的 pods 可以在集群外发送网络请求
- 保持节点到子网的稳定映射,并使用该映射更新集群中的每个节点。添加和删除节点时做正确的事情。
KUBE-PROXY
只是为了了解kube-proxy,下面是Kubernetes服务的工作原理!服务是 pods 的集合,每个服务都有自己的 IP 地址(如 10.1.0.3、10.2.3.5、10.3.5.6)
- 每个 Kubernetes 服务都有一个 IP 地址(例如 10.23.1.2)
- kube-dns 将 Kubernetes 服务 DNS 名称解析为 IP 地址(因此 my-svc.my-namespace.svc.cluster.local 可能映射到 10.23.1.2)
- kube-proxy 设置 iptables 规则,以便在它们之间进行随机负载平衡。
所以当你向 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 的各种组件进行通信的底层网络。虽然 kube-proxy
是一种生成 IP 表的工具,它可以让您连接到 kubernetes 中的任何 pod(使用服务),无论该 pod 存在于哪个节点上。
部分答案摘自此博客:
https://jvns.ca/blog/2017/10/10/operating-a-kubernetes-network/
希望这能让您简要了解 kubernetes 网络。
kubernetes中有两种IP:ClusterIP和Pod IP。
CNI
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
是集群中的一个节点。你可以想象,如果你有一个到 10.244.1.141
的 TCP 请求,它将按照第 7 条规则发送到 10.130.29.81
。而在10.130.29.81
上,会有这样一条路由规则:
10.244.1.141 0.0.0.0 255.255.255.255 UH 0 0 0 cali4eac25ec62b
这最终会将请求发送到正确的 Pod。
我不确定为什么守护进程是必需的,我猜守护进程是为了防止它创建的路由规则被手动删除。
kube-代理
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创建的。
P.S。 iptables
模式几乎一样,但是iptables规则看起来很难看。我不想在这里粘贴它。 :p
我的2美分,不准确请指正
kube-proxy控制K8s网络通信,网络基于CNI插件
CNI 插件实现 CNI
CNI是用于简化网络通信的overlay网络