k8s支持ipv6

 

背景

虽然ipv6已经支持许多年了,但是仍然不普及。正好最近遇到了k8s需要开启ipv6支持的问题,记录一下解决方案。

环境

  • Kind环境不低于0.11
  • Kubernetes服务器环境不低于v1.23
  • Calico环境不低于3.24

做法

要支持ipv6,就需要自上而下全部支持。即:

  1. Cluster级别需要支持(我这边使用的是Kind)
  2. CNI需要支持(我这边使用的是Calico)
  3. Pod需要支持
  4. Service需要支持

系统设置

linux环境下:

sudo sysctl -w net.ipv4.conf.all.forwarding=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

mac:

sudo sysctl -w net.inet.ip.forwarding=1
sudo sysctl -w net.inet6.ip6.forwarding=1

Kind支持ipv6

Kind支持ipv6,只需要配置ipFamily即可,注意subnet要么别配,要么双栈都要配

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: worker
networking:
  # 支持ipv4和ipv6双栈
  ipFamily: dual
  apiServerAddress: 127.0.0.1
  # 因为我这边要使用Calico 就把Kind默认的给禁掉了
  disableDefaultCNI: true
  kubeProxyMode: "ipvs"

Calico支持ipv6

Calico支持ipv6,需要修改它的ConfigMap以及node的DaemonSet

kind: ConfigMap
apiVersion: v1
data:
  cni_network_config: |-
    {
      "cniVersion": "0.3.1",
      "plugins": [
        "type": "calico",
        "ipam": {
          "type": "calico-ipam",
          "assign_ipv4": "true",
          "assign_ipv6": "true"
        }
      ]
    }

---

kind: DaemonSet
apiVersion: apps/v1
spec:
  template:
    spec:
      containers:
        - name: calico-node
          env:
            - name: IP
              value: "autodetect"
            - name: IP6
              value: "autodetect"
            - name: FELIX_IPV6SUPPORT
              value: "true"

Service开启双栈

在上述配置完成后,pod其实已经有了双栈IP。为了让对应的Service也能使用双栈,需要进行如下配置

apiVersion: v1
kind: Service
spec:
  # 传递真实客户端ip
  externalTrafficPolicy: Local
  # 不会过于严格的双栈策略
  ipFamilyPolicy: PreferDualStack
  # 支持的协议栈类型 默认展示按排最前面的那个来
  ipFamilies: ["IPv4", "IPv6"]

参考