在上一篇博文中(https://yq.aliyun.com/articles/647119),我们展示了如何手动执行yaml文件给Kubernetes集群添加虚拟节点,然而,手动执行的方式用户体验并不友好,也无法以组件的方式持续升级和管理。现在我们已经可以通过Helm的方式,让ack-virtual-node的部署和管理变得更加简单。首先,让我们简单回顾一下虚拟节点Virtual Node是如何运行的。
虚拟节点Virtual Node
虚拟节点来源于社区的virtual kubelet技术,其实现了kubernetes与弹性容器实例ECI的无缝连接,让kubernetes集群轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。
基于ECI的虚拟节点支持多种功能,其不仅增强了kubernetes集群的弹性,同时提供了丰富的能力扩展,如GPU容器实例,挂载eip,大规格容器实例等,让用户可以在一个kubernetes集群中轻松管理多种计算workload,满足多种场景下的需求。
在混合集群中,真实节点上的pod与虚拟节点上的eci pod互联互通。
请注意,虚拟节点上的eci pod是按需收费的,这与真实节点上的计费不同。eci收费规则请参考:https://help.aliyun.com/document_detail/89142.html。eci pod规格配置支持0.25c至64c,请参考:https://help.aliyun.com/document_detail/89138.html
使用场景
虚拟节点和Serverless Kubernetes都是基于弹性容器实例ECI构建,都属于Serverless Container产品形态,主要适用于多种Serverless workload场景,可以极大的降低运维成本,降低用户的总体计算成本,提高计算效率。
安装ack-virtual-node插件
首先登录容器服务控制台,创建托管版kubernetes集群。在应用目录页面选择ack-virtual-node。
https://cs.console.aliyun.com/#/k8s/catalog/detail/incubator_ack-virtual-node
配置虚拟节点参数,包括Region,AK信息,vswitchId和securityGroupId需要和Kubernetes集群配置相同(可在集群信息页面查看网络配置信息)
安装Chart成功后,在节点页面可以看到添加了一个节点virtual-kubelet
通过kubectl命令,我们可以查看节点和helm部署状态,后续也可以通过helm对ack-virtual-node进行升级和管理。
基于虚拟节点创建pod
当集群中存在虚拟节点时,我们就可以把pod调度到虚拟节点上,vk将会创建出相应的eci pod。
目前我们可以通过三种方法创建eci pod。
1. 给pod设置nodeSelector和tolerations
创建如下nginx pod,设置正确的nodeSelector和tolerations,确保pod会被调度到虚拟节点上。
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
nodeSelector:
type: virtual-kubelet
tolerations:
- key: virtual-kubelet.io/provider
operator: Exists
2. 给pod设置nodeName
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
nodeName: virtual-kubelet
3. 配置namespace标签,指定namespace中所有pod调度到虚拟节点上
通过给namespace加上“virtual-node-affinity-injection=enabled”的label,系统中的admission controller将会自动给namespace中的pod加上nodeAffinity和tolerations,用户无需手动为pod配置tolerations,这种方式极大的简化了虚拟节点的使用,容器yaml文件也无需对虚拟节点做出适配。
kubectl create ns vk
kubectl label namespace vk virtual-node-affinity-injection=enabled
kubectl -n vk run nginx --image nginx
我们可以通过这种方式基于虚拟节点上创建ingress应用,在指定的namespace中应用yaml文件无需做出任何修改即可运行。
# kubectl -n vk apply -f https://raw.githubusercontent.com/AliyunContainerService/serverless-k8s-examples/master/ingress/ingress-cafe-demo.yaml
deployment "coffee" created
service "coffee-svc" created
deployment "tea" created
service "tea-svc" created
ingress "cafe-ingress" created
# kubectl -n vk get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
coffee-56668d6f78-7mdvc 1/1 Running 0 2m 192.168.1.170 virtual-kubelet
coffee-56668d6f78-tpslg 1/1 Running 0 2m 192.168.1.169 virtual-kubelet
tea-85f8bf86fd-5fl2v 1/1 Running 0 2m 192.168.1.172 virtual-kubelet
tea-85f8bf86fd-8n9n8 1/1 Running 0 2m 192.168.1.171 virtual-kubelet
tea-85f8bf86fd-jv7kj 1/1 Running 0 2m 192.168.1.173 virtual-kubelet
# kubectl -n vk get ing
NAME HOSTS ADDRESS PORTS AGE
cafe-ingress cafe.example.com 120.55.8.82 80 2m
# curl -H "Host:cafe.example.com" 120.55.8.82/tea
Server address: 192.168.1.173:80
Server name: vk-tea-85f8bf86fd-jv7kj
Date: 13/May/2019:05:54:32 +0000
URI: /tea
Request ID: 84d2afa2d3a74d7af38f94de21d11d37
# curl -H "Host:cafe.example.com" 120.55.8.82/coffee
Server address: 192.168.1.169:80
Server name: vk-coffee-56668d6f78-tpslg
Date: 13/May/2019:05:54:36 +0000
URI: /coffee
Request ID: 280df5e9f29d22d8174540f8dfe77861