首页 > 其他分享 >容器网络Cilium:DualStack双栈特性分析

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

时间:2023-12-15 11:38:05浏览次数:30  
标签:set -- app 双栈 网卡 IPv6 DualStack Cilium

本文分享自华为云社区《容器网络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

集群搭建成功:

image-20230710142021073.png

确认IPv4 IPv6 双栈启用成功

Pod:

image-20230710142254444.png

image-20230710142726833.png

image-20230710193525436.png

service:

image-20230710142436797.png

三 、Cilium DualStack 模式分析

IPv4 模式下分析pod内的路由规则

image-20230710145552437.png

pod出网需要经过eth0网卡,下一跳地址是10.244.1.3,下一跳是宿主机上的cilium_host网卡

image-20230710150306114.png

IPv6 模式下pod内的路由规则

ip -6 route show

image-20230710190611493.png
它的下一跳所在的地址fd00:10:244:1::20f3 不一定在宿主机的命名空间里面,所在在主机上找不到对应的网卡接口

IPv6模式下的ping测

pod-a IPv6 地址: fd00:10:244:1::89bc

pod-b IPv6 地址: fd00:10:244:2::3573

image-20230710192115503.png

pod内eth0网卡抓包分析数据包

image-20230710192508635.png

源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网卡

image-20230710194219009.png

所以即使在pod内查看IPv6的路由规则,找不到对应的下一跳位置,也不影响数据报文的封装。

类似于calico的169.254.1.1,这个地址不一定要有,但是数据包往上面发的时候,只要有一个hook能劫持,并且让其他网卡回复对应的mac地址就行了。

这样在封装报文的时候,srcMac srcIP,dstMac,dstIP 都具备了,这样一个数据包才能完整的发送出去。

整个流程差不多就是 根据容器内IPv6的下一跳 抓包找到对应的mac地址,然后根据mac地址的来源做一个推理。

IPv6 的优点

一个数据包如果到达IP层才能感知可以丢包,但是IPv6 在二层就能感知到,不是自己的包就可以丢掉。

提供了更多的IP地址,但是复杂性也增加了。

image-20230710201514974.png

service的双栈

image-20230710203440376.png

fd00:10:96::94f8 为IPv6的clusterIP; 10.96.247.62 为IPv4的clusterIP

可以进入容器进行service 的IPv4和IPv6 地址的解析进行验证:

image-20230710204552391.png

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

 

标签:set,--,app,双栈,网卡,IPv6,DualStack,Cilium
From: https://www.cnblogs.com/huaweiyun/p/17903006.html

相关文章

  • 【双栈实现队列】Java——Stack类
    leetcode232.用栈实现队列题意:双栈实现队列;要求每个入队、出队操作均摊O(1)复杂度题解:用一个栈in维护入队元素,另一个栈out维护出队元素出队或取队头元素:首先判断栈out是否为空,如果为空,将栈in中的元素pop()到栈out中,那么栈out栈顶元素即为原队列队头元素。(米奇妙妙屋啊~)判断......
  • 双栈排序
    还是建议看看yxc的题解这是先考虑了一个栈的情况,再从一个栈的情况扩充到两个栈来说明一下他对性质的证明首先满足条件的二元组式肯定不能够被放在同一个栈里面的,那么如果我将原序列分成两个组,其中每个组中的任意二元组都不满足条件(注意\(k\)不一定要局限于分组之后的同一组,而是......
  • IPV6问题处理-双栈环境IPv6网络不通模拟测试
    1.1网络拓扑环境描述测试是在公司现有的环境下进行测试的,IPv4网络全通无故障,没有IPv6网络外网线路。主机是自己的电脑,支持双栈。1.3验证问题验证在双栈网络中,主机会优先请求DNS的AAAA记录,如果ipv6网络故障了,还是否会根据向DNS请求来的AAAA记录去访问网站,从而导致断网。设备配置2.1H......
  • 云原生周刊:CNCF 宣布 Cilium 毕业 | 2023.10.16
    开源项目推荐ReloaderReloader是一个Kubernetes控制器,用于监控ConfigMap和Secrets中的变化,并对Pod及其相关部署、StatefulSet、DaemonSet和DeploymentConfig进行滚动升级!SpegelSpegel在瑞典语中意为镜像,是一种无状态集群本地OCI注册镜像。Spegel使Kubernete......
  • Cilium系列-16-CiliumNetworkPolicy 实战演练
    系列文章Cilium系列文章前言今天我们进入Cilium安全相关主题,基于Cilium官方的《星球大战》Demo做详细的CiliumNetworkPolicy实战演练。场景您是帝国(Empire)的平台工程团队的一员,负责开发死星(DeathStar)API并将其部署到帝国银河Kubernetes服务(Imperial......
  • Cilium系列-15-7层网络CiliumNetworkPolicy简介
    系列文章Cilium系列文章前言今天我们进入Cilium安全相关主题,介绍CiliumNetworkPolicies相比于Kubernetes网络策略最大的不同:7层网络策略能力.CiliumNetworkPolicy7层能力CiliumNetworkPolicy与标准NetworkPolicy的最大区别之一是支持L7协议感知规则。在......
  • Cilium系列-15-7层网络CiliumNetworkPolicy简介
    系列文章Cilium系列文章前言今天我们进入Cilium安全相关主题,介绍CiliumNetworkPolicies相比于Kubernetes网络策略最大的不同:7层网络策略能力.CiliumNetworkPolicy7层能力CiliumNetworkPolicy与标准NetworkPolicy的最大区别之一是支持L7协议感知规则。......
  • Cilium系列-14-Cilium NetworkPolicy 简介
    系列文章Cilium系列文章前言今天我们进入Cilium安全相关主题,介绍Kubernetes网络策略以及CiliumNetworkPolicies额外支持的内容。网络策略(NetworkPolicy)的类型默认情况下,Kubernetes集群中的所有pod都可被其他pod和网络端点访问。网络策略允许用户定义Kuber......
  • Cilium系列-14-Cilium NetworkPolicy 简介
    系列文章Cilium系列文章前言今天我们进入Cilium安全相关主题,介绍Kubernetes网络策略以及CiliumNetworkPolicies额外支持的内容。网络策略(NetworkPolicy)的类型默认情况下,Kubernetes集群中的所有pod都可被其他pod和网络端点访问。网络策略允许用户定义Kube......
  • Cilium系列-13-启用XDP加速及Cilium性能调优总结
    系列文章Cilium系列文章前言将Kubernetes的CNI从其他组件切换为Cilium,已经可以有效地提升网络的性能.但是通过对Cilium不同模式的切换/功能的启用,可以进一步提升Cilium的网络性能.具体调优项包括不限于:启用本地路由(NativeRouting)完全替换KubeProxyI......