ACK One註冊叢集功能允許您將本機資料中心或其他雲廠商的Kubernetes叢集接入阿里雲Container Service管理平台,實現叢集及資源的統一管理,快速搭建混合雲環境。當本機資料中心的計算資源受限時,您可以通過雲上節點池功能,擴充雲端計算資源,從而滿足業務的增長需求。本文介紹如何建立雲上節點池所需要的自訂指令碼。
前提條件
已建立ACK One註冊叢集,並已將本機資料中心自建Kubernetes叢集接入ACK One註冊叢集。具體操作,請參見建立ACK One註冊叢集。
本機資料中心自建Kubernetes叢集的網路與雲上ACK One註冊叢集使用的Virtual Private Cloud互連。具體操作,請參見情境化組網實現多VPC互聯。
本機資料中心自建Kubernetes叢集必須使用私網方式匯入代理配置接入ACK One註冊叢集。具體操作,請參見將目的地組群接入ACK One註冊叢集。
操作步驟
需要根據您的自身環境和上圖中的判斷條件,最終確定您使用自訂指令碼還是擷取節點樣本指令碼。
樣本指令碼僅支援基於yum軟體包管理系統的作業系統。
步驟一(A):為自訂指令碼添加阿里雲環境變數
檢查是否為GPU節點(可選)。
當通過節點池添加ECS節點的時候,出於業務的需要,可能需要GPU節點,可以通過如下的指令碼來判斷節點是否為GPU節點。
#!/bin/bash # 檢查lspci是否安裝 if ! which lspci &>/dev/null; then yum -y install pciutils fi # 檢查節點是否存在GPU裝置 if lspci | grep -i nvidia &>/dev/null; then echo "該節點為GPU節點,請安裝相關驅動。" fiGPU節點不同於普通的ECS節點,需要安裝驅動包、device plugin以及配置運行時等。相關操作,請參見GPU節點安裝新版本驅動。
您需要提前準備自訂指令碼,以確保註冊叢集的節點池能夠正確同步節點狀態,並滿足雲上調度需求。自訂指令碼必須接收阿里雲註冊叢集下發的系統內容變數。接收系統內容變數的方法取決於叢集的搭建方式。目前,Kubernetes叢集的搭建方式主要有kubeadm方式和二進位方式。
kubeadm方式搭建Kubernetes叢集
kubeadm方式為官方推薦方式,該方式下Kubernetes叢集是通過官方工具kubeadm搭建。您需要在自訂添加節點的指令碼中追加以下內容。
.... ####### <新增部分。 # 配置Node Labels,Taints,Node Name,Provider ID。 KUBELET_CONFIG_FILE="/etc/sysconfig/kubelet" if [[ $ALIBABA_CLOUD_LABELS != "" ]];then option="--node-labels" if grep -- "${option}=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@${option}=@${option}=${ALIBABA_CLOUD_LABELS},@g" $KUBELET_CONFIG_FILE elif grep "KUBELET_EXTRA_ARGS=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@KUBELET_EXTRA_ARGS=@KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_LABELS} @g" $KUBELET_CONFIG_FILE else sed -i "/^\[Service\]/a\Environment=\"KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_LABELS}\"" $KUBELET_CONFIG_FILE fi fi if [[ $ALIBABA_CLOUD_TAINTS != "" ]];then option="--register-with-taints" if grep -- "${option}=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@${option}=@${option}=${ALIBABA_CLOUD_TAINTS},@g" $KUBELET_CONFIG_FILE elif grep "KUBELET_EXTRA_ARGS=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@KUBELET_EXTRA_ARGS=@KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_TAINTS} @g" $KUBELET_CONFIG_FILE else sed -i "/^\[Service\]/a\Environment=\"KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_TAINTS}\"" $KUBELET_CONFIG_FILE fi fi if [[ $ALIBABA_CLOUD_NODE_NAME != "" ]];then option="--hostname-override" if grep -- "${option}=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@${option}=@${option}=${ALIBABA_CLOUD_NODE_NAME},@g" $KUBELET_CONFIG_FILE elif grep "KUBELET_EXTRA_ARGS=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@KUBELET_EXTRA_ARGS=@KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_NODE_NAME} @g" $KUBELET_CONFIG_FILE else sed -i "/^\[Service\]/a\Environment=\"KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_NODE_NAME}\"" $KUBELET_CONFIG_FILE fi fi if [[ $ALIBABA_CLOUD_PROVIDER_ID != "" ]];then option="--provider-id" if grep -- "${option}=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@${option}=@${option}=${ALIBABA_CLOUD_PROVIDER_ID},@g" $KUBELET_CONFIG_FILE elif grep "KUBELET_EXTRA_ARGS=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@KUBELET_EXTRA_ARGS=@KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_PROVIDER_ID} @g" $KUBELET_CONFIG_FILE else sed -i "/^\[Service\]/a\Environment=\"KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_PROVIDER_ID}\"" $KUBELET_CONFIG_FILE fi fi ####### 新增部分>。 # 重啟運行時以及kubelet等。 ....二進位方式搭建Kubernetes叢集
通過Kubernetes二進位檔案來搭建叢集,需要您在自訂指令碼中修改kubelet的啟動配置,以便接收阿里雲註冊叢集的環境變數。
通常情況下,預設的
kubelet.service檔案位於/usr/lib/systemd/system/目錄下。cat >/usr/lib/systemd/system/kubelet.service <<EOF # 忽略客戶配置的位置。 ... [Service] ExecStart=/data0/kubernetes/bin/kubelet \\ # 需要修改的部分。 --node-ip=${ALIBABA_CLOUD_NODE_NAME} \\ --hostname-override=${ALIBABA_CLOUD_NODE_NAME} \\ --node-labels=${ALIBABA_CLOUD_LABELS} \\ --provider-id=${ALIBABA_CLOUD_PROVIDER_ID} \\ --register-with-taints=${ALIBABA_CLOUD_TAINTS} \\ .... --v=4 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF
需要接收阿里雲註冊叢集下發的系統內容變數如下表所示。
系統內容變數 | 說明 | 樣本 |
ALIBABA_CLOUD_PROVIDER_ID | 自訂節點添加指令碼中必須接收並進行配置,否則會影響註冊叢集的正常運行。 | ALIBABA_CLOUD_PROVIDER_ID=cn-shenzhen.i-wz92ewt14n9wx9mo*** |
ALIBABA_CLOUD_NODE_NAME | 自訂節點添加指令碼中必須接收並進行配置,否則會導致註冊叢集節點池中節點狀態異常。 | ALIBABA_CLOUD_NODE_NAME=cn-shenzhen.192.168.1.*** |
ALIBABA_CLOUD_LABELS | 自訂節點添加指令碼中必須接收並進行配置,否則會影響節點池管理狀態異常以及後續工作負載在雲上雲下的調度。 | ALIBABA_CLOUD_LABELS=alibabacloud.com/nodepool-id=np0e2031e952c4492bab32f512ce142***,ack.aliyun.com=cc3df6d939b0d4463b493b82d0d670***,alibabacloud.com/instance-id=i-wz960ockeekr3dok0***,alibabacloud.com/external=true,workload=cpu 其中workload=cpu是使用者在節點池中配置的使用者自訂節點標籤,其他都為系統下發的節點標籤。 |
ALIBABA_CLOUD_TAINTS | 自訂節點添加指令碼中必須接收並進行配置,否則節點池中的汙點配置將不會生效。 | ALIBABA_CLOUD_TAINTS=workload=ack:NoSchedule |
在完成以上所有操作後,請跳轉到步驟二:儲存並上傳指令碼到檔案伺服器。
步驟一(B):建立添加節點指令碼
擷取系統相關資訊。
叢集版本大於等於1.18
運行如下命令擷取IDC Kubernetes叢集版本號碼。後續設定到樣本指令碼環境變數
KUBE_VERSION中。kubectl get no $(kubectl get nodes -l node-role.kubernetes.io/control-plane -o json | jq -r '.items[0].metadata.name') -o json | jq -r '.status.nodeInfo.kubeletVersion'輸出樣本:
v1.14.10運行如下命令擷取IDC Kubernetes叢集運行時以及版本號碼。後續設定到樣本指令碼環境變數
RUNTIME_VERSION中。kubectl get no $(kubectl get nodes -l node-role.kubernetes.io/control-plane -o json | jq -r '.items[0].metadata.name') -o json | jq -r '.status.nodeInfo.containerRuntimeVersion'輸出樣本:
docker://18.6.3 # Docker運行時。 containerd://1.4.3 # Containerd運行時。運行如下命令擷取kubeadm 添加節點完整命令。後續設定到樣本指令碼環境變數
KUBEADM_JOIN_CMD中。# --ttl 0 很重要。需要設定為永不到期,避免節點池Auto Scaling失效。 kubeadm token create --ttl 0 --print-join-command輸出樣本:
kubeadm join 192.168.8.XXX:6443 --token k8xsq8.4oo8va9wcqpb*** --discovery-token-ca-cert-hash sha256:cb5fc894ab965dfbc4c194e1065869268f8845c3ec40f78f9021dde24610d***
叢集版本小於1.18
運行如下命令擷取IDC Kubernetes叢集版本號碼。後續設定到樣本指令碼環境變數
KUBE_VERSION中。kubectl get no $(kubectl get nodes -l node-role.kubernetes.io/master -o json | jq -r '.items[0].metadata.name') -o json | jq -r '.status.nodeInfo.kubeletVersion'輸出樣本:
v1.14.10運行如下命令擷取IDC Kubernetes叢集運行時以及版本號碼。後續設定到樣本指令碼環境變數
RUNTIME_VERSION中。kubectl get no $(kubectl get nodes -l node-role.kubernetes.io/master -o json | jq -r '.items[0].metadata.name') -o json | jq -r '.status.nodeInfo.containerRuntimeVersion'輸出樣本:
docker://18.6.3 # Docker運行時。 containerd://1.4.3 # Containerd運行時。運行如下命令擷取kubeadm 添加節點完整命令。後續設定到樣本指令碼環境變數
KUBEADM_JOIN_CMD中。# --ttl 0 很重要。需要設定為永不到期,避免節點池Auto Scaling失效。 kubeadm token create --ttl 0 --print-join-command輸出樣本:
kubeadm join 192.168.8.XXX:6443 --token k8xsq8.4oo8va9wcqpb*** --discovery-token-ca-cert-hash sha256:cb5fc894ab965dfbc4c194e1065869268f8845c3ec40f78f9021dde24610d***
擷取樣本指令碼。
說明樣本指令碼僅適用於普通的ECS節點,如果您是GPU節點,請提交工單擷取研發團隊支援。
根據您擷取的IDC Kubernetes叢集版本號碼、運行時以及版本號碼等資訊,在樣本指令碼環境變數位置設定具體的值。
Docker運行時
Containerd運行時
步驟二:儲存並上傳指令碼到檔案伺服器
您需要將自訂指令碼或改造後的樣本指令碼儲存在檔案伺服器上,例如存放在OSS Bucket上。指令碼存放地址為https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/join-ecs-nodes.sh。
步驟三:修改ack-cluster-agent配置項
必須先完成此步驟配置,才能建立節點池,否則擴容時系統無法擷取自訂指令碼配置,導致擴容失敗。
完成指令碼上傳並擷取檔案地址後,需要將指令碼地址更新到kube-system命名空間中ack-agent-config配置項的addNodeScriptPath欄位。
# 執行kubectl 命令,編輯ack-agent-config。
kubectl edit cm ack-agent-config -n kube-system
# 修改addNodeScriptPath欄位內容,更新後配置如下。
apiVersion: v1
data:
addNodeScriptPath: https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/join-ecs-nodes.sh
kind: ConfigMap
metadata:
name: ack-agent-config
namespace: kube-system