Dual Stack

Dual Stack

IPv6

Goals

  • 支持 Pod 之间的 IPv4 或 IPv6 通信

  • 支持 Pod 使用 IPv4 或者 IPv6 访问集群外部

  • Ingress Controller 支持 IPv4 或 IPv6 的外部访问

  • 为 ClusterIP,NodePort,ExternalIP 类型的 Service 提供双栈支持

Non-Goals

  • IPv4 与 IPv6 之间的通信不在考虑范围之内(Ingress Controller 或许可以将流量负载均衡至同一个 EndPoint 的 IPv4 或 IPv6 地址)

Behavior

Service

  • Service Cluster IP Range 配置 --service-cluster-ip-range=<IPv4 or IPv6 CIDR>,<IPv4 or IPv6 CIDR>

  • Service .spec.iPFamilyPolicy

    • SingleStack: 作为默认值。从第一个 CIDR 中分配 IP。

    • PreferDualStack: 双栈集群上为双栈 iPFamilies,行为与 RequireDualStack 一致。单栈集群上为单栈 iPFamilies,行为与 SingleStack 一致。

    • RequireDualStack: 给 Service ClusterIPs 分配 IPv4 地址和 IPv6 地址,与 iPFamilies 第一个元素对应的地址作为 ClusterIP。需要集群支持双栈,否则报错。

  • Service .spec.iPFamilies

    • ["IPv4"]

    • ["IPv6"]

    • ["IPv4","IPv6"] (dual stack)

    • ["IPv6","IPv4"] (dual stack)

  • 如果 Service Spec 里面没有指定 IP family,就从第一个 CIDR 中分配 IP。

  • Service 一旦创建之后就不可以更改 iPFamilies,因为对于已存在的 Service,不允许更改 ClusterIP。

Endpoint

  • Endpoint 的地址族和 Service 的第一个地址族相同,例如一个 ClusterIP 属于 IPv6 的 Service 只会有 IPv6 的 Endpoint。

  • EndpointSlices 字段 addressType 表明了所属地址族,IPv6 或者 IPv4。kube-proxy 根据 EndpointSlices 工作。

DNS

CoreDNS 会读取 EndpointSlices,为 IPv4 产生 A 记录,为 IPv6 产生 AAAA 记录。

对于单栈的服务,DNS 运行方式和以往相同。对于双栈服务,默认返回 Service 的 IPv4 地址和 IPv6 地址。指定 A 记录类型时,返回 IPv4 地址;指定 AAAA 记录类型时,返回 IPv6 地址。

Pod 的 /etc/resolv.conf 中域名服务器地址取决于集群 Service 的第一个 CIDR 段的地址族。

对于无头服务,CoreDNS 会同时返回 Pod 的 IPv4 地址和 IPv6 地址。

环境搭建

kubeadm 方式

control plane

  • kubeadm init --config=kubeadm-config.yaml

worker node

  • kubeadm join --config=kubeadm-config.yaml

网络插件

  • 网络插件以 Calico 为例

  • 修改 ConfigMap calico-config

  • 容器 calico-node 环境变量加入

二进制方式

Kubernetes 开启 DualStack feature gate

在kubernetes中,双栈 feature gate 特性是在 1.15 成为 Alpha (默认关闭,可使用 --feature-gates=IPv6DualStack=true 开启)。

在 1.20,该特性由 Alpha 变为 Beta,意味着该特性已经稳定,默认开启,但可手动关闭, 可见 详情arrow-up-right

  • 如果你的kubernetes版本 < 1.15,则无法使用双栈特性。

  • 如果你的kubernetes版本在 [1.15,1.20] 之间,则需要通过 --feature-gates=IPv6DualStack=true 开启。

  • 如果你的kubernetes版本 > 1.20, 无需额外操作,默认开启。

DualStack 双栈环境搭建

宿主机配置 IPv6,以 CentOS 为例(每个节点都需要操作)

  1. 加载 ipv6 内核模块:

  1. 启用 ipv6 网络:

  1. sysctl 参数启用 ipv6:

  1. 加载IPv6内核模块:

  1. 重启网络服务:

  1. 配置IPv6地址:

  1. 宿主机访问 Service 需要配置默认路由

Kubernetes 配置双栈

  1. kube-apiserver:

  1. kube-controller-manager:

  1. kube-proxy:

  1. kubelet:

  1. 重启各个组件:

安装网络插件(calico为例)

  1. 下载calico部署文件: curl https://docs.projectcalico.org/manifests/calico.yaml -O

  2. 修改配置:

  1. 部署calico: kubectl apply -f calico.yaml

验证

  1. 创建 Deployment,查看是否绑定 IPv6 地址

  1. Pod 已分配了 IPv6 地址,创建 Service:

  1. 查看service

Last updated