在阿里雲ECS上自建了Kubernetes叢集並需要接入ECI服務時,您需要在叢集中部署虛擬節點(VNode)。本文介紹在同一VPC下,ECS上自建的Kubernetes叢集如何快速接入VNode,以便使用ECI。
背景資訊
ECI支援無縫整合Kubernetes,可以為Kubernetes提供一種層次化的解決方案:即ECI負責底層Pod容器資源的調度和管理工作,Kubernetes在ECI之上作為PaaS層來管理業務負載。如果您在阿里雲ECS上自建了Kubernetes叢集,可以通過部署虛擬節點(VNode)的方式來使用ECI。更多資訊,請參見自建Kubernetes叢集對接ECI。
前提條件
已在ECS上通過kubeadm自建了Kubernetes叢集,且叢集的版本屬於1.13~1.30版本。
叢集中已部署Flannel、Calico或Cilium網路外掛程式。
安裝VNodectl
為了能夠方便地接入和管理VNode,ECI提供了VNodectl命令列工具。建議您將VNodectl安裝在Kubernetes叢集的master節點上。
串連叢集。
下載安裝包。
wget https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnodectl_0.0.5-beta_linux_amd64.tar.gz -O vnodectl.tar.gz
解壓安裝包。
tar xvf vnodectl.tar.gz
複製vnodectl到指定目錄。
cp vnodectl /usr/local/bin/vnode
配置~/.vnode/config檔案
修改
~/.vnode/config
檔案內容。vim ~/.vnode/config
請根據實際修改
~/.vnode/config
檔案內容,以下為樣本:重要kubeconfig需具有
cluster-admin
許可權。如果您想要使用更小許可權的kubeconfig,請參見配置叢集。請確保使用的kubeconfig檔案中的apiserver地址能被Vnode訪問。
kind: vnode contexts: - name: default # context名稱 region-id: cn-hangzhou # 地區ID access-key-id: LTAI5tJbBkHcHBUmuP7C**** # AccessKey ID access-key-secret: 5PlpKJT6sgLcD4f9y5pACNDbEg**** # AccessKey Secret, vswitch-id: vsw-7xv2yk45qp5etidgf**** # VNode所屬交換器ID security-group-id: sg-7xv5tcch4kjdr65t**** # VNode所屬安全性群組ID kubeconfig: /path/to/kubeconfig # 叢集kubeconfig檔案 current-context: default
使VNode運行載入context下的配置。
vnode config set-context <context-name>
建立Vnode
建立一個VNode。
vnode create
返回樣本如下,其中VirtualNodeId的值即為產生的VNode的ID。
{"RequestId":"AB772F9D-2FEF-5BFD-AAFB-DA3444851F29","VirtualNodeId":"vnd-7xvetkyase7gb62u****"}
查看節點資訊。
kubectl get node
返回樣本如下,可以看到叢集中已接入VNode。
NAME STATUS ROLES AGE VERSION cn-hangzhou.vnd-7xvetkyase7gb62u**** Ready agent 174m v1.20.6 vnode-test001 Ready control-plane,master 23h v1.20.6 vnode-test002 Ready <none> 22h v1.20.6
禁止DaemonSet調度到VNode
由於VNode不是真實節點,因此無法運行DaemonSet。建立VNode後,您需要修改kube-proxy的DaemonSet,配置nodeAffinity來禁止DaemonSet調度到VNode。
修改DaemonSet配置。
kubectl -n kube-system edit ds kube-proxy
配置nodeAffinity。
在spec>template>spec下添加以下YAML:
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: type operator: NotIn values: - virtual-kubelet
調度Pod到VNode
建立VNode後,您可以通過以下方式將Pod調度到VNode上,以使用ECI來運行Pod。
手動調度
通過配置nodeSelector和tolerations、指定nodeName的方式,可以手動將Pod調度到VNode。具體操作,請參見將Pod調度到VNode。
自動調度
部署eci-profile組件後,可以自訂配置Selector,將滿足條件的Pod自動調度到VNode。具體操作,請參見使用eci-profile調度Pod到VNode。
打通Pod網路
調度到VNode上的ECI Pod將佔用所屬VPC下交換器的一個彈性網卡資源,預設具備一個內網IP地址。
預設情況下,ECI Pod無法訪問自建叢集Overlay網路(Flannel、Calico或Cilium)中的Pod,但自建叢集Overlay網路中的Pod是可以訪問ECI Pod的。如果ECI Pod需要訪問自建叢集Overlay網路中的Pod,需要在所屬VPC的路由表中增加路由條目,使得從ECI Pod出去的資料包可以通過該路由條目,正確路由到自建叢集對應的ECS節點上。
配置樣本如下:
樣本情境
假設叢集中有2個Pod,1個運行在VNode上(test1 ),1個運行在ECS節點上(test2)。預設情況下,test2可以訪問test1,但test1無法訪問test2。
NAME READY RESTARTS AGE IP NODE NOMINATED NODE READINESS NODE test1 1/1 0 58s 192.168.0.245 cn-hangzhou.vnd-7xvetkyase7gb62u**** <none> <none> test2 1/1 0 35s 10.88.1.4 vnode-test002 <none> <none>
操作步驟
登入專用網路管理主控台。
在左側導覽列,單擊路由表。
切換地區,找到Pod所屬VPC對應的路由表,單擊路由表ID。
在路由條目列表頁簽下,單擊自訂路由條目頁簽。
單擊添加路由條目。
在彈出的對話方塊中,配置路由條目,然後單擊確定。
以樣本情境為例:
目標網段:輸入ECS節點所在的交換器網段。例如10.88.1.0/24。
下一跳類型:選擇ECS執行個體。
ECS執行個體:選擇ECS節點。
結果驗證
通過
kubectl exec
命令進入test-pod-1的容器內執行ping
命令,如果可以Ping通test2的IP,則表示已經打通Pod網路,test1可以訪問test2。
相關文檔
更多關於自建Kubernetes叢集通過VNodectl接入VNode的資訊,請參見接入VNode(VNodectl工具)。
如果不想安裝VNodectl,您也可以通過控制台或者OpenAPI來接入VNode。更多資訊,請參見接入VNode(手動)。