全部產品
Search
文件中心

Elastic Container Instance:接入VNode(VNodectl工具)

更新時間:Jul 18, 2024

如果您線上下IDC或者阿里雲ECS上自建了Kubernetes叢集,您需要在叢集中部署虛擬節點(VNode)來使用ECI。為了能夠方便地接入和管理VNode,ECI提供了VNodectl命令列工具。本文為您介紹如何使用VNodectl工具自動建立VNode,以便在自建Kubernetes叢集中可以使用ECI。

前提條件

  • 已部署好Kubernetes叢集,且叢集的版本屬於1.13~1.30版本。

  • 如果您的Kubernetes叢集部署線上下IDC,請確保已通過Express Connect、Smart Access Gateway或者VPN網關打通IDC和雲上網路。相關參考如下:

準備工作

操作前,請準備建立VNode所需的參數資訊,並瞭解VNode所需的許可權資訊。需要準備的參數如下表所示。

參數

描述

操作

地區(Region)

地區指的是物理的資料中心。請根據您以及您目標使用者所在的地理位置,資源價格等因素選擇合適的地區。更多資訊,請參見地區和可用性區域

ECI及其相關資源將建立在選擇的地區下。

您可以通過Elastic Container Instance控制台或者調用DescribeRegions擷取ECI支援的地區資訊。

Virtual Private Cloud

專用網路是您基於阿里雲建立的自訂私人網路,不同的專用網路之間邏輯上徹底隔離。更多資訊,請參見什麼是專用網路

ECI及其相關資源將建立在您配置的專用網路中。

說明

如果您的Kubernetes叢集部署線上下IDC,請確保IDC網路與該VPC網路之間已實現網路互連。

您可以在專用網路控制台專用網路頁面建立並查看專用網路。

交換器(vSwitch)

交換器是組成專用網路的基礎網路裝置。交換器可以串連不同的雲資源。在專用網路中建立ECI及其相關資源時,需要指定交換器(支援指定多個,系統將自動選擇)。

您可以在專用網路控制台交換器頁面建立並查看交換器,根據已選的VPC來選擇對應的交換器。

安全性群組(Security Group)

安全性群組是一種虛擬防火牆,可以控制組內資源的進出流量,從而提高網路安全性。更多資訊,請參見安全性群組概述

ECI及其相關資源將加入到安全性群組中。

說明

推薦使用企業安全性群組,並添加以下入方向的安全性群組規則:

  • 允許VPC對應網段訪問全部連接埠(1/65535)。

  • 允許K8s API Server對應地址訪問VNode服務連接埠(10250和10255連接埠)。

您可以在ECS管理主控台安全性群組頁面建立並查看安全性群組,根據已選的VPC來選擇對應的安全性群組。

建立VNode時,需要配置相關許可權,包括原生K8s節點使用的標準許可權,以及VNode所需的額外許可權,具體如下表所示。

類型

許可權

說明

標準許可權

system:node

Node標準許可權。

system:node-proxier

kube-proxy標準許可權。

system:certificates.k8s.io:certificatesigningrequests:nodeclient

Node發起建立認證請求的許可權。

system:certificates.k8s.io:certificatesigningrequests:selfnodeclient

Node基於已有認證發起建立認證請求的許可權,即認證輪換許可權。

額外許可權

pods update和pods patch

更新Pod的Annotation。例如為Pod增加k8s.aliyun.com/eci-instance-id等Computed Annotation。

pvc update和pvc patch

更新PVC的Annotation。

endpoints create和endpoints update

選主保護。

1.13版本以上叢集無需配置。

安裝VNodectl

操作前,您需要安裝VNodectl命令列工具。請根據自身環境擷取對應的安裝包並安裝VNodectl。

作業系統

CPU架構

安裝包擷取連結

macOS

AMD64

macOS_AMD64

ARM64

macOS_ARM64

Linux

AMD64

Linux_AMD64

ARM64

Linux_ARM64

Windows

AMD64

Windows_AMD64

ARM64

Windows_ARM64

建議您將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命令均支援添加--dry進行用戶端校正。

  • 執行vnode命令的過程中,如果遇到API版本相容的錯誤,請添加--kubernetes-version明確指定叢集的K8s版本。

