在 Kubernetes 集群中启用 IPv6 双栈支持的完整实践

98 阅读3分钟

在 Kubernetes 集群中启用 IPv6 双栈支持的完整实践

作者:钝刀张三
时间:2025年11月
分类:Kubernetes、网络、IPv6
标签:Kubernetes IPv6 DualStack、Calico、kubelet、容器网络

前言

随着 IPv6 在数据中心和云原生环境中的逐步普及,Kubernetes 已经原生支持 IPv6 双栈网络模式(DualStack)。本文记录了我在生产环境中为 Kubernetes 集群开启 IPv6 双栈支持的完整实践过程,涵盖从主机系统配置到 kube 组件、Calico 网络插件以及验证步骤。


主机启用 IPv6 网络支持

启用 IPv6 网络

编辑全局网络配置文件:

vim /etc/sysconfig/network
NETWORKING_IPV6=yes

修改网卡配置(示例以 ens192 为例):

vi /etc/sysconfig/network-scripts/ifcfg-ens192

添加或修改以下参数:

IPV6INIT=yes
IPV6_AUTOCONF=no
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6ADDR=10:1:21::71/64
IPV6_DEFAULTGW=10:1:21::FFFF
DNS1=192.168.30.2

⚠️ 注意:请确保每台主机的 IPv6 地址不重复。

禁用 IPv6 的行需注释掉:

# IPV6_DISABLED=yes

配置系统 IPv6 参数

编辑内核参数:

vim /etc/sysctl.conf

增加以下内容:

net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.default.disable_ipv6=0
net.ipv6.conf.lo.disable_ipv6=0
net.ipv6.conf.all.forwarding=1

同时检查 rp_filter 参数(出口网关中必须为 0):

sysctl -a | grep rp_filter

若不为 0,请修改为:

net.ipv4.conf.all.rp_filter=0

使配置立即生效:

sysctl -p
systemctl restart network

等待 2-3 分钟后执行:

ip a

若未自动分配 IPv6,可手动添加。


Kubernetes 核心组件配置

1️⃣ kube-apiserver

编辑:

sudo vim /etc/kubernetes/manifests/kube-apiserver.yaml

添加参数:

- --feature-gates=IPv6DualStack=true
- --service-cluster-ip-range=10.68.0.0/16,fd00::/108

确保镜像使用私有仓库:

image: harbor地址:haror端口/paas_public/kube-system/kube-apiserver:v1.24.2

若修改后 API Server 无法启动:

  • 检查镜像是否能正常拉取;

  • 查看日志:

    journalctl -u kubelet | grep kube-apiserver
    
  • 必要时重启:

    sudo systemctl restart kubelet
    

2️⃣ kube-controller-manager

修改配置:

sudo vim /etc/kubernetes/manifests/kube-controller-manager.yaml

添加:

- --feature-gates=TTLAfterFinished=true,EphemeralContainers=true,IPv6DualStack=true
- --cluster-cidr=192.168.0.0/16,fc00::/48
- --service-cluster-ip-range=10.68.0.0/16,fd00::/108
- --node-cidr-mask-size-ipv4=16
- --node-cidr-mask-size-ipv6=64

同时更新镜像地址:

image: harbor地址:haror端口/paas_public/kube-system/kube-controller-manager:v1.24.2

3️⃣ kubelet

编辑节点配置:

vi /var/lib/kubelet/kubeadm-flags.env

添加 IPv6 地址:

KUBELET_KUBEADM_ARGS="--node-ip=10.1.12.175,10:1:12::175"

重启服务:

sudo systemctl daemon-reload
sudo systemctl restart kubelet

验证:

kubectl get nodes -o wide

节点应显示双栈 IP。


4️⃣ kube-proxy

启用 DualStack:

kubectl edit configmap kube-proxy -n kube-system

修改:

featureGates:
  IPv6DualStack: true
clusterCIDR: 172.20.0.0/16,fc00::/48

重启:

kubectl rollout restart daemonset kube-proxy -n kube-system

确保镜像来自私有仓库:

image: harbor地址:haror端口/paas_public/kube-system/kube-proxy:v1.27.2

Calico 网络插件启用双栈

双栈模式配置

修改 ConfigMap:

kubectl edit configmap cni-config -n calico-system

设置:

"assign_ipv6": "true"

关闭 operator:

kubectl scale deployment tigera-operator -n calico --replicas=0

编辑 calico-node:

kubectl edit daemonsets calico-node -n calico-system

添加环境变量:

- name: CALICO_IPV6POOL_CIDR
  value: fc00::/48
- name: FELIX_IPV6SUPPORT
  value: "true"
- name: IP6_AUTODETECTION_METHOD
  value: interface=eth.*|en.*|em.*

更新镜像:

image: harbor地址:haror端口/paas_public/kube-system/node:v3.25.0

仅 IPv6 模式配置

仅需修改:

kubectl edit configmap cni-config -n calico-system

设置:

"assign_ipv4": "false", "assign_ipv6": "true"

并在 calico-node 中删除 IPv4 相关配置。


测试 IPv6 Pod 与 Service

创建测试 Pod:

kubectl run test-pod --image=harbor地址:haror端口/library/busybox:1.28 -- sleep 3600

或使用以下双栈 Service 示例:

apiVersion: v1
kind: Service
metadata:
  name: php-apache
spec:
  ipFamilyPolicy: PreferDualStack
  ipFamilies:
    - IPv4
    - IPv6
  ports:
  - port: 80
  selector:
    run: php-apache

验证结果:

kubectl describe pod php-apache-xxxx
kubectl describe service php-apache

应看到 IPv4 与 IPv6 地址均已分配。


总结与经验

经验要点:

  1. 启用 IPv6 时务必同步修改 sysctl 与网卡配置;
  2. 所有 Kubernetes 组件镜像统一使用私有仓库;
  3. --feature-gates=IPv6DualStack=true 必须在 apiserver、controller-manager、kubelet、kube-proxy 中同时启用;
  4. Calico 需显式开启 IPv6 支持,否则 Pod 无法分配 IPv6 地址;
  5. 变更完配置后,请耐心等待 Pod 自动重启,或手动 rollout restart

至此,Kubernetes 集群的 IPv6 双栈支持已全部启用并验证成功。🚀