写点什么

容器网络 Cilium:DualStack 双栈特性分析

  • 2023-12-15
    广东
  • 本文字数:2234 字

    阅读完需:约 7 分钟

容器网络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 集群


#1-setup-env.sh#! /bin/bashdateset -v
# 1.prep nocNI envcat <<EOF |kind create cluster --name=cilium-dual-stack --image=kindest/node:v1.23.4 --config=-kind: ClusterapiVersion: kind.x-k8s.io/v1alpha4networking: disableDefaultCNI: true #kind 默认使用rancher cni,我们不需要该cni ipFamily: dualnodes: - role: control-plane - role: worker - role: worker
EOF
# 2. remove taintscontroller_node=`kubectl get nodes --no-headers -o custom-columns=NAME:.metadata.name |grep control-plane`kubectl taint nodes $controller_node node-role.kubernetes.io/master:NoSchedule-kubectl get nodes -owide
# 3. install cnihelm repo add cilium https://helm.cilium.io > /dev/null 2>&1helm repo update > /dev/null 2>&1
helm install cilium cilium/cilium --set k8sServiceHost=$controller_node --set k8sServicePort=6443 --version 1.13.0-rc5 \--namespace kube-system --set debug.enabled=true --set debug.verbose=datapath --set monitorAggregation=none \--set ipam.mode=kubernetes --set cluster.name=cilium-dual-stack --set tunnel=vxlan --set kubeProxyReplacement=disabled \--set ipv6.enabled=true
#4. install necessary toolsfor i in $(docker ps -a --format "table {{.Names}}" |grep cilium-dual-stack)do echo $i #docker cp ./bridge $i:/opt/cni/bin/ docker cp /usr/bin/ping $i:/usr/bin/ping docker exec -it $i bash -c "sed -i -e 's/jp.archive.ubuntu.com\|archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list" docker exec -it $i bash -c "apt-get -y update > /dev/null && apt-get -y install net-tools tcpdump lrzsz > /dev/null 2>&1"done
复制代码


其中关键配置有:


  • ipFamily: dual 创建集群需要为集群开启双栈配置

  • set kubeProxyReplacement=disabled 双栈依赖 kube-proxy

  • set ipv6.enabled=true ipv4 是默认开启的,ipv6 需要手动开启

  • set tunnel=vxlan vxlan 模式下,安装更简单


部署 demo 应用


apiVersion: apps/v1kind: Deploymentmetadata:  name: app  labels:    app: appspec:  replicas: 2  selector:    matchLabels:      app: app  template:    metadata:      labels:        app: app    spec:      containers:      - name: nettool        image: burlyluo/nettool        securityContext:          privileged: true
---apiVersion: v1kind: Servicemetadata: name: appspec: ipFamilyPolicy: PreferDualStack ipFamilies: - IPv6 - IPv4 type: ClusterIP selector: app: app ports: - name: app port: 8080 targetPort: 80
复制代码


集群搭建成功:



确认 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 地址的解析进行验证:



点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
容器网络Cilium:DualStack双栈特性分析_云原生_华为云开发者联盟_InfoQ写作社区