在注册集群中创建节点池

ACK One注册集群功能允许您将本地数据中心或其他云厂商的Kubernetes集群接入阿里云容器服务管理平台,实现统一管理,快速搭建混合云环境。通过这种方式,您可以有效地管理和扩展计算资源,以应对业务需求。当本地数据中心的计算资源受限时,您可以通过云上节点池功能,扩展云端计算资源,从而满足业务的增长需求。本文介绍如何创建和使用云上节点池。

前提条件

操作步骤

image

在创建集群并为其添加节点的过程中,首先需要将添加节点的脚本地址配置到集群配置项中。因此,首要任务是准备脚本并且配置阿里云系统环境变量。为了帮助您快速完成节点添加脚本的配置,请根据下列步骤完成后续操作。

说明
  • 需要根据您的自身环境和上图中的判断条件,最终确定您使用自定义脚本还是获取节点示例脚本。

  • 示例脚本仅支持基于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集群

    大多数Kubernetes集群是通过官方工具kubeadm搭建的,这也是官方推荐的方式。如果您使用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 很重要。需要设置为永不过期,避免节点池弹性伸缩失效。
      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 很重要。需要设置为永不过期,避免节点池弹性伸缩失效。
      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 + Kubernetes

    展开查看代码内容

    #!/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 + Kubernetes

    展开查看代码内容

    #!/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
重要

必须先完成此步骤配置,才能创建节点池,否则扩容时无法获取自定义脚本配置,导致扩容失败。

步骤四:创建节点池

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 节点池页面,根据需求创建节点池并扩容节点。具体操作,请参见创建节点池