配置叢集

VNode需要使用kubeconfig來接入叢集。因此,建立VNode前需要為VNode簽發認證(即kubeconfig)。配置方式分為TLS Bootstrap方式和ServiceAccount方式。

說明
  • 如果有安全性要求,建議採用TLS Bootstrap方式。採用該方式時,將自動部署vnode-approver組件。vnode-approver組件用於簽發Vnode提交的CSR請求,目前已開源至GitHub。更多資訊,請參見vnode-approver

  • ServiceAccount方式不支援認證輪換。簽發認證時需確保token有足夠的有效期間(或者設定為不到期),防止因認證到期導致VNode無法正常工作。

TLS Bootstrap

  1. 產生kubeconfig。

    1. 準備叢集相關配置資訊。

      配置參數

      說明

      擷取方式

      樣本

      kubeconfig

      用於配置VNode在叢集中所需要的許可權。

      預設路徑為~/.kube/config。您也可以使用其它kubeconfig。

      /path/to/kubeconfig

      叢集CA

      用於產生VNode串連到叢集所需要的kubeconfig。可直接使用具有admin許可權的kubeconfig中的CA,建議使用啟動apiserver時傳入的CA。

      執行ps aux | grep apiserver命令,從返回資訊中擷取--client-ca-file的值。

      /path/to/ca.crt

      apiserver地址

      用於叢集通訊、認證、鑒權等。

      列印kubeconfig,從返回資訊中可擷取apiserver地址。

      https://8.134.XX.XX:6443

      tokenId

      用於產生TLS Bootstrap token,建立Bootstrap token secret。

      自訂,6位元字字母組合字元串。

      eci123

      tokenSecret

      自訂,16位元字字母組合字元串。

      eci1233333333333

    2. 部署vnode-approver組件。

      vnode addon enable vnode-approver
    3. 配置叢集產生kubeconfig。

      請根據實際叢集配置資訊替換命令中的參數值。樣本如下:

      vnode cluster setup --kubeconfig  /path/to/kubeconfig  --bootstrap --bootstrap-token-id <token-id> --bootstrap-token-secret <token-secret> --apiserver-address https://8.134.XX.XX:6443 --cluster-ca-path  /path/to/ca.crt

      如果叢集版本低於1.14,命令中請附帶叢集版本,樣本如下:

      vnode cluster setup --kubernetes-version v1.13.0 --kubeconfig  /path/to/kubeconfig --bootstrap --bootstrap-token-id eci123 --bootstrap-token-secret eci1233333333333  --apiserver-address https://8.134.XX.XX:6443 --cluster-ca-path /etc/kubernetes/pki/ca.crt
  2. 校正叢集是否具備接入VNode的條件。

    vnode cluster validate

    預期返回如下,kubeconfig預設儲存在~/.vnode/deploy/kubeconfig

    kubeconfig can't be empty

ServiceAccount

  1. 產生kubeconfig。

    1. 準備叢集相關配置資訊。

      配置參數

      說明

      擷取方式

      樣本

      kubeconfig

      用於配置VNode在叢集中所需要的許可權。

      預設路徑為~/.kube/config。您也可以使用其它kubeconfig。

      /path/to/kubeconfig

      叢集CA

      用於產生 VNode串連到叢集所需要的kubeconfig。可直接使用具有admin許可權的kubeconfig中的CA,建議使用啟動apiserver時傳入的CA。

      執行ps aux | grep apiserver命令,從返回資訊中擷取--client-ca-file的值。

      /path/to/ca.crt

      apiserver地址

      用於叢集通訊、認證、鑒權等。

      列印kubeconfig,從返回資訊中可擷取apiserver地址。

      https://8.134.XX.XX:6443

    2. 配置叢集產生kubeconfig。

      請根據實際叢集配置資訊替換命令中的參數值。樣本如下:

      vnode cluster setup --kubeconfig /path/to/kubeconfig --apiserver-address https://8.134.XX.XX:6443 --cluster-ca-path /path/to/ca.crt

      如果叢集版本低於1.14,命令中請附帶叢集版本,樣本如下:

      vnode cluster setup --kubernetes-version v1.13.0 --kubeconfig /path/to/kubeconfig --apiserver-address https://8.134.XX.XX:6443 --cluster-ca-path /etc/kubernetes/pki/ca.crt 
  2. 校正叢集是否具備接入VNode的條件。

    vnode cluster validate

    預期返回如下,kubeconfig預設儲存在~/.vnode/deploy/kubeconfig

    kubeconfig can't be empty

