解决AKS部署报错一例

时间:2023-02-23 16:02:51

最近在使用Terraform部署Azure Kubernetes Services的时候遇到了一个问题,导致AKS服务无法正常创建,具体报错信息如下:

错误信息:

Resource Name: "aks-xxx-uat-xxxxxxxx"): managedclusters.ManagedClustersClient#CreateOrUpdate: Failure sending request: StatusCode=0 -- Original Error: Code="PodCidrOverlapExistingSubnetsCidr" Message="NetworkProfile.PodCidr 10.244.0.0/16 overlaps with subnets CIDR. Please choose one that does not overlap 10.244.31.192/27" Target="networkProfile.podCIDR"

解决AKS部署报错一例

错误分析/原因

这个错误乍一看应该是网络地址冲突所导致的,经过排查以后发现,确实是网络地址冲突的原因。

大家都知道,Azure中部署AKS群集有两种网络模式可选,分别为kubenet和Azure CNI网络模式。而我们今天所要部署的AKS群集是使用kubenet的网络模式进行部署的。一般情况下,当我们使用Kubenet网络模式进行AKS群集部署时,系统会自动分配Pod,Services以及Docker Bridge的地址段。那今天之所以部署报错的原因就是我们承载AKS群集Node节点的地址段(10.244.31.192)和Pod CIDR 10.244.0.0/16出现了地址段冲突所导致。

如下图所示,当我们创建一个AKS群集时,系统会自动进行如下图所示地址段的分配,所以我们部署时,要避免将Node节点放置到10.244.0.0/16 、10.0.0.0/16以及172.17.0.1/16这些地址段内。

解决AKS部署报错一例

解决方式

虽然说我们在部署AKS群集时要尽量避免出现Node地址池和Pod,Services以及Docker Bridge的地址段的冲突。但是在实际生产环境中,往往我们都是由网络工程师做好的Landing Zone网络地址规划。那对于这种情况,我们肯定不方便去修改以及规划好了网络架构。所以只能从AKS侧想办法。

经过一番研究以后我们发现,可以自定义Pod,Services以及Docker Bridge的地址段来解决这个问题,在Terraform中我们可以使用如下的代码块来自定义Pod,Services以及Docker Bridge的地址段来解决我们遇到的问题:

network_profile {
network_plugin = "kubenet"
pod_cidr = "10.3.0.0/16"
dns_service_ip = "10.2.0.10"
docker_bridge_cidr = "172.17.0.1/24"
service_cidr = "10.2.0.0/23"
}

编辑好以后的Terraform代码如下图所示:

解决AKS部署报错一例

部署好以后可以看到,AKS群集的Pod,Services以及Docker Bridge的地址段已经都是我们所指定得了。

解决AKS部署报错一例