如果您在線下IDC或者阿里云ECS上自建了Kubernetes集群,您需要在集群中部署虛擬節點(VNode)來使用ECI。本文為您介紹如何配置證書并手動創建VNode,以便在自建Kubernetes集群中可以使用ECI。
前提條件
準備工作
操作前,請準備創建VNode所需的參數信息,并了解VNode所需的權限信息。需要準備的參數如下表所示。
參數 | 描述 | 操作 |
地域(Region) | 地域指的是物理的數據中心。請根據您以及您目標用戶所在的地理位置,資源價格等因素選擇合適的地域。更多信息,請參見地域和可用區。 ECI及其相關資源將創建在選擇的地域下。 | 您可以通過彈性容器實例控制臺或者調用DescribeRegions獲取ECI支持的地域信息。 |
專有網絡(VPC) | 專有網絡是您基于阿里云創建的自定義私有網絡,不同的專有網絡之間邏輯上徹底隔離。更多信息,請參見什么是專有網絡。 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版本以上集群無需配置。 |
配置集群
VNode需要使用kubeconfig來接入集群。因此,創建VNode前需要為VNode簽發證書(即kubeconfig)。
如果使用集群admin證書,可跳過本節。
連接集群。
下載并執行配置腳本,生成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
檢查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
操作步驟
您可以通過彈性容器實例控制臺或者OpenAPI來創建VNode。
控制臺
登錄彈性容器實例控制臺。
在頂部菜單欄,選擇地域。
在左側導航欄,選擇虛擬節點。
單擊創建虛擬節點。
完成相關參數配置,單擊確定。
相關參數說明如下:
參數
描述
專有網絡、交換機、安全組
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,則表示創建成功。預期返回如下:
如果查詢不到VNode,則表示創建失敗。建議您根據VNode相關事件排查問題。
在彈性容器實例控制臺的虛擬節點頁面,單擊目標虛擬節點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集群的過程中遇到任何需求或問題時,歡迎使用釘釘搜索群號44666389,加入VNode客戶支持群。
禁止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。