使用 kubeadm 支持双协议栈

特性状态: Kubernetes v1.23 [stable]

你的集群包含双协议栈组网支持, 这意味着集群网络允许你在两种地址族间任选其一。在集群中,控制面可以为同一个 Pod 或者 Service 同时赋予 IPv4 和 IPv6 地址。

准备开始

你需要已经遵从安装 kubeadm 中所给的步骤安装了 kubeadm 工具。

针对你要作为节点使用的每台服务器, 确保其允许 IPv6 转发。在 Linux 节点上,你可以通过以 root 用户在每台服务器上运行 sysctl -w net.ipv6.conf.all.forwarding=1 来完成设置。

你需要一个可以使用的 IPv4 和 IPv6 地址范围。集群操作人员通常为 IPv4 使用 私有地址范围。对于 IPv6,集群操作人员通常会基于分配给该操作人员的地址范围, 从 2000::/3 中选择一个全局的单播地址块。你不需要将集群的 IP 地址范围路由 到公众互联网。

说明:

如果你在使用 kubeadm upgrade 命令升级现有的集群,kubeadm 不允许更改 Pod 的 IP 地址范围(“集群 CIDR”),也不允许更改集群的服务地址范围(“Service CIDR”)。

创建双协议栈集群

要使用 kubeadm init 创建一个双协议栈集群,你可以传递与下面的例子类似的命令行参数:

  1. # 这里的地址范围仅作示例使用
  2. kubeadm init --pod-network-cidr=10.244.0.0/16,2001:db8:42:0::/56 --service-cidr=10.96.0.0/16,2001:db8:42:1::/112

为了更便于理解,参看下面的名为 kubeadm-config.yaml 的 kubeadm 配置文件, 该文件用于双协议栈控制面的主控制节点。

  1. ---
  2. apiVersion: kubeadm.k8s.io/v1beta3
  3. kind: ClusterConfiguration
  4. networking:
  5. podSubnet: 10.244.0.0/16,2001:db8:42:0::/56
  6. serviceSubnet: 10.96.0.0/16,2001:db8:42:1::/112
  7. ---
  8. apiVersion: kubeadm.k8s.io/v1beta3
  9. kind: InitConfiguration
  10. localAPIEndpoint:
  11. advertiseAddress: "10.100.0.1"
  12. bindPort: 6443
  13. nodeRegistration:
  14. kubeletExtraArgs:
  15. node-ip: 10.100.0.2,fd00:1:2:3::2

InitConfiguration 中的 advertiseAddress 给出 API 服务器将公告自身要监听的 IP 地址。advertiseAddress 的取值与 kubeadm init 的标志 --apiserver-advertise-address 的取值相同。

运行 kubeadm 来实例化双协议栈控制面节点:

  1. kubeadm init --config=kubeadm-config.yaml

kube-controller-manager 标志 --node-cidr-mask-size-ipv4|--node-cidr-mask-size-ipv6 是使用默认值来设置的。参见配置 IPv4/IPv6 双协议栈

说明:

标志 --apiserver-advertise-address 不支持双协议栈。

向双协议栈集群添加节点

在添加节点之前,请确保该节点具有 IPv6 可路由的网络接口并且启用了 IPv6 转发。

下面的名为 kubeadm-config.yaml 的 kubeadm 配置文件 示例用于向集群中添加工作节点。

  1. apiVersion: kubeadm.k8s.io/v1beta3
  2. kind: JoinConfiguration
  3. discovery:
  4. bootstrapToken:
  5. apiServerEndpoint: 10.100.0.1:6443
  6. token: "clvldh.vjjwg16ucnhp94qr"
  7. caCertHashes:
  8. - "sha256:a4863cde706cfc580a439f842cc65d5ef112b7b2be31628513a9881cf0d9fe0e"
  9. # 请更改上面的认证信息,使之与你的集群中实际使用的令牌和 CA 证书匹配
  10. nodeRegistration:
  11. kubeletExtraArgs:
  12. node-ip: 10.100.0.3,fd00:1:2:3::3

下面的名为 kubeadm-config.yaml 的 kubeadm 配置文件 示例用于向集群中添加另一个控制面节点。

  1. apiVersion: kubeadm.k8s.io/v1beta3
  2. kind: JoinConfiguration
  3. controlPlane:
  4. localAPIEndpoint:
  5. advertiseAddress: "10.100.0.2"
  6. bindPort: 6443
  7. discovery:
  8. bootstrapToken:
  9. apiServerEndpoint: 10.100.0.1:6443
  10. token: "clvldh.vjjwg16ucnhp94qr"
  11. caCertHashes:
  12. - "sha256:a4863cde706cfc580a439f842cc65d5ef112b7b2be31628513a9881cf0d9fe0e"
  13. # 请更改上面的认证信息,使之与你的集群中实际使用的令牌和 CA 证书匹配
  14. nodeRegistration:
  15. kubeletExtraArgs:
  16. node-ip: 10.100.0.4,fd00:1:2:3::4

JoinConfiguration.controlPlane 中的 advertiseAddress 设定 API 服务器将公告自身要监听的 IP 地址。advertiseAddress 的取值与 kubeadm join 的标志 --apiserver-advertise-address 的取值相同。

  1. kubeadm join --config=kubeadm-config.yaml

创建单协议栈集群

说明:

双协议栈支持并不意味着你需要使用双协议栈来寻址。 你可以部署一个启用了双协议栈联网特性的单协议栈集群。

为了更便于理解,参看下面的名为 kubeadm-config.yaml 的 kubeadm 配置文件示例, 该文件用于单协议栈控制面节点。

  1. apiVersion: kubeadm.k8s.io/v1beta3
  2. kind: ClusterConfiguration
  3. networking:
  4. podSubnet: 10.244.0.0/16
  5. serviceSubnet: 10.96.0.0/16

接下来