前言
好久没写文章了,惯例前言(狗头)。发生了一些有趣的事情,正好和大家分享一下。
背景大概是2005年的第一场雪(bushi),去年置换到腾讯云的时候,在使用KubeKey部署kubernetes集群的过程中,发现当时的KubeKey支持的最小IPv6地址池是 /80 还是 /64,过于大了,不方便管理ip段,也不方便复制容器的ip地址,更不好看(原来如此),最后没有使用IPv6。
前一阵子,准备给集群添加IPv6的支持,结果发现网上大部分文章都是在部署集群时就开启IPv6的支持,而我是在集群部署完成后才添加的IPv6的支持,集群里面一堆的服务,推倒重建并不是一个很好的选择,在一筹莫展之际,我选择不展(
又过了一段时间,实在忍不了这口气,我还是想要挑战一下,尝试在已有集群上添加IPv6支持,鉴于最后成功的操作,于是就有了这篇文章
操作过程
整个操作过程看似很危险,实则一点都不安全,但最终没有出现大问题,我姑且认为这个操作顺序是相对靠谱的
请勿在生产集群上尝试!请勿在生产集群上尝试!请勿在生产集群上尝试!
修改所有需要开启ipv6节点的 kube-controller-manager.yaml
文件可能存在的目录:
/etc/kubernetes/manifests/kube-controller-manager.yaml
修改前建议将文件备份一下
需要修改的字段:
# 修改点1
- --cluster-cidr=<ipv4 Pod网段>
#改为
- --cluster-cidr=<ipv4 Pod网段>,<ipv6 Pod网段/116>
# 修改点2
- --service-cluster-ip-range=<ipv4 Service网段>
#改为
- --service-cluster-ip-range=<ipv4 Service网段>,<ipv6 Service网段/116>
# 修改点3
- --node-cidr-mask-size=24
# 改为
- --node-cidr-mask-size-ipv4=24
# 修改点4
# 增加,为啥我最终选择了120呢,因为 ::0/120 下一段正好就是 ::0100/120 肥肠的方便管理,肥肠的好看
- --node-cidr-mask-size-ipv6=120
再次确认修改无问题后,保存退出,此时 kube-controller-manager 会自动重启,等待重启完成后,检查 kube-controller-manager 的日志,确认没有报错即可。
修改Cilium网络插件配置
KubeKey集群的Cilium是用Helm部署的,所以需要修改 values.yaml 文件,然后执行helm upgrade配置
首先,我们导出当前的values.yaml文件
helm get values cilium -n kube-system > cilium-values.yaml
然后需要修改的地方如下:
# 修改点1 将第一行 USER-SUPPLIED VALUES: 去掉
# 修改点2 添加或修改 ipv6.enabled 配置
ipv6:
enabled: true
# 修改点3(可选,helm upgrade出问题的话就加上) 添加或修改如下内容(我用的chart版本可能有点问题,不加这个愣是过不去它的模板渲染,但出于安全考虑,升级其他版本的风险可能更大,所以这里我选择解决这个问题)
cni:
chainingMode: none
# 修改点4 添加这段到原有格式中,没有就追加
ipam:
operator:
clusterPoolIPv6PodCIDRList:
- <ipv6 Pod网段/116>
修改完以后,我们操作helm upgrade配置
# 使用这个命令确认cilium当前版本号(APP VERSION)!
helm list -n kube-system
# 安装 Cilium Repo 并更新(可选,如果已经有了就不用操作)
helm repo add cilium https://helm.cilium.io/
helm repo update
helm upgrade cilium -n kube-system --version <cilium当前版本号> -f cilium-values.yaml
一通操作以后,Cilium配置应该就修改完毕了,然后我们需要手动重启一下Cilium Operator Pod让配置生效
# 重启Cilium Operator Pod(命令来自AI自动补全,我是用k9s操作的
kubectl rollout restart deployment cilium-operator -n kube-system
修改 kube-proxy 配置
kubectl edit cm kube-proxy -n kube-system
# 修改点1 加上 Pod 网段
- --cluster-cidr=<ipv4 Pod网段>,<ipv6 Pod网段/116>
重头戏来了!修改 Node 分配到的网段
众所周知(划掉),直接修改 Node 分配到的网段是过不去 API 校验的,所以这里我们需要曲径通幽(不要问我为啥知道
https://www.reddit.com/r/kubernetes/comments/1c9md7q/how_to_change_the_default_podcidr_in_cilium_after/
参考了某位 Reddit 老哥的回答,我决定冒险一试(这还都是master节点,搞得我提心吊胆的
这个步骤请一个一个一个节点来操作,不然就可能会哼哼啊啊啊啊啊啊!
首先我们将节点 Yaml 导出
kubectl get node <node1> -o yaml > <node1>.yaml
# 修改 spec.podCIDRs 字段,加上子网段,注意,前面都是整个你想要分配的ipv6全网段,这里是子网段!
spec:
podCIDRs:
- <ipv4 Pod网段>
- <ipv6 Pod 三个节点用三个 不同的子网段 不同的子网段 不同的子网段/120>
修改完,记得再三检查,然后我们就来干危险的事情
# 这里我给命令注释了,希望大家知道这个命令的危险性,自行拷贝执行
## kubectl delete node <node1> && kubectl apply -f <node1>.yaml
但其实也就是一瞬间的时间,如果修改没有问题,不到500ms,节点就会重新加入集群,然后分配到新的网段(笑)
当节点重新加入集群后,我们马上就能看到效果
kubectl get nodes -ojsonpath="{range .items[*]}{.metadata.name}{'t'}{.spec}{'n'}{end}"
观察没有问题后,继续修改其他节点
然后基本就是重启各种组件操作了
首先重启各节点上 cilium agent Pod
# 此处没有命令,请自行重启
观察 cilium agent 日志,正常启动以后,就可以开始重启 coredns,kube-apiserver,kube-proxy,kube-multus,kube-scheduler,nodelocaldns 等组件
# 此处没有命令,请自行重启(累了qaq)
重启自己部署的服务
累了,直接略!
后记
累了,图片还上传失败,不知道是啥bug,不吼意思啦,封面没了嘻嘻嘻