全部產品
Search
文件中心

Elastic Container Instance:在基於ECS自建的Kubernetes叢集中整合VNode以接入ECI服務

更新時間:Jul 18, 2024

在阿里雲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節點上。

  1. 串連叢集。

  2. 下載安裝包。

    wget https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnodectl_0.0.5-beta_linux_amd64.tar.gz -O vnodectl.tar.gz 
  3. 解壓安裝包。

    tar xvf vnodectl.tar.gz 
  4. 複製vnodectl到指定目錄。

    cp vnodectl /usr/local/bin/vnode

配置~/.vnode/config檔案

  1. 修改~/.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
  2. 使VNode運行載入context下的配置。

    vnode config set-context <context-name>

建立Vnode

  1. 建立一個VNode。

    vnode create

    返回樣本如下,其中VirtualNodeId的值即為產生的VNode的ID。

    {"RequestId":"AB772F9D-2FEF-5BFD-AAFB-DA3444851F29","VirtualNodeId":"vnd-7xvetkyase7gb62u****"}
  2. 查看節點資訊。

    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。

  1. 修改DaemonSet配置。

    kubectl -n kube-system edit ds kube-proxy
  2. 配置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>
  • 操作步驟

    1. 登入專用網路管理主控台

    2. 在左側導覽列,單擊路由表

    3. 切換地區,找到Pod所屬VPC對應的路由表,單擊路由表ID。

    4. 路由條目列表頁簽下,單擊自訂路由條目頁簽。

    5. 單擊添加路由條目

    6. 在彈出的對話方塊中,配置路由條目,然後單擊確定

      以樣本情境為例:

      • 目標網段:輸入ECS節點所在的交換器網段。例如10.88.1.0/24。

      • 下一跳類型:選擇ECS執行個體

      • ECS執行個體:選擇ECS節點。

  • 結果驗證

    通過kubectl exec命令進入test-pod-1的容器內執行ping命令,如果可以Ping通test2的IP,則表示已經打通Pod網路,test1可以訪問test2。

相關文檔