如果您線上下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及其相關資源將加入到安全性群組中。 說明 推薦使用企業安全性群組,並添加以下入方向的安全性群組規則:
| 您可以在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增加 |
pvc update和pvc patch | 更新PVC的Annotation。 | |
endpoints create和endpoints update | 選主保護。 1.13版本以上叢集無需配置。 |
安裝VNodectl
操作前,您需要安裝VNodectl命令列工具。請根據自身環境擷取對應的安裝包並安裝VNodectl。
作業系統 | CPU架構 | 安裝包擷取連結 |
macOS | AMD64 | |
ARM64 | ||
Linux | AMD64 | |
ARM64 | ||
Windows | AMD64 | |
ARM64 |
建議您將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命令均支援添加
--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
產生kubeconfig。
準備叢集相關配置資訊。
配置參數
說明
擷取方式
樣本
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
部署vnode-approver組件。
vnode addon enable vnode-approver
配置叢集產生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
校正叢集是否具備接入VNode的條件。
vnode cluster validate
預期返回如下,kubeconfig預設儲存在
~/.vnode/deploy/kubeconfig
。kubeconfig can't be empty
ServiceAccount
產生kubeconfig。
準備叢集相關配置資訊。
配置參數
說明
擷取方式
樣本
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
配置叢集產生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
校正叢集是否具備接入VNode的條件。
vnode cluster validate
預期返回如下,kubeconfig預設儲存在
~/.vnode/deploy/kubeconfig
。kubeconfig can't be empty
配置~/.vnode/config檔案
~/.vnode/config
檔案包含了VNode的配置資訊,VNodectl啟動並執行時候會讀取該檔案,因此在建立VNode前需要先配置好該檔案。
列印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收取的執行個體費用。更多資訊,請參見基於標籤查詢分賬賬單。
將配置資訊重新導向到指定檔案(
~/.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
查看並確認當前VNode運行讀取的配置資訊。
vnode config
切換context,使VNode運行載入context下的配置。
vnode config set-context <context-name>
建立VNode
建立一個VNode。
vnode create
說明建立時會採用
~/.vnode/config
檔案中的配置進行建立,支援添加參數來配置customResources、clusterDNS和clusterDomain。更多資訊,請參見管理VNode返回樣本如下,其中VirtualNodeId的值即為產生的VNode的ID。
{"RequestId":"AB772F9D-2FEF-5BFD-AAFB-DA3444851F29","VirtualNodeId":"vnd-7xvetkyase7gb62u****"}
查看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
查看節點資訊。
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。
修改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。