All Products
Search
Document Center

Container Service for Kubernetes:Buat skrip kustom untuk kelompok node

Last Updated:Mar 27, 2026

Saat sumber daya komputasi on-premises mencapai kapasitas maksimum, Anda dapat membuat kelompok node di ACK One untuk memperluas kapasitas dengan node Elastic Compute Service (ECS) berbasis cloud. Topik ini menjelaskan cara menulis dan menerapkan skrip bootstrap kustom yang menyediakan node ECS tersebut ke kluster terdaftar Anda.

Prasyarat

Sebelum memulai, pastikan Anda telah:

Batasan

  • Skrip contoh dalam topik ini hanya mendukung sistem operasi yang menggunakan YUM (Yellowdog Updater, Modified) sebagai manajer paket.

  • Skrip contoh ini hanya berlaku untuk node ECS reguler. Untuk node yang dipercepat GPU, submit a ticket ke tim R&D untuk mendapatkan skrip khusus.

Berbeda dengan node ECS reguler, Anda harus menginstal driver dan plug-in perangkat untuk node yang dipercepat GPU. Untuk informasi selengkapnya, lihat Manually update the NVIDIA driver of a node.

Ikhtisar

image

Proses ini terdiri dari tiga langkah:

  1. Siapkan skrip node — sesuaikan skrip kustom yang sudah ada atau mulai dari skrip contoh.

  2. Unggah skrip ke server file yang dapat diakses dari kluster terdaftar Anda.

  3. Daftarkan path skrip dalam ConfigMap ack-agent-config agar kelompok node dapat mengambilnya saat melakukan skala keluar.

Langkah mana yang harus diambil pada Langkah 1:

SituasiTindakan
Anda memiliki skrip bootstrap yang sudah adaGunakan Langkah 1(A): tambahkan variabel lingkungan Alibaba Cloud yang diperlukan ke dalamnya.
Anda memulai dari awalGunakan Langkah 1(B): unduh dan sesuaikan skrip contoh.

Langkah 1(A): Tambahkan variabel lingkungan Alibaba Cloud ke skrip yang sudah ada

Kelompok node Anda memerlukan empat variabel lingkungan dari kluster terdaftar untuk mengelola node dengan benar. Kluster terdaftar menyuntikkan variabel ini saat skala keluar.

Penting

ALIBABA_CLOUD_PROVIDER_ID wajib digunakan agar kluster terdaftar berfungsi. Jika skrip Anda tidak menggunakan variabel ini, kluster tidak dapat berjalan secara normal.

Keempat variabel lingkungan tersebut adalah:

VariabelWajibDampak jika tidak adaContoh nilai
ALIBABA_CLOUD_PROVIDER_IDYaKluster terdaftar tidak dapat berjalan secara normalcn-shenzhen.i-wz92ewt14n9wx9mo***
ALIBABA_CLOUD_NODE_NAMEYaNode dalam kelompok node mungkin masuk ke status abnormalcn-shenzhen.192.168.1.***
ALIBABA_CLOUD_LABELSYaPengelolaan kelompok node dan penjadwalan workload antara node cloud dan on-premises mungkin gagalalibabacloud.com/nodepool-id=np0e2031e952c4492bab32f512ce142*,ack.aliyun.com=cc3df6d939b0d4463b493b82d0d670*,alibabacloud.com/instance-id=i-wz960ockeekr3dok0***,alibabacloud.com/external=true,workload=cpu
ALIBABA_CLOUD_TAINTSYaTaint yang ditentukan dalam konfigurasi kelompok node tidak berlakuworkload=ack:NoSchedule
Dalam ALIBABA_CLOUD_LABELS, label workload=cpu adalah label kustom yang Anda definisikan dalam konfigurasi kelompok node. Semua label lainnya adalah label sistem yang ditambahkan secara otomatis.

Tambahkan blok penyuntikan variabel ke skrip Anda berdasarkan cara instalasi kluster Anda.

