安装k8s集群请参考上一篇文章
提示:k8s集群开启ipv6,需要集群节点能够获取到ipv6地址,版本大于1.20
文章摘抄于https://zhuanlan.zhihu.com/p/574773736
1、修改kube-apiserver配置
vi /etc/kubernetes/manifests/kube-apiserver.yaml
修改以下参数,增加集群service ipv6地址范围
- --service-cluster-ip-range=10.233.0.0/18,fc00::/108
2、修改kube-controller-manager参数
vi /etc/kubernetes/manifests/kube-controller-manager.yaml
修改以下参数,增加集群ipv6地址范围和pod的ipv6地址范围
# cluster-cidr添加pod IPv6地址段
# service-cluster-ip-range添加service IPv6地址段
# node-cidr-mask-size-ipv4是为每个节点分配的pod IPv4地址段掩码长度,默认为24
# node-cidr-mask-size-ipv6是为每个节点分配的pod IPv6地址段前缀长度,默认为64
- --cluster-cidr=10.233.64.0/18,fd00::/48
- --service-cluster-ip-range=10.233.0.0/18,fc00::/108
- --node-cidr-mask-size-ipv4=24
- --node-cidr-mask-size-ipv6=120 #
3、修改kube-proxy配置
提示:前两步骤修改的不对,kubelet会挂掉,执行不了这步
kubectl edit cm -n kube-system kube-proxy
修改参数
# clusterCIDR 增加pod IPv6地址段,与步骤2的cluster-cidr相同
clusterCIDR: 172.168.0.0/16,fd00::/48
重启kube-proxy
kubectl get pod -n kube-system | grep kube-proxy | awk '{print $1}' | xargs kubectl delete pod -n kube-system
4、 修改calico配置
修改calico配置,让IPAM为pod同时分配ipv4/ipv6双栈地址
kubectl edit cm -n kube-system calico-config
修改ipam参数
"ipam": {
"type": "calico-ipam",
"assign_ipv4": "true",
"assign_ipv6": "true"
}
修改calico-node环境变量
kubectl edit ds -n kube-system calico-node
# 在 - name: IP 配置附近增加一个IPv6地址的配置
- name: IP6
value: "autodetect"
# felix启用IPv6支持,原来可能已经有这个参数,修改value即可
- name: FELIX_IPV6SUPPORT
value: "true"
# 设置pod IPv6 pool,与步骤2、3中的clusterCIDR相同
- name: CALICO_IPV6POOL_CIDR
value: "fd00::/48"
# 设置IPv6 vxLAN的模式为CrossSubnet(默认是Never)
# 如果节点跨了子网,pod通信用vxlan封装,注意该功能3.23版本后才支持
- name: CALICO_IPV6POOL_VXLAN
value: "CrossSubnet"
# 增加环境变量,开启IPv6 pool nat outgoing功能,默认是false
- name: CALICO_IPV6POOL_NAT_OUTGOING
value: "true"
验证
calicoctl node status
得到如下结果
Calico process is running.
IPv4 BGP status
+---------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+---------------+-------------------+-------+----------+-------------+
| 192.168.0.201 | node-to-node mesh | up | 13:28:54 | Established |
| 192.168.0.202 | node-to-node mesh | up | 13:28:11 | Established |
| 192.168.0.203 | node-to-node mesh | up | 13:28:34 | Established |
| 192.168.0.204 | node-to-node mesh | up | 13:27:52 | Established |
+---------------+-------------------+-------+----------+-------------+
calicoctl get ippool
得到如下结果
NAME CIDR SELECTOR
default-ipv4-ippool 10.233.64.0/18 all()
default-ipv6-ippool fd7c:e038:f437::/48 all()
修改configmap
kubectl edit cm -n kube-system kubeadm-config
# 与2、3中的clusterCIDR相同
podSubnet: 10.233.64.0/18,fd00::/48
# 与1、2中的service-cluster-ip-range相同
serviceSubnet: 10.233.0.0/18,fc00::/108
新创建的pod或者已有的pod重新创建会分配ipv6地址,使用以下命令验证
kubectl get pod nginx-75695b4ddc-stnzp -o jsonpath='{.status.podIPs}'
#看到以下信息表示已经获取到ipv4和ipv6地址
[{"ip":"10.233.96.2"},{"ip":"fd7c:e038:f437:be5:3f6f:1943:1663:dfc1"}]
service分配ipv6地址的配置
# 创建完service 修改这个配置即可,会自动分配ipv6地址
ipFamilyPolicy: PreferDualStack
#用下面的命令验证,看到ipv6地址 便是配置成功
kubectl get svc nginx-svc -o jsonpath='{.spec.clusterIPs}'
["10.233.60.35","fc00::a79a"]
至此,k8s已经成功开启双栈协议了。其实我开ipv6的主要目的是想在互联网上访问到我的k8s集群。 后面针对如何通过互联网访问家里的设备写个专栏。