欢迎来到 岁月小筑

“偷梁换柱”:给已有Kubernetes集群在ipv4的基础上开启ipv6功能并追加ipv6段(Cilium网络插件)

前言

好久没写文章了,惯例前言(狗头)。发生了一些有趣的事情,正好和大家分享一下。

背景大概是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,不吼意思啦,封面没了嘻嘻嘻

点赞

发表评论

电子邮件地址不会被公开。