AKS扩展到虚拟节点
Azure Kubernetes 服务 (AKS)是微软云Azure上托管的Kubernetes 群集,可以用于快速部署Kubernetes 群集。基础的AKS集群使用平 Pod 自动缩放程序,在 Kubernetes 群集中使用指标服务器来监视 Pod 的资源需求。如果应用程序需要更多资源,则会自动增加 Pod 数以满足需求。如果工作节点资源也不够了,则再基于虚拟机扩展集(VMSS)进行工作节点自动扩展。当扩展工作节点时,背后需要新启动虚拟机了,这时资源扩展的速度相对比较慢。为此,Azure还推出了虚拟节点的功能,可以基于Azure容器实例快速创建pod,不使用虚拟机,所以不用等待,大大提高了集群扩展的效率。
注意:截止到2020年5月,Azure中国区域仅有东2区发布了容器实例服务,并且尚未支持AKS通过虚拟节点扩展到容器实例。此功能在海外区域多数已经正式发布,具体发布情况请查阅Azure 容器实例在 Azure 区域的资源可用性。做下面实验,需要海外Azure的环境,我们使用的是美东区。
基本部署
应用
演示用的应用源码在这里。
/https://github.com/xfsnow/container/blob/master/VirtualNodeScaling/
其中Kubernetes 的 deployment 配置文件nginx-vn.yaml使用经典的 nginx 应用作为演示。除了基本的容器镜像配置以外,这里使用了tolerations和affinity来优化使用VM节点和虚拟节点。
tolerations:- key: virtual-kubelet.io/providervalue: azureoperator: Equaleffect: NoScheduleaffinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: typeoperator: NotInvalues:- virtual-kubelet
AKS集群中添加的虚拟节点,默认是tainted,所以我们需要明确指定哪些业务需要通过ACI调度到虚拟节点上。配置文件中的tolerations就是允许pod被调度到虚拟节点上,以便在扩展pod时VM节点资源不够的时候可以创建到虚拟节点上去。
nodeAffinity指定的是新建pod时偏好,而运行时忽略。偏好的是节点的labels中,type不带virtual-kubelet值的,即新建pod时优先放置在VM的节点上,而收缩时优先删除在虚拟节点上的pod。
Azure资源
使用控制台创建一个启用虚拟节点的AKS集群。
区域选择美东,节点数填写1。点击Next: Node pools 按钮。
勾选Enable virtual nodes,这是启用虚拟节点的关键设置。
到Networking页,发现只能选用Azure CNI,不再支持Kubenet了。还需要我们指定Cluster subnet和Virtual nodes subnet,这些都使用默认值就行。
其余配置页都使用默认值,点击Review + Create创建集群。
创建好后,我们先看 Workloads
这里这个aci-connector-linux就是用来连接ACI的pod。
如果刚创建完AKS集群后,这个pod显示不是Ready,请耐心等待一会,可能需要20-30分钟就变成Ready了。
再看VMSS。
可以看到里面有1台VM,正常运行。
点击Virtual network/subnet链接,可以跳转到VM所在的子网。
在这里左边导航链接点击 Subnets,可以看到AKS平台帮我们自动创建了2个子网。
其中 default 是VM节点所在的子网,而另一个virtual-node-aci 是为将来扩展虚拟节点所用的子网。
部署Kubernetes
先连接Kubernetes集群
然后看一下现有的节点。
kubectl get node
NAME STATUS ROLES AGE VERSION
aks-agentpool-34658330-vmss000000 Ready agent 10m v1.19.9
virtual-node-aci-linux Ready agent 9m35s v1.18.4-vk-azure-aci-v1.3.5
可以看到aks-agentpool-34658330-vmss000000是一个普通的基于虚拟机的节点,还有一个virtual-node-aci-linux就是虚拟节点。
我们创建一个命名空间,后面的实验都在这个命名空间里进行。
kubectl create namespace virtualnode
namespace/virtualnode created
先来做一个是基础的,把pod部署到虚拟节点上。
kubectl apply -f helloworld-vn.yaml
deployment.apps/helloworld-vn created
看一下pod
kubectl get pods -o wide -n virtualnode
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
helloworld-vn-5749f58859-67vn6 0/1 Creating 0 21s <none> virtual-node-aci-linux <none> <none>
可以看到正在虚拟节点上部署。
再看详情:
kubectl describe pod helloworld-vn-5749f58859-67vn6 -n virtualnode
Name: helloworld-vn-5749f58859-67vn6
Namespace: virtualnode
Priority: 0
Node: virtual-node-aci-linux/
Start Time: Tue, 11 May 2021 11:28:36 +0800
Labels: app=helloworld-vnpod-template-hash=5749f58859
Annotations: <none>
Status: Running
IP: 10.241.0.4
IPs:IP: 10.241.0.4
Controlled By: ReplicaSet/helloworld-vn-5749f58859
Containers:helloworld-vn:Container ID: aci://6ee343c40cb742b912ce86084cb73c5d0f9997dd55fa0b44290bb0c9b04370a4Image: mcr.microsoft.com/azuredocs/aci-helloworldImage ID:Port: 80/TCPHost Port: 0/TCPState: RunningStarted: Tue, 11 May 2021 11:28:36 +0800Ready: TrueRestart Count: 0Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-rzbnb (ro)
Conditions:Type StatusReady TrueInitialized TruePodScheduled True
Volumes:default-token-rzbnb:Type: Secret (a volume populated by a Secret)SecretName: default-token-rzbnbOptional: false
QoS Class: BestEffort
Node-Selectors: beta.kubernetes.io/os=linuxkubernetes.io/role=agenttype=virtual-kubelet
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300svirtual-kubelet.io/provider op=Exists
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 82s Successfully assigned virtualnode/helloworld-vn-5749f58859-67vn6 to virtual-n
ode-aci-linuxNormal ProviderCreateSuccess 81s virtual-node-aci-linux/pod-controller Create pod in provider successfully
首次部署虚拟节点使用了82秒,感觉稍微有点慢,这里时间主要用在2方面,一是初次创建ACI实例,更多的时间是用在拉取 mcr.microsoft.com/azuredocs/aci-helloworld 这个镜像文件和部署。
点击查看容器实例
可以看到有1个容器实例了。
最后我们把这个deployment删除,清理资源。
kubectl delete -f helloworld-vn.yaml
deployment.apps "helloworld-vn" deleted
伸缩测试
基于VM的节点和虚拟节点的混合伸缩。
kubectl apply -f nginx-vn.yaml
deployment.apps/nginx-vn created
只部署1个pod时,优先部署在了虚拟机的节点上。
kubectl get pod -o wide --namespace virtualnode
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-vn-54d69f7df4-hxkkz 1/1 Running 0 23s 10.240.0.75 aks-agentpool-34658330-vmss000000 <none> <none>
先扩展到20个副本。
kubectl scale deployment nginx-vn --replicas=20 -n virtualnode
deployment.apps/nginx-vn scaled
查看pod。
kubectl get pod -o wide --namespace virtualnode
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-vn-54d69f7df4-4fr5g 1/1 Running 0 3m2s 10.241.0.19 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-cg4jb 1/1 Running 0 3m2s 10.241.0.5 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-cmj6d 1/1 Running 0 3m2s 10.241.0.7 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-dljkw 1/1 Running 0 3m2s 10.241.0.16 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-f25fb 1/1 Running 0 3m2s 10.241.0.8 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-g6ps9 1/1 Running 0 3m2s 10.241.0.15 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-h2dtq 1/1 Running 0 3m2s 10.240.0.82 aks-agentpool-34658330-vmss000000 <none> <none>
nginx-vn-54d69f7df4-hgkzc 1/1 Running 0 3m2s 10.241.0.14 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-hxkkz 1/1 Running 0 7m53s 10.240.0.75 aks-agentpool-34658330-vmss000000 <none> <none>
nginx-vn-54d69f7df4-jf4h7 1/1 Running 0 3m2s 10.241.0.20 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-mtjbn 1/1 Running 0 3m2s 10.241.0.9 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-q9d5f 1/1 Running 0 3m2s 10.241.0.13 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-qlf4l 1/1 Running 0 3m2s 10.241.0.18 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-sb54f 1/1 Running 0 6m27s 10.241.0.4 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-t4zmf 1/1 Running 0 3m2s 10.241.0.12 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-xj95k 1/1 Running 0 3m2s 10.241.0.10 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-xltlt 1/1 Running 0 3m2s 10.241.0.17 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-xnhtc 1/1 Running 0 3m2s 10.240.0.109 aks-agentpool-34658330-vmss000000 <none> <none>
nginx-vn-54d69f7df4-zbzt5 1/1 Running 0 3m2s 10.241.0.6 virtual-node-aci-linux <none> <none>
nginx-vn-54d69f7df4-zphhk 1/1 Running 0 3m2s 10.241.0.11 virtual-node-aci-linux <none> <none>
再收缩回2个副本。
kubectl scale deployment nginx-vn --replicas=2 -n virtualnode
deployment.apps/nginx-vn scaled
可以看到收缩后,只留下虚拟机节点上的 pod了。
kubectl get pod -o wide --namespace virtualnode
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-vn-54d69f7df4-h2dtq 1/1 Running 0 5m18s 10.240.0.82 aks-agentpool-34658330-vmss000000 <none> <none>
nginx-vn-54d69f7df4-hxkkz 1/1 Running 0 10m 10.240.0.75 aks-agentpool-34658330-vmss000000 <none> <none>
总结
通过ACI扩展到虚拟节点,确实比基于VMSS先扩虚机再扩pod 要快不少。但是扩展出的虚拟节点数量也是有限制的,做不到在短时间内无限的扩展出来。建议做法是,以AKS的自动扩展为基础,结合虚拟节点的快速扩展来支持突增的场景,用虚拟节点来先顶住突增的需求,给AKS扩展争取到时间,2种同时扩展,等VMSS扩起来以后,就可以把虚拟节点替换下了。而且 VMSS 的扩展,理论上可以提供更大规模的资源,能够提供比仅用虚拟节点更多的资源。这样做就兼顾了性能的成本。
AKS扩展到虚拟节点相关推荐
- 一致性hash算法虚拟节点_一致性哈希虚拟节点
采用固定哈希算法平衡负载 在大规模的缓存应用中,应运而生了分布式缓存系统.key-value如何均匀的分散到集群中?最常规的方式莫过于hash取模的方式.比如集群中可用机器适量为N,那么key值为K的 ...
- 一致性hash算法虚拟节点_Hash算法和一致性Hash算法
Hash算法 Hash 算法在路由算法应用中,为了保证数据均匀的分布,例如有 3 个桶,分别是 0 号桶, 1 号桶和 2 号桶:现在有 12 个球,怎么样才能让 12 个球平均分布到 3 个桶中呢? ...
- Vue3官网-可复用组合式API(十四)实例 property(\$slots,\$attrs)、渲染函数render(虚拟节点VNode,h() 参数,使用JavaScript代替模板功能),插件
Vue3官网-可复用&组合式API(十四)实例 property($slots,$attrs).渲染函数render(虚拟节点VNode,h() 参数,使用JavaScript代替模板功能), ...
- 一致性Hash算法与虚拟节点
缘起 今天我们来说说"一致性Hash"算法,以及虚拟节点. 这并不是一个难理解的概念,希望一篇文章下来,你能完全吃透. 在网站系统发展初期,前辈工程师探索出了数据库这一系统核心组件 ...
- 一致性hash算法虚拟节点_一致性哈希算法——虚拟节点
一致性哈希算法--虚拟节点 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是 ...
- SAP复合角色更改后扩展到派生节点
SAP复合角色更改后扩展到派生节点 在父权限修改的页面点击:调整派生即可
- ACK容器服务发布virtual node addon,快速部署虚拟节点提升集群弹性能力
2019独角兽企业重金招聘Python工程师标准>>> 在上一篇博文中(https://yq.aliyun.com/articles/647119),我们展示了如何手动执行yaml文 ...
- 属性 元素的内容 创建,插入和删除节点 虚拟节点
属性 html元素由一个标签和一组称为属性的名/值对组成. HTML 表示HTML文档元素的HTMLElement对象定义了读/写属性.映射了元素的HTML属性.HTMLElement定义了通用的HT ...
- 一致性hash算法虚拟节点_一致性Hash算法原理详解
数据分片 先让我们看一个例子吧: 我们经常会用 Redis 做缓存,把一些数据放在上面,以减少数据的压力. 当数据量少,访问压力不大的时候,通常一台Redis就能搞定,为了高可用,弄个主从也就足够了: ...
最新文章
- ERROR:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing 解决方案
- 为学Linux,我看了这些书
- 理解统计信息(6/6):统计信息汇总贴
- win2003系统+IIS6下,经常出现w3wp.exe和sqlserver.exe的内存占用居高不下
- 数据库计划中的14个才略
- delphi Oracle导出多个表,Oracle数据库自动备份工具(Delphi源码)
- Platform.Uno介绍
- MagicAjax的用法, 每10秒刷新, 更改等待loading效果
- 计算机图形学完整笔记(二):光栅图形学算法
- 【企业架构】什么是 TOGAF? 企业架构方法论
- html导入.obj,如何用Babylon.js导入一个.obj模型
- matlab中功率因数怎样测量,如何测量功率因数?功率因数测量方法
- 蚂蚁金服提前批实习面经(2.26)
- Win11谷歌的IDM插件用不了怎么解决?如何解决win11idm插件问题
- 【Java 8 新特性】Java CompletableFuture thenApply()
- 当读/写磁盘文件时,read/write是不带缓冲机制的吗?请说明原因。
- 计算机休眠是打不开,电脑自动进入睡眠模式打不开是为什么
- 论文初稿写到什么程度才算合格?
- jquery点击图片放大,再点缩小(转)
- 温度自动控制系统_反应釜温度控制智能化温控设备的趋势
热门文章
- java 数据流向图_数据流图懂不懂?
- cpu爆了怎么排查和处理_CPU 故障的排查方法
- myBaits Expert Wheat Exome — 从多个小麦品种中富集超过250Mb的高可信度的外显子
- ip(点分十进制 == 二进制整数)之间的转换
- 脚本语言---来于百度
- python pip 环境变量配置
- WSL2跟踪 - 19013: Memory Reclaim内存回收
- 大数据技术之数据存储
- PPT怎样使用艺术字来突出显示标题文本
- oracle instr和mysql_Oracle 的INSTR函数MySQL实现