使用 kubeadm 支持双栈

特性状态: Kubernetes v1.23 [稳定]

你的 Kubernetes 集群包含双栈网络,这意味着集群网络允许你使用任一地址族。在集群中,控制平面可以为单个PodService分配一个 IPv4 地址和一个 IPv6 地址。

准备工作

你需要安装kubeadm 工具,按照安装 kubeadm 中的步骤操作。

对于要用作节点的每台服务器,请确保它允许 IPv6 转发。

启用 IPv6 包转发

检查是否启用了 IPv6 包转发

sysctl net.ipv6.conf.all.forwarding

如果输出是 net.ipv6.conf.all.forwarding = 1,则表示已启用。否则,则尚未启用。

手动启用 IPv6 包转发

# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee -a /etc/sysctl.d/k8s.conf
net.ipv6.conf.all.forwarding = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system

你需要有一个 IPv4 地址范围和一个 IPv6 地址范围供使用。集群运维人员通常为 IPv4 使用私有地址范围。对于 IPv6,集群运维人员通常从 2000::/3 中选择一个全局单播地址块,使用分配给运维人员的范围。你无需将集群的 IP 地址范围路由到公共互联网。

IP 地址分配的大小应适合你计划运行的 Pod 和 Service 的数量。

创建双栈集群

使用 kubeadm init 创建双栈集群时,你可以传递类似于以下示例的命令行参数

# These address ranges are examples
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 配置文件 kubeadm-config.yaml,用于配置主双栈控制平面节点。

---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
networking:
  podSubnet: 10.244.0.0/16,2001:db8:42:0::/56
  serviceSubnet: 10.96.0.0/16,2001:db8:42:1::/112
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: "10.100.0.1"
  bindPort: 6443
nodeRegistration:
  kubeletExtraArgs:
  - name: "node-ip"
    value: "10.100.0.2,fd00:1:2:3::2"

InitConfiguration 中的 advertiseAddress 指定 API Server 将广播其监听的 IP 地址。advertiseAddress 的值等于 kubeadm init--apiserver-advertise-address 标志。

运行 kubeadm 初始化双栈控制平面节点

kubeadm init --config=kubeadm-config.yaml

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

将节点加入双栈集群

在加入节点之前,请确保该节点具有可路由的 IPv6 网络接口并允许 IPv6 转发。

以下是用于将工作节点加入集群的 kubeadm 配置文件 kubeadm-config.yaml 示例。

apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
discovery:
  bootstrapToken:
    apiServerEndpoint: 10.100.0.1:6443
    token: "clvldh.vjjwg16ucnhp94qr"
    caCertHashes:
    - "sha256:a4863cde706cfc580a439f842cc65d5ef112b7b2be31628513a9881cf0d9fe0e"
    # change auth info above to match the actual token and CA certificate hash for your cluster
nodeRegistration:
  kubeletExtraArgs:
  - name: "node-ip"
    value: "10.100.0.2,fd00:1:2:3::3"

另外,这里提供一个示例 kubeadm 配置文件 kubeadm-config.yaml,用于将另一个控制平面节点加入集群。

apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
controlPlane:
  localAPIEndpoint:
    advertiseAddress: "10.100.0.2"
    bindPort: 6443
discovery:
  bootstrapToken:
    apiServerEndpoint: 10.100.0.1:6443
    token: "clvldh.vjjwg16ucnhp94qr"
    caCertHashes:
    - "sha256:a4863cde706cfc580a439f842cc65d5ef112b7b2be31628513a9881cf0d9fe0e"
    # change auth info above to match the actual token and CA certificate hash for your cluster
nodeRegistration:
  kubeletExtraArgs:
  - name: "node-ip"
    value: "10.100.0.2,fd00:1:2:3::4"

JoinConfiguration.controlPlane 中的 advertiseAddress 指定 API Server 将广播其监听的 IP 地址。advertiseAddress 的值等于 kubeadm join--apiserver-advertise-address 标志。

kubeadm join --config=kubeadm-config.yaml

创建单栈集群

为了更清楚地说明,这里提供一个示例 kubeadm 配置文件 kubeadm-config.yaml,用于配置单栈控制平面节点。

apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
networking:
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/16

接下来

最后修改于 2024 年 10 月 28 日太平洋标准时间下午 1:01:更新如何在重启后持久启用 ipv6 转发 (85e4a6c251)