概述
简介
今天分享的还是关于AKS快速扩缩容的内容,之前其实刚介绍过使用Artifact streaming加速AKS容器部署,主要讲的是通过Artifact streaming加快拉取image的时间,而这次分享的主要是如何快速实现container的扩容,也就是scale out,主要采用的方法是使用虚拟节点的方式,结合Azure Container instance,将container部署到虚拟节点中,以container instance的方式提供服务。
优势
传统情况下,当container扩容时,如果node资源不足,而我们又设置了node的auto scale的话,需要等待node scale out之后,将新的container部署到新的node中,这种方式相对来说效率会低一些,因为node毕竟还是虚拟机,扩容需要一定时间,而通过虚拟节点(virtual node),我们不需要等待物理节点的扩容,因为新的container是直接部署到ACI(Azure container instance)中的,扩容速度相对传统方式会快一些
限制
Virtual Node不支持的方案或者部署注意事项
- 使用服务主体拉取 ACR 映像。 解决方法是使用 Kubernetes 机密
- 虚拟网络限制包括 VNet 对等互连、Kubernetes 网络策略和网络安全组发送到 Internet 的出站流量。
- 初始化容器(Init containers)
- 主机别名(Init containers)
- ACI 中的 exec 的参数
- DaemonSet 不会将 Pod 部署到虚拟节点
- 为了将 Windows Server 容器调度到 ACI,需要手动安装开源 Virtual Kubelet ACI 提供程序。
- 虚拟节点需要那些具有 Azure CNI 网络的 AKS 群集。
- 对 AKS 使用 API 服务器授权的 IP 范围。
- 卷装载 Azure 文件共享支持常规用途 V2 和常规用途 V1。 但虚拟节点当前不支持 永久性卷 和 永久性卷声明。 按照说明装载带有 Azure 文件共享的卷作为内联卷。
- 不支持使用 IPv6。
- 虚拟节点不支持容器挂钩功能。
配置
创建AKS
创建resource group
az group create --name ACI `
--location eastasia
创建AKS,注意参考上边列出来的限制,virtual node只支持AzureCNI,所以必须要部署AzureCNI的cluster
$subnet_id=az network vnet subnet show -g Work --vnet-name work-vnet --name default --query id -o tsv
az aks create -g ACI `
-n ACIAKS `
--node-osdisk-size 128 `
--admin-username azureuser `
--kubernetes-version 1.27.7 `
--location eastasia `
--network-plugin azure `
--node-count 1 `
--node-vm-size Standard_D2S_v3 `
--nodepool-name nodepool `
--service-cidr 10.10.1.0/24 `
--dns-service-ip 10.10.1.10 `
--vnet-subnet-id $subnet_id `
--load-balancer-sku Standard `
--max-pods 30
开启addon
接下来就需要准备开启virtual node了,virtual node在AKS里本质上只是个addon,所以开启的步骤相对简单,在开启addon之前,需要先准备一个网段,因为之前说过virtual node是基于ACI的,我们需要为ACI准备一个单独的网段,这个网段之后会自动设置delegation
az network vnet subnet create --resource-group Work `
--vnet-name Work-vnet `
--name ACISubnet `
--address-prefixes 10.24.0.0/24
之后就可以enable addon了
az aks enable-addons --resource-group ACI `
--name ACIAKS `
--addons virtual-node `
--subnet-name ACISubnet
可以看到virtual node实际上会在集群中部署一个pod,观察发现这个pod部署后一直没有正常启动
kubectl get po -A
查看log可以发现,这里报的是一个权限的错误
kubectl logs aci-connector-linux-5b74bf66d4-w7wqq -n kube-system
开启addon之后,会自动创建一个ACI的system identity,这个identity需要具有对AKS网络的管理权限
权限的添加本身是自动完成的,但是需要一段时间来生效
等一段时间后,就可以看到第二个node了
kubectl get node
部署sample应用
之后就可以部署一个sample的应用了
apiVersion: apps/v1
kind: Deployment
metadata:
name: aci-helloworld
spec:
replicas: 1
selector:
matchLabels:
app: aci-helloworld
template:
metadata:
labels:
app: aci-helloworld
spec:
containers:
- name: aci-helloworld
image: mcr.microsoft.com/azuredocs/aci-helloworld
ports:
- containerPort: 80
nodeSelector:
kubernetes.io/role: agent
beta.kubernetes.io/os: linux
type: virtual-kubelet
tolerations:
- key: virtual-kubelet.io/provider
operator: Exists
- key: azure.com/aci
effect: NoSchedule
之后将这个deployment scale out到50个实例
kubectl scale --replicas=50 deployment/aci-helloworld
可以看到等待一段时间后,container都部署出来了,而我们并没有设置node的自动扩缩容,新的container都是部署到virtual node上的,也就是以ACI的形式部署的
kubectl get po -w
而在portal上也可以看到这些新的ACI了