容器和Serverless的多樣結合
随着容器和Serverless概念的普及,阿裡雲容器服務團隊和彈性計算團隊合作推出了多個Serverless容器産品和解決方案,包括Serverless Kubernetes、彈性容器執行個體ECI、virtual-nodes addon功能。這些不同的産品為使用者提供了豐富的無伺服器容器應用場景支援。
Serverless Kubernetes
阿裡雲容器服務的Serverless Kubernetes已經公測一段時間,使用者無需管理伺服器,同時能夠正常使用kubernetes各種API操作,包括建立pod、service、ingress、job等。無伺服器的最大價值不僅是免去了伺服器運維的負擔,更為應用提供了強大的彈性擴容能力,彈性不再受限于叢集的節點規模,而且應用僅按資源使用量付費。

Kubernetes Virtual Nodes
為了進一步優化容器服務的使用體驗和提供更多場景的豐富支援,我們推出了virtual-nodes功能,為使用者的kubernetes叢集提供極緻的彈性擴容的能力。
如上圖所示,virtual-nodes為經典kubernetes叢集添加了虛拟節點,叢集中真實worker節點和虛拟節點同時存在,通過虛拟節點動态建立ECI容器執行個體。ECI的pod與真實節點上的pod互聯互通,都運作在同一個使用者vpc網絡中。
通過virtual-nodes,使用者無需建立的新的叢集,在原有的kubernetes叢集中就可以獲得“無限”的彈性能力,使用者無需建立出很多真實worker節點就可以享受到“無限”的計算容量。virtual-nodes可應用在大資料計算、基因計算、視訊渲染、混合雲等典型計算場景,對于線上應用的短時間擴容同樣适用。
通過virtual-nodes,我們給基于有限節點的kubernetes叢集賦予了"無限"擴容的能力
我們如何使用virtual-nodes呢?讓我們先了解下背後的實作原理。
彈性容器執行個體ECI和Virutal Kubelet
彈性容器執行個體ECI
彈性容器執行個體是阿裡雲彈性計算團隊最新推出的一款靈活安全的Serverless容器運作時服務。彈性容器執行個體具備如下特點:
- 無需管理基礎設施即可運作容器
- 靈活按需使用,按秒計費
- 借助安全沙箱技術確定應用安全
更多資訊請參考産品頁:
https://www.aliyun.com/product/eci與Serverless Kubernetes容器服務不同的是,ECI不提供原生的kubernetes API,比如無法使用kubectl操作pod/service/ingress/job資源。但通過virtual kubelet創新性的把kubernetes和ECI連接配接在了一起,實作了通過kubernetes API動态建立ECI執行個體。
Virtual Kubelet
Virtual Kubelet最初是微軟Azure發起的開源項目,目标是讓公有雲的彈性容器執行個體類産品能與kubernetes更好的內建,實作kubernetes的serverless能力。在實作上VK提供了一種機制可以與多家不同的provider內建,目前已支援Azure的ACI、AWS的fargate、華為的CCI。VK也被應用在IoT Edge場景。近期我們也送出了ECI的provider并已被合并:
https://github.com/virtual-kubelet/virtual-kubelet/tree/master/providers/alicloudVirutal Kubelet向kubernetes APIServer注冊了一個虛拟節點,持續監聽pod變化事件,并動态建立ECI執行個體。
Virutal Kubelet通過虛拟節點的方式創新性的連接配接了Kubernetes與ECI,Virutal Kubelet和ECI是virtual nodes的技術基礎設施。
下面将介紹如何在阿裡雲容器服務中部署virtual nodes。
在阿裡雲托管kubernetes叢集中部署virtual nodes
1. 開通ECI
ECI目前正在公測,需要填寫邀測申請開通服務:
https://page.aliyun.com/form/act171611821/index.htm2. 建立托管Kubernetes叢集
進入容器服務控制台建立托管Kubernetes叢集
https://cs.console.aliyun.com/#/k8s/cluster/create/managed叢集建立成功後,可以在叢集管理或節點頁面檢視vswitchid、securitygroup資訊。
3. 使用kubectl一鍵部署virtual nodes
請替換alicloud-virtual-kubelet.yaml檔案中的ECI_VSWITCH、ECI_SECURITY_GROUP、ECI_ACCESS_KEY、ECI_SECRET_KEY環境變量
# cat alicloud-virtual-nodes-eci.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: alicloud-virtual-nodes-eci
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: alicloud-virtual-nodes-eci
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: alicloud-virtual-nodes-eci
namespace: kube-system
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: alicloud-virtual-nodes-eci
namespace: kube-system
labels:
app: alicloud-virtual-nodes-eci
spec:
replicas: 1
selector:
matchLabels:
app: alicloud-virtual-nodes-eci
template:
metadata:
labels:
app: alicloud-virtual-nodes-eci
spec:
serviceAccount: alicloud-virtual-nodes-eci
containers:
- name: alicloud-virtual-kubelet
image: registry.cn-hangzhou.aliyuncs.com/acs/virtual-nodes-eci:v1.0.0.1-aliyun
imagePullPolicy: Always
args: ["--provider", "alibabacloud"]
env:
- name: KUBELET_PORT
value: "10250"
- name: VKUBELET_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: VKUBELET_TAINT_KEY
value: "virtual-kubelet.io/provider"
- name: VKUBELET_TAINT_VALUE
value: "alibabacloud"
- name: VKUBELET_TAINT_EFFECT
value: "NoSchedule"
- name: ECI_REGION
value: "cn-hangzhou"
- name: ECI_VSWITCH
value: "xxx"
- name: ECI_SECURITY_GROUP
value: "xxx"
- name: ECI_ACCESS_KEY
value: "xxx"
- name: ECI_SECRET_KEY
value: "xxx"
執行yaml檔案,然後檢視pod和節點狀态,可以發現,叢集中已經添加了一個新的virtual node虛拟節點
# kubectl apply -f ./alicloud-virtual-nodes-eci.yaml
serviceaccount "alicloud-virtual-nodes-eci" created
clusterrolebinding "alicloud-virtual-nodes-eci" created
deployment "alicloud-virtual-nodes-eci" created
# kubectl -n kube-system get pod|grep virtual-nodes
alicloud-virtual-nodes-eci-54b748489c-gkcmn 1/1 Running 0 53s
# kubectl get node
NAME STATUS ROLES AGE VERSION
cn-hangzhou.i-bp19cyop0b1skne04djt Ready <none> 10m v1.11.2
cn-hangzhou.i-bp19cyop0b1skne04dju Ready <none> 10m v1.11.2
cn-hangzhou.i-bp19cyop0b1skne04djv Ready <none> 10m v1.11.2
virtual-kubelet Ready agent 55s v1.11.2
通過控制台,同樣可以看到virtual-kubelet虛拟節點的存在。
4. 部署Pod到虛拟節點上
虛拟節點已經存在,我們需要為即将運作的pod設定nodeSelector和tolerations,讓pod排程到virtual-kubelet虛拟節點上。
# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
nodeSelector:
kubernetes.io/role: agent
beta.kubernetes.io/os: linux
type: virtual-kubelet
tolerations:
- key: virtual-kubelet.io/provider
operator: Exists
# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 1m
我們可以看到,nginx pod被排程到虛拟節點中,沒有運作在叢集中任何一個worker節點之上。通過這種virtual nodes的方式,實作了容器應用的無伺服器化部署和彈性擴容,使用者無需再為叢集的節點規格選擇和容量規劃而煩勞。
總結
通過上面的步驟,我們可以快速部署virtual node,但上述配置過程還是略顯繁瑣,使用者需要配置AK和叢集的vswitch/安全組資訊,未來我們将會在阿裡雲容器服務控制台支援一鍵部署virtual-nodes插件,讓使用者免于虛拟節點配置的過程,輕松讓k8s叢集擁有強大的彈性擴容能力。請持續關注阿裡雲容器服務最新産品動态。
參考連結:
申請ECI使用:
ECI控制台:
Virtual Kubelet Provier for ECI:
建立托管Kubernetes叢集:
建立Serverless Kubernetes叢集:
https://cs.console.aliyun.com/#/k8s/cluster/create/serverlessServerless Kubernetes示例:
https://github.com/AliyunContainerService/serverless-k8s-examples