全部產品
Search
文件中心

Container Service for Kubernetes:建立節點池自訂指令碼

更新時間:Mar 13, 2025

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):為自訂指令碼添加阿里雲環境變數

  1. 檢查是否為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節點,請安裝相關驅動。" 
    fi

    GPU節點不同於普通的ECS節點,需要安裝驅動包、device plugin以及配置運行時等。相關操作,請參見GPU節點安裝新版本驅動

  2. 您需要提前準備自訂指令碼,以確保註冊叢集的節點池能夠正確同步節點狀態,並滿足雲上調度需求。自訂指令碼必須接收阿里雲註冊叢集下發的系統內容變數。接收系統內容變數的方法取決於叢集的搭建方式。目前,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. 擷取系統相關資訊。

    叢集版本大於等於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*** 
  2. 擷取樣本指令碼。

    說明
    • 樣本指令碼僅適用於普通的ECS節點,如果您是GPU節點,請提交工單擷取研發團隊支援。

    • 根據您擷取的IDC Kubernetes叢集版本號碼、運行時以及版本號碼等資訊,在樣本指令碼環境變數位置設定具體的值。

    Docker運行時

    展開查看代碼內容

    #!/bin/bash
    
    # IDC Kubernetes叢集版本號碼。
    export KUBE_VERSION=<KUBE_VERSION>     
    
    # IDC Kubernetes叢集Docker版本號碼。
    export RUNTIME_VERSION=<RUNTIME_VERSION>    
    
    # IDC Kubernetes叢集 kubeadm join 命令。
    export KUBEADM_JOIN_CMD=<KUBEADM_JOIN_CMD>   
    
    # 關閉防火牆。
    systemctl stop firewalld
    systemctl disable firewalld
    systemctl is-enabled firewalld
    
    # 關閉selinux。
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    setenforce 0
    
    # 關閉swap分區。
    sed -i '/swap/s/^/#/g' /etc/fstab
    swapoff -a
    
    
    # 配置核心參數。
    cat > /etc/sysctl.d/Kubernetes.conf <<EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    vm.swappiness = 0
    EOF
    
    sysctl --system
    
    
    # 安裝ipadmin。
    yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
    cat > /etc/modules-load.d/ipvs.conf <<EOF
    ip_vs
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    nf_conntrack
    EOF
    
    systemctl enable --now systemd-modules-load
    
    # 配置Docker yum源。
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    # 安裝必要的相依元件並且匯入Docker官方提供的yum源。
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    # 查看可安裝版本。
    yum list docker-ce --showduplicates | sort -r
    
    # 我們直接安裝最新版本的DFocker。
    yum install -y docker-ce-$RUNTIME_VERSION docker-ce-cli-$RUNTIME_VERSION containerd.io
    
    ## Create /etc/docker directory.
    mkdir /etc/docker
    
    # Setup daemon.
    cat > /etc/docker/daemon.json <<EOF
    {
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2",
      "storage-opts": [
        "overlay2.override_kernel_check=true"
      ],
      "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    }
    EOF
    
    mkdir -p /etc/systemd/system/docker.service.d
    
    # Restart Docker.
    systemctl daemon-reload
    systemctl restart docker
    systemctl enable docker
    
    
    # 安裝Kubernetes。
    cat >/etc/yum.repos.d/kubernetes.repo <<EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    yum install -y kubelet-$KUBE_VERSION kubeadm-$KUBE_VERSION kubectl-$KUBE_VERSION --disableexcludes=kubernetes
    
    
    # 配置kubelet.service。
    cat >/etc/systemd/system/kubelet.service <<EOF
    # ! IMPORTANT !
    # This configuration is managed and generated by ACK
    # please do not edit it to avoid unexpected failures
    
    [Unit]
    Description=kubelet: The Kubernetes Node Agent
    Documentation=http://kubernetes.io/docs/
    
    [Service]
    ExecStart=/usr/bin/kubelet
    Restart=always
    StartLimitInterval=0
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    # <<< 該處為配置阿里雲註冊叢集環境變數部分,請勿刪除。
    # 配置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
    #  該處為配置阿里雲註冊叢集環境變數部分,請勿刪除>>>。
    
    
    systemctl enable kubelet
    systemctl start kubelet
    
    # 執行kubeadm join。
    $KUBEADM_JOIN_CMD

    Containerd運行時

    展開查看代碼內容

    #!/bin/bash
    
    # IDC Kubernetes叢集版本號碼。
    export KUBE_VERSION=<KUBE_VERSION>        
    
    # IDC Kubernetes叢集Containerd版本號碼。
    export RUNTIME_VERSION=<RUNTIME_VERSION>  
    
    # IDC Kubernetes叢集 kubeadm join 命令。
    export KUBEADM_JOIN_CMD=<KUBEADM_JOIN_CMD>   
    
    
    # 關閉防火牆。
    systemctl stop firewalld
    systemctl disable firewalld
    systemctl is-enabled firewalld
    
    # 關閉selinux。
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    setenforce 0
    
    # 關閉swap分區。
    sed -i '/swap/s/^/#/g' /etc/fstab
    swapoff -a
    
    # 配置核心參數。
    cat > /etc/sysctl.d/Kubernetes.conf <<EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    vm.swappiness = 0
    EOF
    
    sysctl --system
    
    
    # 安裝ipadmin。
    yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
    cat > /etc/modules-load.d/ipvs.conf <<EOF
    ip_vs
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    nf_conntrack
    EOF
    
    systemctl enable --now systemd-modules-load
    
    #安裝和配置Containerd。
    yum -y install yum-utils device-mapper-persistent-data lvm2
    
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # 配置Containerd。
    cat >>/etc/modules-load.d/containerd.conf <<EOF
    overlay
    br_netfilter
    EOF
    # 立刻載入overlay模組。
    modprobe overlay
    # 立刻載入br_netfilter模組。
    modprobe br_netfilter
    # 安裝Containerd。
    yum install containerd.io-$RUNTIME_VERSION -y
    
    cat >>/etc/crictl.yaml <<EOF
    runtime-endpoint: unix:///run/containerd/containerd.sock
    image-endpoint: unix:///run/containerd/containerd.sock
    timeout: 10
    debug: false
    pull-image-on-create: false
    disable-pull-on-run: false
    EOF
    
    
    mkdir -p /etc/containerd
    containerd config default > /etc/containerd/config.toml
    # 使用systemd管理cgroups。
    sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml
    # 配置sadnbox image從阿里雲拉取。
    sed -i '/sandbox_image/s/registry.k8s.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml
    sed -i 's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#' /etc/containerd/config.toml
    # 啟動Containerd。
    systemctl enable containerd
    systemctl start containerd
    
    
    # 安裝kubernetes。
    cat >/etc/yum.repos.d/kubernetes.repo <<EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    yum -y install kubeadm-$KUBE_VERSION kubectl-$KUBE_VERSION kubelet-$KUBE_VERSION
    
    
    # 配置kubelet.service。
    cat >/etc/systemd/system/kubelet.service <<EOF
    # ! IMPORTANT !
    # This configuration is managed and generated by ACK
    # please do not edit it to avoid unexpected failures
    
    [Unit]
    Description=kubelet: The Kubernetes Node Agent
    Documentation=http://kubernetes.io/docs/
    
    [Service]
    ExecStart=/usr/bin/kubelet
    Restart=always
    StartLimitInterval=0
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    # 建立kubelet.service.d。
    #mkdir -p /etc/systemd/system/kubelet.service.d
    
    
    # <<< 該處為配置阿里雲註冊叢集環境變數部分,請勿刪除。
    # 配置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
    # 該處為配置阿里雲註冊叢集環境變數部分,請勿刪除>>>。
    
    
    systemctl enable kubelet
    systemctl start kubelet
    
    
    # 執行kubeadm join 。
    $KUBEADM_JOIN_CMD

步驟二:儲存並上傳指令碼到檔案伺服器

您需要將自訂指令碼或改造後的樣本指令碼儲存在檔案伺服器上,例如存放在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