全部產品
Search
文件中心

Elastic Container Instance:接入VNode(手動)

更新時間:Jul 18, 2024

如果您線上下IDC或者阿里雲ECS上自建了Kubernetes叢集,您需要在叢集中部署虛擬節點(VNode)來使用ECI。本文為您介紹如何配置認證並手動建立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版本以上叢集無需配置。

配置叢集

VNode需要使用kubeconfig來接入叢集。因此,建立VNode前需要為VNode簽發認證(即kubeconfig)。

說明

如果使用叢集admin認證,可跳過本節。

  1. 串連叢集。

  2. 下載並執行配置指令碼,產生kubeconfig。

    選擇TLS Bootstrap或ServiceAccount方式,根據您的Kubernetes叢集的版本執行對應命令產生kubeconfig。

    TLS Bootstrap

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

    • 叢集版本為1.14~1.22

      curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | bash -s -- bootstrap
    • 叢集版本為1.13

    • 1.13版本的叢集需要endpoints資源進行選主,指令碼中需配置額外許可權(EXTRA_PRIVILEDGE=true)。

    • curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | env EXTRA_PRIVILEDGE=true bash -s -- bootstrap

    ServiceAccount

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

    • 叢集版本為1.14~1.22

      curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | bash -s -- common
    • 叢集版本為1.13

      1.13版本的叢集需要endpoints資源進行選主,指令碼中需配置額外許可權(EXTRA_PRIVILEDGE=true)。

      curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | env EXTRA_PRIVILEDGE=true bash -s -- common
  3. 檢查kubeconfig。

    產生的kubeconfig名為vnode-config。執行以下命令查看kubeconfig。

    cat vnode-config

    檢查時,請注意以下幾點:

    • 確認待建立VNode的VPC網路能夠串連到server地址(處於同一VPC或已打通網路)。

      • 如果server地址是IP地址,需確保VNode所在VPC能夠訪問該IP地址。

      • 如果server地址是網域名稱,需確保阿里雲VPC內能夠解析該網域名稱,且VNode所在VPC可以訪問網域名稱解析後的IP地址。

    • 如果certificate-authority-data的內容為空白,請檢查~/.kube/config中的相應欄位是否使用了PATH。

    kubeconfig的內容樣本如下:

    TLS Bootstrap

    apiVersion: v1
    kind: Config
    current-context: kubernetes-admin@kubernetes
    contexts:
    - name: kubernetes-admin@kubernetes
      context:
        cluster: kubernetes-admin@kubernetes
        user: vnode
        namespace: kube-system
    clusters:
    - name: kubernetes-admin@kubernetes
      cluster:
        certificate-authority-data: "*****************************************=="
        server: https://10.16.XX.XX:6443
    users:
    - name: vnode
      user:
        token: ******.****************

    ServiceAccount

    apiVersion: v1
    kind: Config
    current-context: kubernetes-admin@kubernetes
    contexts:
    - name: kubernetes-admin@kubernetes
      context:
        cluster: kubernetes-admin@kubernetes
        user: vnode
        namespace: kube-system
    clusters:
    - name: kubernetes-admin@kubernetes
      cluster:
        certificate-authority-data: "*****************************************=="
        server: https://10.16.XX.XX:6443
    users:
    - name: vnode
      user:
        token: ***********************************************

建立VNode

操作步驟

您可以通過Elastic Container Instance控制台或者OpenAPI來建立VNode。

控制台

  1. 登入Elastic Container Instance控制台

  2. 在頂部功能表列,選擇地區。

  3. 在左側導覽列,選擇虛擬節點

  4. 單擊建立虛擬節點

  5. 完成相關參數配置,單擊確定

    相關參數說明如下:

    參數

    描述

    專用網路、交換器、安全性群組

    VNode所屬的專用網路、交換器和安全性群組。請參考準備工作建立。

    KubeConfig

    VNode要串連的Kubernetes叢集的kubeconfig。請參考配置叢集步驟產生。

    TlsBootstrapEnabled

    是否啟用TLS啟動引導。

    如果您使用TLS Bootstrap方式產生了kubeconfig,請啟用該配置。啟用該配置後,將同步啟用認證輪換,VNode將在當前認證即將到期時,自動申請新的認證。

    標籤

    VNode綁定的標籤資訊。

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

    汙點

    VNode綁定的汙點資訊。

    資源群組

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

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

OpenAPI

您可以調用CreateVirtualNode建立VNode,需要注意的參數如下表所示,更多資訊,請參見CreateVirtualNode

名稱

類型

樣本值

描述

RegionId

String

cn-shanghai

地區ID。

VSwitchId

String

vsw-2ze23nqzig8inprou****

交換器ID。VNode以及VNode下的ECI執行個體所使用的交換器。

支援指定多個(最小1個,最多10個)屬於同一VPC的交換器。

SecurityGroupId

String

sg-2ze81zoc3yl7a3we****

安全性群組ID。VNode以及該VNode下的ECI執行個體將加入到該安全性群組中。

KubeConfig

String

JTVDbmFwaVZlcnNpb24lM0ElMjB2MSU1Q25jbHVzdGVycyUzQSU1Q24tJTIwY2x1c3RlciUzQSU1Q24uLi******

VNode要串連的Kubernetes叢集的kubeconfig。需進行Base64編碼後傳入。

TlsBootstrapEnabled

Boolean

true

是否啟用TLS啟動引導。如果您使用TLS Bootstrap方式產生了kubeconfig,請啟用該配置。啟用該配置後,將同步啟用認證輪換,VNode將在當前認證即將到期時,自動申請新的認證。

查看結果

建立後等待一段時間,您可以登入Kubernetes叢集,執行kubectl get nodes命令查看節點資訊。

  • 如果可以查詢到VNode,則表示建立成功。預期返回如下:

    vnode1

  • 如果查詢不到VNode,則表示建立失敗。建議您根據VNode相關事件排查問題。

    Elastic Container Instance控制台虛擬節點頁面,單擊目標虛擬節點ID,在事件頁簽下可以查看該VNode的事件。

    常見的事件錯誤如下:

    • failed to get kubernetes server version, Get \"https://10.50.XX.XX:6443/version?timeout=32s\": net/http: request canceled (Client.Timeout exceeded while awaiting headers

      表示VNode所在VPC無法串連到Kubernetes API Server的IP,需確認VNode與API Server是否處於同一VPC,如果不屬於同一VPC,需確保已打通網路。

    • failed to get kubernetes server version, Get \"https://lb.kubesphere.local:6443/version?timeout=32s\": dial tcp: lookup lb.kubesphere.local on 100.100.X.:53: no such host

      表示VPC內無法解析Kubernetes API Server的網域名稱,可以配置PrivateZone,增加相應網域名稱的解析。

說明

在使用VNode對接自建Kubernetes叢集的過程中遇到任何需求或問題時,歡迎使用DingTalk搜尋群號44666389,加入VNode客戶支援群。

禁止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