这几篇准备开始写一写关于AKS的一些内容,首先来说下AKS是啥,简单来说AKS=Azure托管K8S集群,知道这点基本就已经够了,AKS的创建之类的其实步骤都很简单,没什么必要单独拿出来讲,这几篇主要是讲一些常用的小技巧,首先要讲的其实是关于网络方面的

K8S的网络模型说实话比单纯的云网络还是要复杂一些的,最常用的基本就是flannel和calico,一般来说各个云厂商在托管的K8S里基本都会提供最少两种的网络模型,大部分都是根据各个云厂商情况进行定制的,Azure在这点上也不例外,Azure提供的网络模型主要有两种:

1、Kubenet

2、AzureCNI

kubenet 从 Azure 虚拟网络子网获取 IP 地址。 Pod 接收从逻辑上不同的地址空间到节点的 Azure 虚拟网络子网的 IP 地址。 然后配置网络地址转换 (NAT),以便 Pod 可以访问 Azure 虚拟网络上的资源。 流量的源 IP 地址通过 NAT 转换为节点的主 IP 地址。 这种方法大大减少了需要在网络空间中保留供 Pod 使用的 IP 地址数量。

简单来说,kubenet网络模型下,pod的IP是一个虚拟的IP,不会从虚拟网络里获取,也不会占用IP资源,所以IP规划会比较简单,也不至于出差IP不够的情况,但是跨node间的pod通信是需要借助UDR来实现的,会有一些网络开销,并且这种网络模型也能支持calico的网络策略,这点其实比较好,很多云厂商的托管K8S集群,较为基础的网络插件都不支持网络策略

图片3.png

而Azure CNI则是相对高级一点的网络模型

借助 Azure 容器网络接口 (CNI),每个 Pod 都可以从子网获得 IP 地址,并且可供直接访问。 这些 IP 地址在网络空间中必须唯一,并且必须事先计划。 每个节点都有一个配置参数来表示它支持的最大 Pod 数。 这样,就会为每个节点预留相应的 IP 地址数。 使用此方法需要经过更详细的规划,并且经常会耗尽 IP 地址,或者在应用程序需求增长时需要在更大的子网中重建群集。 

Azure CNI的网络模型中,pod是会实际占用虚拟网络的IP地址的,这点如果pod比较多的话很容易把地址空间占满,所以会比较危险,但是相对的pod通信也不需要经过UDR,这种网络模型不仅支持calico网络策略,还能支持Azure网络策略

图片4.png

对于新手来说,其实kubenet就完全足够了

以上相当于对于AKS网络模型的一点简介,之后是一些小技巧

一:如何在kubenet网络模型下使用现有的子网

在Portal创建kubenet类型的集群时,其实没办法选择部署到哪个虚拟网络里,感觉好像是这东西不是部署在虚拟网络里一样,但是其实创建后你会发现其实会自动创建个新的虚拟网络,那如果想把集群部署到现有子网中应该怎么做呢?这点其实通过CLI和PowerShell都可以做到

PowerShell命令

New-AzAks -ResourceGroupName Garrickmeng -Name mxyAKS -NodeCount 1 -NodeVmSetType VirtualMachineScaleSets -NodeV`netSubnetID $subnet.id -NodeMaxPodCount 150 -NodeVmSize Standard_DS2_v2 -EnableRBAC -NetworkPlugin kubenet -Location chinanorth2 -LinuxProfileAdminUserName mengxiyuan -DnsNamePrefix mxyakstest -KubernetesVersion 1.18.10 -NodeName mxyaksnode -SshKeyValue "C:\Users\garrick.meng\.ssh\id_rsanew.pub"

在创建的过程中其实可以指定NodeV`netSubnetID,至于如何获取这个ID,可以参考下边的做法

$subnetid=az network v`net subnet list --resource-group garrickmeng --v`net-name mxy-v`net --query "[?(name == 'mxy')].id" -o tsv

其实比较推荐的还是用CLI创建,因为PowerShell命令感觉参数不是很多,像service CIDR这些参数居然没有

CLI命令

az aks create -g garrickmeng -n MyManagedCluster --node-osdisk-size 100 --admin-username mengxiyuan --kubernetes-version 1.18.10 --location chinanorth2 --network-plugin kubenet --node-count 1 --node-vm-size Standard_DS2_v2 --nodepool-name systempool --pod-cidr 10.120.0.0/16 --service-cidr 10.110.0.0/16 --ssh-key-value 'C:\Users\mxy00\.ssh\id_rsa2.pub' --vm-set-type VirtualMachineScaleSets  --v`net-subnet-id $subnetid --dns-service-ip 10.110.0.10 --dns-name-prefix mxyaks

CLI基本也是类似,只需要指定好subnetid即可

二:如何在不同子网部署node pool

在Portal操作的时候,其实可以直接创建新的node pool,node pool会决定这批node所处的网络,K8S版本,size等等,所以还是比较重要的,尤其是当网络IP消耗较多,需要扩容时,直接扩子网IP是做不了的,但是可以添加新的子网,在Portal创建新的node pool的时候其实没有地方能选择部署到哪个子网,默认就是部署到当前的集群子网里,如果想单独部署到别的子网,可以用以下方法

先获取子网ID

$nodesubnetid=az network v`net subnet list --resource-group garrickmeng --v`net-name mxy-vnet --query "[?(name == 'mxy2')].id" -o tsv

az aks nodepool add --cluster-name MyManagedCluster --name userpool --resource-group garrickmeng --enable-node-public-ip --kubernetes-version 1.18.10 --mode user --node-count 1 --node-osdisk-size 80 --node-vm-size Standard_DS2_v2 --os-type Linux --v`net-subnet-id $nodesubnetid

在CLI里其实可以指定subnet id,这样就可以部署到不同字网了

感觉现在portal的一些操作还是不太够,为了实现目的,只能用命令来做了

图片2.png