Kluster dibuat menggunakan kubeadm

Sisipkan blok berikut ke dalam skrip Anda. Tempatkan setelah konfigurasi utama node dan sebelum me-restart kubelet.

####### Begin: Alibaba Cloud environment variable injection

# Configure node labels, taints, node name, and 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

####### End: Alibaba Cloud environment variable injection

Setelah menambahkan blok ini, lanjutkan ke Langkah 2: Unggah skrip.

Kluster diinstal menggunakan file biner

Jika kluster Anda diatur dengan menginstal file biner Kubernetes secara langsung, ubah konfigurasi boot kubelet dalam skrip Anda. File kubelet.service biasanya berada di /usr/lib/systemd/system/.

cat >/usr/lib/systemd/system/kubelet.service <<EOF
# Custom configurations are not shown.
...
[Service]
ExecStart=/data0/kubernetes/bin/kubelet \
  # Add the following flags:
  --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

Setelah menambahkan flag tersebut, lanjutkan ke Langkah 2: Unggah skrip.

Langkah 1(B): Gunakan skrip contoh

Jika Anda tidak memiliki skrip bootstrap yang sudah ada, gunakan salah satu skrip contoh di bawah ini sebagai titik awal. Contoh ini mencakup dua runtime kontainer yang paling umum: Docker dan containerd.

Kumpulkan nilai yang diperlukan

Sebelum mengisi skrip, kumpulkan tiga nilai dari kluster eksternal Anda.

Langkah 1: Dapatkan versi Kubernetes

Jalankan perintah yang sesuai berdasarkan versi Kubernetes kluster Anda.

Untuk Kubernetes 1.18 dan yang lebih baru (gunakan label control-plane):

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'

Untuk Kubernetes sebelum 1.18 (gunakan label master):

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'

Output yang diharapkan:

v1.14.10

Catat ini sebagai nilai KUBE_VERSION Anda.

Langkah 2: Dapatkan runtime kontainer dan versinya

Untuk Kubernetes 1.18 dan yang lebih baru:

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'

Untuk Kubernetes sebelum 1.18:

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'

Output yang diharapkan:

docker://18.6.3      # Docker runtime
containerd://1.4.3   # containerd runtime

