在阿里云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.4-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
配置反親和性策略
由于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
后續操作
創建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(手動)。