本文分享自华为云社区《容器网络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-proxy
  • set 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 地址的解析进行验证:

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

容器网络Cilium:DualStack双栈特性分析的更多相关文章

  1. Linux内核--网络栈实现分析(十一)--驱动程序层(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7555870 更多请查看专栏,地 ...

  2. Linux内核--网络栈实现分析(七)--数据包的传递过程(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7545855 更多请查看专栏,地 ...

  3. Linux内核--网络栈实现分析(二)--数据包的传递过程--转

    转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的”(上 ...

  4. 腾讯云TKE-基于 Cilium 统一混合云容器网络(下)

    前言 在 腾讯云TKE - 基于 Cilium 统一混合云容器网络(上) 中,我们介绍 TKE 混合云的跨平面网络互通方案和 TKE 混合云 Overlay 网络方案.公有云 TKE 集群添加第三方 ...

  5. kubernetes/k8s CNI分析-容器网络接口分析

    关联博客:kubernetes/k8s CSI分析-容器存储接口分析 kubernetes/k8s CRI分析-容器运行时接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展k ...

  6. 容器网络——从CNI到Calico

    从容器诞生开始,存储和网络这两个话题就一直为大家津津乐道.我们今天这个环境下讲网络这个问题,其实是因为容器对网络的需求,和传统物理.虚拟环境对网络环境需求是有差别的,主要面临以下两个问题: 过去Iaa ...

  7. 译<容器网络中OVS-DPDK的性能>

    译<容器网络中OVS-DPDK的性能> 本文来自对Performance of OVS-DPDK in Container Networks的翻译. 概要--网络功能虚拟化(Network ...

  8. 二进制安装Kubernetes(k8s) v1.26.1 IPv4/IPv6双栈 可脱离互联网

    二进制安装Kubernetes(k8s) v1.26.1 IPv4/IPv6双栈 可脱离互联网 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star ...

  9. 二进制安装Kubernetes(k8s) v1.26.0 IPv4/IPv6双栈

    二进制安装Kubernetes(k8s) v1.26.0 IPv4/IPv6双栈 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 ...

  10. 二进制安装k8s v1.25.4 IPv4/IPv6双栈

    二进制安装k8s v1.25.4 IPv4/IPv6双栈 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes( ...

随机推荐

  1. sublime运行php文件

    sublime 运行 php 文件 使用 sublime 打开一个php文件 然后 Tools -> Build System -> New Build System 将以上打开的文件内容 ...

  2. kubernates的集群安装-kubadm

    kubernates的集群安装-kubadm 环境准备工作(CentOS) 准备三台或以上的虚拟机 停用防火墙 sudo systemctl stop firewalld sudo systemctl ...

  3. 基于 Wiki.js 搭建知识库系统

    前言 本文介绍如何使用 Wiki.js 搭建知识库系统. Wiki.js 官网 安装 前提准备 Wiki.js 几乎可以在任何支持 Node.js 的系统上运行.它可以运行在 Linux .Windo ...

  4. 「codeforces - 1481F」AB Tree

    link. 理一下逻辑,主要讲一下我做题时的疑惑和其它题解没提到的细节. 首先容易看到,一个必然不劣的贪心策略是把尽量靠近根的层铺成同样的字符.也许会有疑惑,字符串是否本质不同的判定每个位置地位相等. ...

  5. C++类内存分布+ Studio工具

    书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承.虚函数存在的情况下. 工欲善其事,必先利其器,我们先用好Visual Stu ...

  6. OpenJDK17-JVM源码阅读-ZGC-并发标记

    1.ZGC简介 1.1 介绍 ZGC 是一款低延迟的垃圾回收器,是 Java 垃圾收集技术的最前沿,理解了 ZGC,那么便可以说理解了 java 最前沿的垃圾收集技术. 从 JDK11 中作为试验特性 ...

  7. 可视化-vscode安装pandas

    pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具.pandas提供了大量能使我们快速 ...

  8. CF1343C

    题目简化和分析: 给您一个序列,您要在其中选择若干个数使得: 相邻两数异号 长度最大,总和最大 我们可以牢牢抓住长度且总和最大,这一特性. 说明我们必须在每一个连续的同号的子串中被迫选择最大的,以满足 ...

  9. gson如何序列化子类

    需求 目前有一个需求,不同对象有一些公共属性,分别也有一些不同的属性.对方传过来的json字符串中,把这些对象组成了一个数组返回过来的.这样该如何反序列化呢? 举例 定义Person类.Student ...

  10. umich cv-4-1 卷积网络基本组成部分介绍

    这节课中介绍了卷积网络的基本组成部分(全连接层,激活函数,卷积层,池化层,标准化等),下节课讨论了卷积神经网络的发展历史以及几种经典结构是如何构建的 卷积网络组成部分 前言 卷积层 池化层 norma ...