Catat nomor versinya (tanpa awalan docker:// atau containerd://) sebagai nilai RUNTIME_VERSION Anda.

Langkah 3: Hasilkan perintah kubeadm join

Penting

Flag --ttl 0 wajib digunakan. Tanpa flag ini, token join akan kedaluwarsa dan autoscaling berhenti bekerja.

kubeadm token create --ttl 0 --print-join-command

Output yang diharapkan:

kubeadm join 192.168.8.XXX:6443 --token k8xsq8.4oo8va9wcqpb*** \
    --discovery-token-ca-cert-hash sha256:cb5fc894ab965dfbc4c194e1065869268f8845c3ec40f78f9021dde24610d***

Catat perintah lengkap ini sebagai nilai KUBEADM_JOIN_CMD Anda.

Skrip contoh: Docker

Ganti tiga placeholder di bagian atas skrip dengan nilai yang telah Anda kumpulkan:

  • <KUBE_VERSION> — versi Kubernetes (misalnya, 1.21.0)

  • <RUNTIME_VERSION> — versi Docker (misalnya, 18.6.3)

  • <KUBEADM_JOIN_CMD> — perintah lengkap kubeadm join ...

Expand to view the code

#!/bin/bash

# The Kubernetes version of the external cluster.
export KUBE_VERSION=<KUBE_VERSION>

# The Docker version of the external cluster.
export RUNTIME_VERSION=<RUNTIME_VERSION>

# The kubeadm join command.
export KUBEADM_JOIN_CMD=<KUBEADM_JOIN_CMD>

# Disable the firewall.
systemctl stop firewalld
systemctl disable firewalld
systemctl is-enabled firewalld

# Disable SELinux.
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
setenforce 0

# Disable swap partitions.
sed -i '/swap/s/^/#/g' /etc/fstab
swapoff -a

# Configure kernel parameters.
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

# Install network and system utilities.
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

# Configure the Docker YUM source.
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# Install Docker dependencies.
yum install -y yum-utils device-mapper-persistent-data lvm2

# View the available Docker versions.
yum list docker-ce --showduplicates | sort -r

# Install Docker.
yum install -y docker-ce-$RUNTIME_VERSION docker-ce-cli-$RUNTIME_VERSION containerd.io

# Configure the Docker daemon.
mkdir /etc/docker
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

# Start Docker.
systemctl daemon-reload
systemctl restart docker
systemctl enable docker

# Configure the Kubernetes YUM source.
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

# Configure 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

# <<< The environment variables of the registered cluster. Do not delete the settings.
# Configure node labels, taints, node name, and 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
# The environment variables of the registered cluster. Do not delete the settings. >>>

systemctl enable kubelet
systemctl start kubelet

# Join the cluster.
$KUBEADM_JOIN_CMD

Skrip contoh: containerd

Ganti tiga placeholder di bagian atas skrip dengan nilai yang telah Anda kumpulkan:

  • <KUBE_VERSION> — versi Kubernetes (misalnya, 1.21.0)

  • <RUNTIME_VERSION> — versi containerd (misalnya, 1.4.3)

  • <KUBEADM_JOIN_CMD> — perintah lengkap kubeadm join ...

Expand to view the code

#!/bin/bash

# The Kubernetes version of the external cluster.
export KUBE_VERSION=<KUBE_VERSION>

# The containerd version of the external cluster.
export RUNTIME_VERSION=<RUNTIME_VERSION>

# The kubeadm join command.
export KUBEADM_JOIN_CMD=<KUBEADM_JOIN_CMD>

# Disable the firewall.
systemctl stop firewalld
systemctl disable firewalld
systemctl is-enabled firewalld

# Disable SELinux.
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
setenforce 0

# Disable swap partitions.
sed -i '/swap/s/^/#/g' /etc/fstab
swapoff -a

# Configure kernel parameters.
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

# Install network and system utilities.
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

# Install and configure 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

# Load required kernel modules.
cat >>/etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter

# Install containerd.
yum install containerd.io-$RUNTIME_VERSION -y

# Configure the containerd client (crictl).
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

# Configure containerd.
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# Use systemd to manage cgroups.
sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml
# Pull the sandbox image from Alibaba Cloud.
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

# Start containerd.
systemctl enable containerd
systemctl start containerd

# Configure the Kubernetes YUM source.
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

# Configure 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

# <<< The environment variables of the registered cluster. Do not delete the settings.
# Configure node labels, taints, node name, and 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
# The environment variables of the registered cluster. Do not delete the settings. >>>

systemctl enable kubelet
systemctl start kubelet

# Join the cluster.
$KUBEADM_JOIN_CMD

Langkah 2: Unggah skrip

Unggah skrip ke server file yang dapat diakses oleh kluster terdaftar Anda. Object Storage Service (OSS) merupakan pilihan umum.

Contoh URL setelah diunggah:

https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/join-ecs-nodes.sh

Catat URL tersebut — Anda akan membutuhkannya pada langkah berikutnya.

Langkah 3: Daftarkan path skrip

Penting

Lakukan langkah ini sebelum membuat kelompok node. Jika path skrip tidak didaftarkan, kelompok node tidak dapat mengambil skrip saat skala keluar dan operasi akan gagal.

Atur field addNodeScriptPath dalam ConfigMap ack-agent-config di namespace kube-system.

kubectl edit cm ack-agent-config -n kube-system

Perbarui field addNodeScriptPath dengan URL skrip yang telah Anda unggah:

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

Simpan dan tutup file tersebut. Kluster terdaftar kini menggunakan skrip ini untuk bootstrap node ECS saat Anda melakukan skala keluar pada kelompok node.