配置~/.vnode/config檔案

~/.vnode/config檔案包含了VNode的配置資訊,VNodectl啟動並執行時候會讀取該檔案,因此在建立VNode前需要先配置好該檔案。

  1. 列印VNode運行所需的配置資訊。

    vnode config default

    配置資訊中contexts下各欄位說明如下:

    欄位

    是否必填

    說明

    name

    context名稱。

    vnode-name

    VNode名稱,建議不配置,由系統自動產生可保證唯一性

    region-id

    VNode所屬地區。請參考準備工作選擇。

    access-key-id

    調用阿里雲API時需要使用AccessKey完成身分識別驗證。AccessKey包括AccessKey ID和AccessKey Secret,需要一起使用。更多資訊,請參見建立AccessKey

    access-key-secret

    vswitch-id

    VNode所屬交換器,可配置多個。請參考準備工作建立。

    security-group-id

    VNode所屬安全性群組。請參考準備工作建立。

    resource-group-id

    VNode所屬資源群組。

    資源群組是在阿里雲帳號下進行資源分組管理的一種機制。每個帳號有一個預設資源群組。更多資訊,請參見資源管理

    如果沒有指定資源群組,則VNode將加入到預設資源群組中。

    kubeconfig

    VNode接入叢集時所需的kubeconfig檔案路徑。完成配置叢集操作後會自動產生,預設路徑為~/.vnode/deploy/kubeconfig

    taints

    VNode綁定的汙點資訊。

    tags

    VNode綁定的標籤資訊。

    標籤可用於賬單分賬管理,為VNode綁定自訂標籤後,在查看費用分析時,可以通過該標籤篩選出VNode收取的執行個體費用。更多資訊,請參見基於標籤查詢分賬賬單

  2. 將配置資訊重新導向到指定檔案(~/.vnode/config),並配置各欄位。

    vnode config default > ~/.vnode/config
    vim ~/.vnode/config

    請根據自身需求修改~/.vnode/config檔案內容,以下樣本僅配置了必要欄位。

    kind: vnode
    contexts:
        - name: default
          region-id: cn-guangzhou
          access-key-id: LTAI5tJbBkHcHBUmuP7C****
          access-key-secret: 5PlpKJT6sgLcD4f9y5pACNDbEg****
          vswitch-id: vsw-7xv2yk45qp5etidgf****
          security-group-id: sg-7xv5tcch4kjdr65t****
          kubeconfig: ~/.vnode/deploy/kubeconfig
    current-context: default
  3. 查看並確認當前VNode運行讀取的配置資訊。

    vnode config
  4. 切換context,使VNode運行載入context下的配置。

    vnode config set-context <context-name>

建立VNode

  1. 建立一個VNode。

    vnode create
    說明

    建立時會採用~/.vnode/config檔案中的配置進行建立,支援添加參數來配置customResources、clusterDNS和clusterDomain。更多資訊,請參見管理VNode

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

    {"RequestId":"AB772F9D-2FEF-5BFD-AAFB-DA3444851F29","VirtualNodeId":"vnd-7xvetkyase7gb62u****"}
  2. 查看VNode狀態。

    vnode list

    返回樣本如下,當STATUS為Ready時,表示VNode建立成功。

    VNODE ID                    VNODE NAME                                   CREATED          STATUS    SCHEDULABLE ZONES
    vnd-7xvetkyase7gb62u****    vnode-cn-guangzhou-a-7xvetkyase7gb62u****    2 minutes ago    Ready     cn-guangzhou-a
  3. 查看節點資訊。

    kubectl get node

    返回樣本如下,可以看到叢集中已接入VNode。

    NAME                                    STATUS     ROLES                  AGE    VERSION
    cn-guangzhou.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

相關文檔