kubernetes 从1.16版本开始支持 ipv4/ipv6 双栈,开启 ipv4/ipv6 后,集群pod都会分配ipv4和ipv6两个地址,service 会根据配置的 ipFamily 类型来确定分配的集群ip类型。而且从pod出集群的网络会同时走ipv4和ipv6接口。

预备环境

要支持ipv4/ipv6,需要满足一些必备的要求

  • kubernetes 版本 1.16 以上
  • 部署集群的云主机支持ipv4/ipv6
  • 网络插件需要支持 ipv4/ipv6
  • kube-proxy 需要运行在 ipvs 模式

开启ipv4/ipv6

创建集群时,如果要开启ipv6,则集群所在vpc必须开启ipv6,云主机也必须支持开启 ipv6网络,集群版本需要大于等于 v1.16

集群服务配置

  • kube-controller-manager

    • --feature-gates=IPv6DualStack=true
    • --cluster-cidr=<IPv4 CIDR>,<IPv6 CIDR> eg. --cluster-cidr=10.244.0.0/16,fc00::/24
    • --service-cluster-ip-range=<IPv4 CIDR>, <IPv6 CIDR>
    • --node-cidr-mask-size-ipv4=24
    • --node-cidr-mask-size-ipv6=64 defaults to /24 for IPv4 and /64 for IPv6
  • kubelet

    • --feature-gates=IPv6DualStack=true
  • kube-proxy

    • --proxy-mode=ipvs
    • --cluster-cidr=<IPv4 CIDR>,<IPv6 CIDR>
    • --feature-gates=IPv6DualStack=true

网络插件

Kubenet or Calico 已经支持 ipv6,flannel还没有支持(issue)。

Services

一个 service 只会分配一个ip,所在在开启ipv4/ipv6双网络栈的集群中,创建service时需要指定分配的ip类型, 配置 .spec.ipFamily 字段

  • ipv4: 将会给service分配ipv4的cluster ip
  • ipv6: 将会给service分配ipv6的cluster ip

负载均衡

要求外部LB支持ipv6,并可以根据服务.spec.ipFamily 字段来确定服务LB的类型。