前提條件
已創建Kubernetes集群。
Kubernetes集群連通性正常。
已創建虛擬節點VNode。
創建虛擬節點VNode
從云容器引擎創建的虛擬節點,在彈性容器實例(簡稱ECI)中也能查看到,由ECI根據使用情況計費,僅支持在ECI開放的資源池創建虛擬節點,ECI開放的資源池請以ECI官網為準。
1、登錄云容器引擎控制臺,在左側導航欄選擇集群,單擊集群名,進入集群頁面。
2、點擊左側菜單節點管理 -> 節點,打開節點列表頁面。
3、單擊創建虛擬節點按鈕,進入創建虛擬節點頁面。
4、選擇可用區后,標簽與污點可不需要額外添加,點擊確定按鈕,提交會自動返回節點列表頁面。
5、創建的虛擬節點,在集群列表中的實例規格會顯示為“virtual-kubelet”,配置顯示為“CG”,類型為“virtual-kubelet”。
安裝cubevk-profile插件
1、登錄云容器引擎控制臺,在左側導航欄選擇集群,單擊集群名,進入集群頁面。
2、選擇左側菜單插件 -> 插件市場,找到cubevk-profile插件,單擊安裝,在安裝彈出框,選擇1.0.3版本,單擊“安裝”。
Pod調度到ECI
云容器引擎提供了兩種方式將Pod調度到ECI上運行,手工調度與自動調度方式。
1、手工調度
方式一:為pod添加 ccse.daliqc.cn/vnode=true 的Label,將Pod調度到ECI上運行。
方式二:創建一個Namespace并添加 ccse.daliqc.cn/vnode=true 的Label,則該Namespace下的所有Pod將調度到ECI上運行。
2、自動調度
cubevk-profile支持的調度策略如下:
| 策略 | 說明 |
|---|---|
| fair | 公平調度,由kube-scheduler決定調度到標準Node或VNode。 |
| normalNodeOnlyPod | 只會調度到標準Node。 |
| normalNodePrefer | 優先調度到標準Node,標準Node資源不足時允許調度到VNode。 |
| virtualNodeOnlyPod | 只會調度到VNode。 |
創建Selector來配置Pod的調度策略
創建Pod時,系統會按照Selector配置去匹配Pod,Selector Label能夠匹配上的Pod,會自動調度到ECI,并自動添加相應的Annotation和Label,Selector的YAML配置模板如下:
apiVersion: eci.daliqc.cn/v1
kind: Selector
metadata:
name: test-auto-virtual-node
spec:
objectLabels:
matchLabels:
app: nginx
effect:
annotations:
ccse.daliqc.cn/eci-image-cache: "true"
labels:
eci-schedulable: "true"
policy:
virtualNodeOnly: {}
priority: 99spec中的相關參數說明如下:
| 名稱 | 描述 |
|---|---|
| objectLabels.matchLabels | 要匹配的Pod Label。 |
| namespaceLabels.matchLabels | 要匹配的Namespace Label。 |
| effect.annotations | 要添加的Annotation。 |
| effect.labels | 要添加的Label。 |
| policy | 調度策略。支持以下幾種:fair、nromalNodeOnly、normalNodePrefer、virtualNodeOnly。 |
| priority | 優先級。存在多個Selector且發生沖突時,優先級高的Selector會生效。數值越大,表示該Selector優先級越高。 |
說明
objectLabels和namespaceLabels中,至少要選擇一個配置。如果同時配置了兩者,則Pod需要同時匹配兩者。
調度失敗再次自動調度到VNode
默認開啟調度失敗再次自動調度到VNode功能,當集群中真實節點(即ECS節點)計算資源不足時,將Pod調度到虛擬節點。即在Pod調度時,如果沒有匹配的node節點,會把調度失敗的Pod重新調度到ECI上。
可設置環境變量VNODE_AUTO_SCALER來關閉調度失敗再次調度到VNode功能:
...
env:
- name: VNODE_AUTO_SCALER
value: "true"
...3、手工調度配置示例
配置示例一:配置Pod Label
為pod添加ccse.daliqc.cn/vnode=true的Label,cubevk-profile會為該pod添加VNode Toleration和NodeSelector,將Pod調度到ECI上運行。
準備測試Pod的yaml文件:
apiVersion: v1
kind: Pod
metadata:
name: test-nginx-manual-virtual
labels:
ccse.daliqc.cn/vnode: "true" #添加特定Label
spec:
containers:
- name: nginx
image: lengbuleng/nginx:1.14.2
ports:
- containerPort: 80配置示例二:配置Namespace Label
創建一個Namespace并添加ccse.daliqc.cn/vnode=true的Label,cubevk-profile會為該Namespace下的pod添加VNode Toleration和NodeSelector,則該Namespace下的所有Pod將調度到ECI上運行。
創建命名空間:
kubectl create ns vk給命名空間添加特定標簽:
kubectl label ns vk ccse.daliqc.cn/vnode="true"準備測試Pod的yaml文件:
apiVersion: v1
kind: Pod
metadata:
name: test-nginx-manual-virtual-ns
namespace: vk #指定添加了特定Label的Namespace
spec:
containers:
- name: nginx
image: lengbuleng/nginx:1.14.2
ports:
- containerPort: 804、自動調度配置示例
配置示例一:virtualNodeOnly調度
創建以下Selector,cubevk-profile會為帶有app: nginx Label的Pod添加VNode Toleration和NodeSelector,同時添加effect中定義的Annotation和Label到Pod。
創建selector自定義資源對象,selector-virtual.yaml的內容如下:
apiVersion: eci.daliqc.cn/v1
kind: Selector
metadata:
name: test-auto-virtual-node
spec:
objectLabels:
matchLabels:
app: nginx
effect:
annotations:
ccse.daliqc.cn/eci-image-cache: "true"
labels:
eci-schedulable: "true"
policy:
virtualNodeOnly: {}創建selector資源對象:
kubectl apply -f selector-virtual.yaml準備測試Pod的yaml文件,nginx-virtual.yaml的內容如下:
apiVersion: v1
kind: Pod
metadata:
name: test-nginx-auto-virtual
labels:
app: nginx
spec:
containers:
- name: nginx
image: lengbuleng/nginx:1.14.2
ports:
- containerPort: 80創建pod:
kubectl apply -f nginx-normal.yaml配置示例二:normalNodePrefer調度
創建以下Selector,首先kube-scheduler默認只會調度pod到標準節點;當標準節點資源不足時導致調度失敗時,cubevk-profile會為帶有app: nginx-normal Label的Pod添加VNode Toleration,再次由kube-scheduler決定調度,同時添加effect中定義的Annotation和Label到Pod。
創建selector自定義資源對象,selector-normal.yaml的內容如下:
apiVersion: eci.daliqc.cn/v1
kind: Selector
metadata:
name: test-auto-virtual-node-normal
spec:
objectLabels:
matchLabels:
app: nginx-normal
effect:
annotations:
ccse.daliqc.cn/eci-image-cache: "true"
labels:
eci-schedulable: "true"
policy:
normalNodePrefer: {}配置示例三:fair調度
創建以下Selector,cubevk-profile會為帶有app: nginx-fair Label的Pod添加VNode Toleration,由kube-scheduler決定調度,同時添加effect中定義的Annotation和Label到Pod。
創建selector自定義資源對象,selector-fair.yaml的內容如下:
apiVersion: eci.daliqc.cn/v1
kind: Selector
metadata:
name: test-auto-virtual-node-fair
spec:
objectLabels:
matchLabels:
app: nginx-fair
effect:
annotations:
ccse.daliqc.cn/eci-image-cache: "true"
labels:
eci-schedulable: "true"
policy:
fair: {}配置示例四:normalNodeOnly調度
不需創建selector,默認情況下kube-scheduler只會調度pod到標準節點;也可以創建以下Selector,cubevk-profile會為帶有app: nginx-ecs Label的Pod添加effect中定義的Annotation和Label,由kube-scheduler決定調度。
創建selector自定義資源對象,selector-ecs.yaml的內容如下:
apiVersion: eci.daliqc.cn/v1
kind: Selector
metadata:
name: test-nginx-ecs
spec:
objectLabels:
matchLabels:
app: nginx-ecs
effect:
annotations:
ccse.daliqc.cn/image-cache: "true"
labels:
ccse-ecs: "true"
policy:
normalNodeOnly: {}5、調度失敗再次自動調度到虛擬節點示例
步驟一:在安裝cubevk-profile插件時,添加環境變量VNODE_AUTO_SCALER="true",不添加環境變量默認為開啟,關閉需修改VNODE_AUTO_SCALER="false"。例如使用helm安裝插件時,修改values.yaml:
...
vnodeAutoScaler: "true"
..步驟二:確認節點資源使用情況。
當真實節點計算資源不足時,cubevk-profile才會將創建失敗的Pod自動調度到虛擬節點上。驗證pod調度失敗再次自動調度到虛擬節點的效果前,可以先確認節點資源使用情況。假設采用的示例環境如下:
真實節點:1臺ECS,名稱為master(4 vCPU 8 GiB內存),已部署1個deployment,CPU請求接近100%。
虛擬節點:1個,名稱為vnd-0002,未部署工作負載。
步驟三:部署deployment。
準備YAML文件,deployment-autoscaler.yaml的內容示例如下,配置副本數(replicas)為2,每個副本的容器聲明了4 vCPU 8 GiB的計算資源:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-autoscaler
labels:
app: nginx-autoscaler
spec:
replicas: 2
selector:
matchLabels:
app: nginx-autoscaler
template:
metadata:
labels:
app: nginx-autoscaler
spec:
containers:
- name: nginx
image: lengbuleng/nginx:1.14.2
ports:
- containerPort: 80
resources:
requests:
cpu: 4
memory: 8G創建deployment:
kubectl create -f deployment-autoscaler.yaml步驟四:確認Pod調度情況。
查看Pod運行情況:
kubectl get pods -o wide返回示例如下,可以看到步驟三創建的Pod均運行在虛擬節點上:
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-autoscaler-7cf75fcc46-pss4s 0/1 ProviderFailed 0 19s <none> vnd-0002 <none> <none>nginx-deployment-autoscaler-7cf75fcc46-vhj9k 0/1 ProviderFailed 0 19s <none> vnd-0002 <none> <none>查看Pod的事件信息,查看名為nginx-deployment-autoscaler-7cf75fcc46-pss4s的Pod的信息:
kubectl describe pod nginx-deployment-autoscaler-7cf75fcc46-pss4s返回示例如下,在Events中可以看到由于真實節點計算資源不足,kube-scheduler通過cubevk-profile把Pod調度到了虛擬節點上:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 2m40s default-scheduler 0/3 nodes are available: 1 Insufficient cpu, 1 Insufficient memory, 2 node(s) had untolerated taint {virtual-kubelet.io/provider: cube-eci}. preemption: 0/3 nodes are available: 1 No preemption victims found for incoming pod, 2 Preemption is not helpful for scheduling..
Normal Scheduled 2m39s default-scheduler Successfully assigned default/nginx-deployment-autoscaler-7cf75fcc46-pss4s to vnd-0002
Warning ProviderCreateFailed 2m29s vnd-0002/pod-controller Post "//198.20.2.70:30010/api/openApi/paas/ordervm/api/paas/placeOrder": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
Normal ProviderCreateSuccess 2m20s vnd-0002/pod-controller Create pod in provider successfully