Dual Stack
Dual Stack
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.iPFamilyPolicySingleStack: 作为默认值。从第一个 CIDR 中分配 IP。PreferDualStack: 双栈集群上为双栈iPFamilies,行为与RequireDualStack一致。单栈集群上为单栈iPFamilies,行为与SingleStack一致。RequireDualStack: 给 ServiceClusterIPs分配 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,意味着该特性已经稳定,默认开启,但可手动关闭, 可见 详情 。

如果你的kubernetes版本 < 1.15,则无法使用双栈特性。
如果你的kubernetes版本在 [1.15,1.20] 之间,则需要通过 --feature-gates=IPv6DualStack=true 开启。
如果你的kubernetes版本 > 1.20, 无需额外操作,默认开启。
DualStack 双栈环境搭建
宿主机配置 IPv6,以 CentOS 为例(每个节点都需要操作)
加载 ipv6 内核模块:
启用 ipv6 网络:
sysctl 参数启用 ipv6:
加载IPv6内核模块:
重启网络服务:
配置IPv6地址:
宿主机访问 Service 需要配置默认路由
Kubernetes 配置双栈
kube-apiserver:
kube-controller-manager:
kube-proxy:
kubelet:
重启各个组件:
安装网络插件(calico为例)
下载calico部署文件:
curl https://docs.projectcalico.org/manifests/calico.yaml -O修改配置:
部署calico:
kubectl apply -f calico.yaml。
验证
创建 Deployment,查看是否绑定 IPv6 地址
Pod 已分配了 IPv6 地址,创建 Service:
查看service
Last updated