使用 kubeadm 支持双协议栈
Kubernetes v1.23 [stable]
你的集群包含双协议栈组网支持, 这意味着集群网络允许你在两种地址族间任选其一。在集群中,控制面可以为同一个 Pod 或者 Service 同时赋予 IPv4 和 IPv6 地址。
准备开始
你需要已经遵从安装 kubeadm 中所给的步骤安装了 kubeadm 工具。
针对你要作为节点使用的每台服务器, 确保其允许 IPv6 转发。
启用 IPv6 数据包转发
检查 IPv6 数据包转发是否已被启用:
sysctl net.ipv6.conf.all.forwarding
如果输出为 net.ipv6.conf.all.forwarding = 1
,IPv6 数据包转发已被启用。
否则,IPv6 数据包转发尚未被启用。
手动启用 IPv6 数据包转发:
# 设置所需的 sysctl 参数,这些参数在重启后仍然有效
cat <<EOF | sudo tee -a /etc/sysctl.d/k8s.conf
net.ipv6.conf.all.forwarding = 1
EOF
# 应用 sysctl 参数而无需重启
sudo sysctl --system
你需要一个可以使用的 IPv4 和 IPv6 地址范围。集群操作人员通常对 IPv4 使用
私有的地址范围。对于 IPv6,集群操作人员通常会基于分配给他自己的地址范围,
从 2000::/3
中选择一个全局的单播地址块。你不需要将集群的 IP 地址范围路由到公众互联网。
所分配的 IP 地址数量应该与你计划运行的 Pod 和 Service 的数量相适应。
说明:
如果你在使用 kubeadm upgrade
命令升级现有的集群,kubeadm
不允许更改 Pod
的 IP 地址范围(“集群 CIDR”),也不允许更改集群的 Service 地址范围(“Service CIDR”)。
创建双协议栈集群
要使用 kubeadm init
创建一个双协议栈集群,你可以传递与下面的例子类似的命令行参数:
# 这里的地址范围仅作示例使用
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
配置文件,
该文件用于双协议栈控制面的主控制节点。
---
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 服务器将公告自身要监听的
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 双协议栈。
说明:
标志 --apiserver-advertise-address
不支持双协议栈。
向双协议栈集群添加节点
在添加节点之前,请确保该节点具有 IPv6 可路由的网络接口并且启用了 IPv6 转发。
下面的名为 kubeadm-config.yaml
的 kubeadm
配置文件示例用于向集群中添加工作节点。
apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
discovery:
bootstrapToken:
apiServerEndpoint: 10.100.0.1:6443
token: "clvldh.vjjwg16ucnhp94qr"
caCertHashes:
- "sha256:a4863cde706cfc580a439f842cc65d5ef112b7b2be31628513a9881cf0d9fe0e"
# 请更改上面的认证信息,使之与你的集群中实际使用的令牌和 CA 证书匹配
nodeRegistration:
kubeletExtraArgs:
- name: "node-ip"
value: "10.100.0.2,fd00:1:2:3::3"
下面的名为 kubeadm-config.yaml
的 kubeadm
配置文件示例用于向集群中添加另一个控制面节点。
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"
# 请更改上面的认证信息,使之与你的集群中实际使用的令牌和 CA 证书匹配
nodeRegistration:
kubeletExtraArgs:
- name: "node-ip"
value: "10.100.0.2,fd00:1:2:3::4"
JoinConfiguration.controlPlane 中的 advertiseAddress
设定 API 服务器将公告自身要监听的
IP 地址。advertiseAddress
的取值与 kubeadm join
的标志
--apiserver-advertise-address
的取值相同。
kubeadm join --config=kubeadm-config.yaml
创建单协议栈集群
说明:
双协议栈支持并不意味着你需要使用双协议栈来寻址。 你可以部署一个启用了双协议栈联网特性的单协议栈集群。
为了更便于理解,参看下面的名为 kubeadm-config.yaml
的 kubeadm
配置文件示例,
该文件用于单协议栈控制面节点。
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
networking:
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/16
接下来
- 验证 IPv4/IPv6 双协议栈联网
- 阅读双协议栈集群网络
- 进一步了解 kubeadm 配置格式