容器网络 Cilium:DualStack 双栈特性分析
本文分享自华为云社区《容器网络Cilium入门系列之DualStack双栈特性分析》,作者: 可以交个朋友。
一 、 关于 IPV6/IPV4 双栈
目前很多公司开始将自己的业务由 ipv4 切换成 ipv6,或者 ipv4,ipv6 共存。
ipv4 ipv6 共存(DualStack)有两种方式:
一个网卡上有两个 IP 地址,一个是 ipv4,一个是 ipv6。标准实现方式。
两个同样功能的网卡接口,一个提供 ipv4,一个提供 ipv6。通过负载均衡机制,将对应地址的请求发送到对应的网卡。
目前 k8s 集群已经支持 ipv4/ipv6 双栈,从 1.21 的 alpha 版本到如今 1.23 的 stable 版本。
同样 cilium cni 也对双栈技术做了实现,是一个 inCluster 层面的实现,如果数据流量要进出集群,就需要平台级的实现。
二 、Cilium DualStack 双栈环境搭建
依旧是 kind 快速搭建 k8s 集群
其中关键配置有:
ipFamily: dual
创建集群需要为集群开启双栈配置set kubeProxyReplacement=disabled
双栈依赖 kube-proxyset ipv6.enabled=true
ipv4 是默认开启的,ipv6 需要手动开启set tunnel=vxlan
vxlan 模式下,安装更简单
部署 demo 应用
集群搭建成功:
确认 IPv4 IPv6 双栈启用成功
Pod:
service:
三 、Cilium DualStack 模式分析
IPv4 模式下分析 pod 内的路由规则
pod 出网需要经过 eth0 网卡,下一跳地址是10.244.1.3
,下一跳是宿主机上的 cilium_host 网卡
IPv6 模式下 pod 内的路由规则
ip -6 route show
它的下一跳所在的地址fd00:10:244:1::20f3
不一定在宿主机的命名空间里面,所在在主机上找不到对应的网卡接口
IPv6 模式下的 ping 测
pod-a IPv6 地址: fd00:10:244:1::89bc
pod-b IPv6 地址: fd00:10:244:2::3573
pod 内 eth0 网卡抓包分析数据包
源 Mac: f2:65:2b:03:4c:22
为源 pod 的 eth0 网卡的 mac 地址;
源
IPv6: fd00:10:244:1::89bc
为源 pod 的 IPv6 地址
目标 IPv6: fd00:10:244:2::3573
为目标 pod 的 IPv6 地址
目标 Mac: 8a:be:1f:9b:eb:9d
为源 pod 所在宿主机上的 lxc 网卡
所以即使在 pod 内查看 IPv6 的路由规则,找不到对应的下一跳位置,也不影响数据报文的封装。
类似于 calico 的 169.254.1.1,这个地址不一定要有,但是数据包往上面发的时候,只要有一个 hook 能劫持,并且让其他网卡回复对应的 mac 地址就行了。
这样在封装报文的时候,srcMac srcIP,dstMac,dstIP 都具备了,这样一个数据包才能完整的发送出去。
整个流程差不多就是 根据容器内 IPv6 的下一跳 抓包找到对应的 mac 地址,然后根据 mac 地址的来源做一个推理。
IPv6 的优点
一个数据包如果到达 IP 层才能感知可以丢包,但是 IPv6 在二层就能感知到,不是自己的包就可以丢掉。
提供了更多的 IP 地址,但是复杂性也增加了。
service 的双栈
fd00:10:96::94f8
为 IPv6 的 clusterIP; 10.96.247.62
为 IPv4 的 clusterIP
可以进入容器进行 service 的 IPv4 和 IPv6 地址的解析进行验证:
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/5a436e5a307528d7206175013】。文章转载请联系作者。
评论