前言
构建k8s集群大体可分为三种方式:
- 使用kubeadm或者封装了kubeadm的框架进行部署。
- 使用terraform在支持的云厂商进行部署。
- 直接购买云厂商现成的k8s集群产品。
这三种方式由难到易(其实难的也没多难,就是可能会稍微复杂一点点),这里记载使用terraform在腾讯云构建k8s集群因参数设置不对,导致serviceIP不够,且不能动态添加,最后只能重建集群,迁移服务的坑。
还有因为公司采用了serverless架构,导致产生大量微小服务,虽然启动速度更快,内存占用更小,服务根据并发灵活扩缩容,甚至能缩容到0,但是会占用大量的内部虚拟IP,所以cluster_cidr、service_cidr设置不足导致问题更加突出严重。
前情分析
使用terraform在腾讯云部署k8s环境时,往往需要设置这两个参数:
| 参数 | 说明 | 是否必须显式设置 | 默认值(如果不填) |
| —————— | ————————– | ——————– | ———————- |
| cluster_cidr | 集群内 Pod 使用的 CIDR | 否 | 172.16.0.0/16 |
| service_cidr | 集群内 Service 使用的 CIDR | 否 | 10.0.0.0/16 |
虽然可以默认,但在生产环境下,强烈建议显式设置,原因如下:
- IP 冲突规避:默认的 Pod 网段(172.16.0.0/16)如果与你 VPC 自身的子网 CIDR 冲突,会导致容器无法通信。
- 网段规划:如果你的腾讯云环境通过对等连接(Peering Connection)或 VPN 连接了其他 VPC 或办公网,必须显式规划网段以防路由冲突。
- 后期不可更改:这两个参数在集群创建后无法修改。如果默认值选错了,后期扩容或联网出现冲突时,只能删掉集群重建。
默认网段大小还可以,但是往往会因为1,2原因网段冲突导致需要显示设置这两个参数,但是问题恰恰出现在这里,运维人员不清楚IP网段的含义,设置了过小的网段,导致IP不够,k8s集群启动不了更多的服务。
service_cidr不够时会报以下错误:
Error from server (InternalError): error creating service: Internal error occurred: failed to allocate a serviceIP: range is full
解决方案
遇到cluster_cidr不足时还能通过在后边增加、service_cidr则就不能增加,只能重建集群了,带来的影响是不可估量的,如果使用了ArgoCD自动化部署工具,并且服务实现了helm脚本,则迁移集群的复杂度则会大大降低。
