容器网络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/bash date set -v # 1.prep nocNI env cat <<EOF |kind create cluster --name=cilium-dual-stack --image=kindest/node:v1.23.4 --config=- kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 networking: disableDefaultCNI: true #kind 默认使用rancher cni,我们不需要该cni ipFamily: dual nodes: - role: control-plane - role: worker - role: worker EOF # 2. remove taints controller_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 cni helm repo add cilium https://helm.cilium.io > /dev/null 2>&1 helm 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 tools for 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-proxyset ipv6.enabled=true
ipv4是默认开启的,ipv6需要手动开启set tunnel=vxlan
vxlan模式下,安装更简单
部署demo应用
apiVersion: apps/v1 kind: Deployment metadata: name: app labels: app: app spec: replicas: 2 selector: matchLabels: app: app template: metadata: labels: app: app spec: containers: - name: nettool image: burlyluo/nettool securityContext: privileged: true --- apiVersion: v1 kind: Service metadata: name: app spec: 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 地址的解析进行验证:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
新一代“垫图”神器,IP-Adapter的完整应用解读
导读 不用训练lora,一张图就能实现风格迁移,还支持多图多特征提取,同时强大的拓展能力还可接入动态prompt矩阵、controlnet等等,这就是IP-Adapter,一种全新的“垫图”方式,让你的AIGC之旅更加高效轻松。 都是“垫图”,谁能还原你心中的图 “垫图”这个概念大家肯定都不陌生,此前当无法准确用prompt描述心中那副图时,最简单的办法就是找一张近似的,然后img2img流程启动,一切搞定。 可img2img简单的同时,也有它绕不过去的局限性,比如对prompt的还原度不足、生成画面多样性弱,特别是当需要加入controlnet来进行多层控制时,参考图、模型、controlnet的搭配就需要精心挑选,不然出图效果常常让人当场裂开… 但现在,我们有了新的“垫图”神器——IP-Adapter,在解读它之前,先来直观的感受一下它的效果。 效果可以说相当炸,那IP-Adapter就是终极答案了么?它的泛化性如何?兼容性是否足够?对prompt支持怎么样?当真的要接入现实工作中它还有什么拓展的能力呢?让我们一一来看。 IP-Adapter的核心优势,只画你关心...
- 下一篇
【算法总结]】十大排序算法
[算法总结] 十大排序算法 简介: 本文首发于我的个人博客:尾尾部落排序算法是最经典的算法知识。因为其实现代码短,应该广,在面试中经常会问到排序算法及其相关的问题。一般在面试中最常考的是快速排序和归并排序等基本的排序算法,并且经常要求现场手写基本的排序算法。 本文首发于我的个人博客:JavaGPT 排序算法是最经典的算法知识。因为其实现代码短,应该广,在面试中经常会问到排序算法及其相关的问题。一般在面试中最常考的是快速排序和归并排序等基本的排序算法,并且经常要求现场手写基本的排序算法。如果这些问题回答不好,估计面试就凉凉了。所以熟练掌握排序算法思想及其特点并能够熟练地手写代码至关重要。 下面介绍几种常见的排序算法:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序的思想,其代码均采用Java实现。 1. 冒泡排序 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6