全部产品
Search
文档中心

Container Service for Kubernetes:Buat skrip kustom untuk kelompok node

更新时间:Jul 02, 2025

Distributed Cloud Container Platform for Kubernetes (ACK One) memungkinkan Anda menggunakan kluster terdaftar untuk menghubungkan kluster Kubernetes eksternal yang diterapkan di pusat data lokal atau penyedia cloud lainnya ke dalam Container Service for Kubernetes (ACK). Ini mendukung pengelolaan terpusat kluster dan sumber daya serta memfasilitasi penyebaran cepat lingkungan hybrid cloud. Jika sumber daya komputasi di pusat data lokal terbatas, Anda dapat membuat kelompok node untuk memperluas sumber daya komputasi di cloud, memenuhi permintaan pertumbuhan bisnis dinamis. Topik ini menjelaskan cara membuat skrip kustom yang diperlukan untuk menyediakan kelompok node cloud.

Prasyarat

Prosedur

Catatan
  • Anda dapat menggunakan skrip node sampel atau membuat skrip kustom berdasarkan lingkungan aktual dan kondisi pada gambar sebelumnya.

  • Skrip sampel hanya mendukung sistem operasi yang menggunakan Yellowdog Updater, Modified (YUM) sebagai manajer paket.

Langkah 1 (A): Tambahkan variabel lingkungan Alibaba Cloud ke skrip kustom

  1. Periksa apakah sebuah node adalah node GPU-accelerated. Langkah ini opsional.

    Gunakan skrip berikut untuk memeriksa apakah sebuah node Elastic Compute Service (ECS) adalah node GPU-accelerated.

    #!/bin/bash
    # Periksa apakah Ispci terinstal.
    if ! which lspci &>/dev/null; then
    	yum -y install pciutils
    fi
    
    # Periksa apakah node dilengkapi dengan GPU.
    if lspci | grep -i nvidia &>/dev/null; then
    	echo "Instal driver yang relevan karena node adalah node GPU-accelerated." 
    fi

    Berbeda dengan node ECS biasa, Anda harus menginstal driver dan plugin perangkat untuk node GPU-accelerated. Untuk informasi lebih lanjut, lihat Memperbarui driver NVIDIA node secara manual.

  2. Siapkan skrip kustom untuk memastikan bahwa kelompok node dari kluster terdaftar dapat menyinkronkan status node secara normal untuk penjadwalan sumber daya. Skrip kustom perlu mendapatkan variabel lingkungan yang dikeluarkan oleh kluster terdaftar. Metode untuk mendapatkan variabel lingkungan bergantung pada cara kluster Kubernetes eksternal dibuat. Anda dapat menggunakan metode kubeadm atau binari untuk membuat kluster Kubernetes.

    Kluster Kubernetes dibuat menggunakan metode kubeadm

    Metode kubeadm direkomendasikan oleh Kubernetes, di mana kluster Kubernetes disiapkan menggunakan alat resmi kubeadm. Tambahkan konten berikut ke skrip node kustom:

    ....
    
    ####### <Tambahkan konten berikut.
    
    # Konfigurasikan label node, taints, nama node, dan ID penyedia node.
    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
    
    ####### Tambahkan konten sebelumnya.
    
    # Mulai ulang runtime dan kubelet.
    ....
    

    Kluster Kubernetes dibuat menggunakan metode binari

    Jika kluster Anda dibuat menggunakan file binari Kubernetes, modifikasi konfigurasi boot kubelet dalam skrip node kustom untuk mendapatkan variabel lingkungan. Biasanya, file kubelet.service disimpan di direktori /usr/lib/systemd/system/.

    cat >/usr/lib/systemd/system/kubelet.service <<EOF
    # Konfigurasi kustom tidak ditampilkan.
    ...
    [Service]
    ExecStart=/data0/kubernetes/bin/kubelet \\
      # Modifikasi konfigurasi berikut.
      --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

Tabel berikut menjelaskan variabel lingkungan yang dikeluarkan oleh kluster terdaftar.

Variabel lingkungan

Deskripsi

Contoh

ALIBABA_CLOUD_PROVIDER_ID

Skrip node kustom harus mendapatkan variabel lingkungan ini. Jika tidak, kluster terdaftar tidak dapat berjalan secara normal.

ALIBABA_CLOUD_PROVIDER_ID=cn-shenzhen.i-wz92ewt14n9wx9mo***

ALIBABA_CLOUD_NODE_NAME

Skrip node kustom harus mendapatkan variabel lingkungan ini. Jika tidak, node dalam kelompok node mungkin berjalan dalam keadaan abnormal.

ALIBABA_CLOUD_NODE_NAME=cn-shenzhen.192.168.1.***

ALIBABA_CLOUD_LABELS

Skrip node kustom harus mendapatkan variabel lingkungan ini. Jika tidak, kesalahan mungkin terjadi selama pengelolaan kelompok node dan penjadwalan beban kerja antara node cloud dan on-premises.

ALIBABA_CLOUD_LABELS=alibabacloud.com/nodepool-id=np0e2031e952c4492bab32f512ce142***,ack.aliyun.com=cc3df6d939b0d4463b493b82d0d670***,alibabacloud.com/instance-id=i-wz960ockeekr3dok0***,alibabacloud.com/external=true,workload=cpu

Label workload=cpu adalah label kustom yang didefinisikan dalam konfigurasi kelompok node. Label lainnya adalah label sistem.

ALIBABA_CLOUD_TAINTS

Skrip node kustom harus mendapatkan variabel lingkungan ini. Jika tidak, taints yang ditambahkan ke kelompok node tidak akan berlaku.

ALIBABA_CLOUD_TAINTS=workload=ack:NoSchedule

Setelah menyelesaikan langkah-langkah sebelumnya, lanjutkan ke Langkah 2: Simpan dan unggah skrip ke server file.

Langkah 1 (B): Tambahkan skrip node

  1. Dapatkan informasi sistem yang relevan.

    Versi Kubernetes kluster adalah 1.18 atau lebih baru

    • Jalankan perintah berikut untuk memeriksa versi Kubernetes dari kluster eksternal. Versi Kubernetes akan ditentukan dalam variabel lingkungan KUBE_VERSION dari skrip sampel di langkah-langkah berikutnya.

      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'

      Output yang diharapkan:

      v1.14.10
    • Jalankan perintah berikut untuk memeriksa runtime dan versi runtime dari kluster eksternal. Runtime dan versi runtime akan ditentukan dalam variabel lingkungan RUNTIME_VERSION dari skrip sampel di langkah-langkah berikutnya.

      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'

      Output yang diharapkan:

      docker://18.6.3                     # Docker digunakan.
      containerd://1.4.3                  # containerd digunakan.
    • Jalankan perintah berikut untuk memeriksa perintah kubeadm yang digunakan untuk menambahkan node. Perintah tersebut akan ditentukan dalam variabel lingkungan KUBEADM_JOIN_CMD dari skrip sampel di langkah-langkah berikutnya.

      # --ttl 0 sangat penting. Atur TTL ke 0 (tidak ada waktu kedaluwarsa) sehingga penskalaan otomatis kelompok node tidak menjadi tidak valid.
      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*** 

    Versi Kubernetes kluster lebih lama dari 1.18

    • Jalankan perintah berikut untuk memeriksa versi Kubernetes dari kluster eksternal. Versi Kubernetes akan ditentukan dalam variabel lingkungan KUBE_VERSION dari skrip sampel di langkah-langkah berikutnya.

      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
    • Jalankan perintah berikut untuk memeriksa runtime dan versi runtime dari kluster eksternal. Runtime dan versi runtime akan ditentukan dalam variabel lingkungan RUNTIME_VERSION dari skrip sampel di langkah-langkah berikutnya.

      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 digunakan.
      containerd://1.4.3                  # containerd digunakan.
    • Jalankan perintah berikut untuk memeriksa perintah kubeadm yang digunakan untuk menambahkan node. Perintah tersebut akan ditentukan dalam variabel lingkungan KUBEADM_JOIN_CMD dari skrip sampel di langkah-langkah berikutnya.

      # --ttl 0 sangat penting. Atur TTL ke 0 (tidak ada waktu kedaluwarsa) sehingga penskalaan otomatis kelompok node tidak menjadi tidak valid.
      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*** 
  2. Dapatkan skrip sampel.

    Catatan
    • Skrip sampel hanya berlaku untuk node ECS biasa. Untuk node ECS GPU-accelerated, submit a ticket ke tim R&D.

    • Tentukan versi Kubernetes, runtime, versi runtime, dan perintah kubeadm dari kluster eksternal yang Anda dapatkan dalam variabel lingkungan skrip sampel.

    Docker

    Lihat kode

    #!/bin/bash
    
    # Versi Kubernetes dari kluster eksternal.
    export KUBE_VERSION=<KUBE_VERSION>     
    
    # Versi Docker dari kluster eksternal.
    export RUNTIME_VERSION=<RUNTIME_VERSION>    
    
    # Perintah kubeadm join.
    export KUBEADM_JOIN_CMD=<KUBEADM_JOIN_CMD>   
    
    # Nonaktifkan firewall.
    systemctl stop firewalld
    systemctl disable firewalld
    systemctl is-enabled firewalld
    
    # Nonaktifkan selinux.
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    setenforce 0
    
    # Nonaktifkan partisi swap.
    sed -i '/swap/s/^/#/g' /etc/fstab
    swapoff -a
    
    
    # Konfigurasikan parameter kernel.
    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
    
    
    # Instal 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
    
    # Konfigurasikan sumber YUM Docker.
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    # Instal komponen dependen dan impor sumber YUM yang disediakan oleh Docker.
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    # Lihat versi yang dapat Anda instal.
    yum list docker-ce --showduplicates | sort -r
    
    # Instal versi DFocker terbaru.
    yum install -y docker-ce-$RUNTIME_VERSION docker-ce-cli-$RUNTIME_VERSION containerd.io
    
    ## Buat direktori /etc/docker.
    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
    
    # Mulai ulang Docker.
    systemctl daemon-reload
    systemctl restart docker
    systemctl enable docker
    
    
    # Instal 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
    
    
    # Konfigurasikan kubelet.service.
    cat >/etc/systemd/system/kubelet.service <<EOF
    # ! PENTING !
    # Konfigurasi ini dikelola dan dibuat oleh ACK
    # harap jangan edit untuk menghindari kegagalan tak terduga
    
    [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
    
    # <<< Variabel lingkungan dari kluster terdaftar. Jangan hapus pengaturan.
    # Konfigurasikan label node, taints, nama node, dan ID penyedia node.
    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
    # Variabel lingkungan dari kluster terdaftar. Jangan hapus pengaturan.>>> 
    
    
    systemctl enable kubelet
    systemctl start kubelet
    
    # Jalankan perintah kubeadm join.
    $KUBEADM_JOIN_CMD

    containerd

    Lihat kode

    #!/bin/bash
    
    # Versi Kubernetes dari kluster eksternal.
    export KUBE_VERSION=<KUBE_VERSION>        
    
    # Versi containerd dari kluster eksternal.
    export RUNTIME_VERSION=<RUNTIME_VERSION>  
    
    # Perintah kubeadm join.
    export KUBEADM_JOIN_CMD=<KUBEADM_JOIN_CMD>   
    
    
    # Nonaktifkan firewall.
    systemctl stop firewalld
    systemctl disable firewalld
    systemctl is-enabled firewalld
    
    # Nonaktifkan selinux.
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    setenforce 0
    
    # Nonaktifkan partisi swap.
    sed -i '/swap/s/^/#/g' /etc/fstab
    swapoff -a
    
    # Konfigurasikan parameter kernel.
    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
    
    
    # Instal 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
    
    # Instal dan konfigurasikan 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
    # Konfigurasikan containerd.
    cat >>/etc/modules-load.d/containerd.conf <<EOF
    overlay
    br_netfilter
    EOF
    # Muat segera modul overlay.
    modprobe overlay
    # Muat segera modul br_netfilter.
    modprobe br_netfilter
    # Instal 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
    # Gunakan systemd untuk mengelola cgroups.
    sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml
    # Tarik sandbox image dari 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
    # Mulai containerd.
    systemctl enable containerd
    systemctl start containerd
    
    
    # Instal 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
    
    
    # Konfigurasikan kubelet.service.
    cat >/etc/systemd/system/kubelet.service <<EOF
    # ! PENTING !
    # Konfigurasi ini dikelola dan dibuat oleh ACK
    # harap jangan edit untuk menghindari kegagalan tak terduga
    
    [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
    
    # Buat kubelet.service.d.
    #mkdir -p /etc/systemd/system/kubelet.service.d
    
    
    # <<< Variabel lingkungan dari kluster terdaftar. Jangan hapus pengaturan.
    # Konfigurasikan label node, taints, nama node, dan ID penyedia node.
    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
    # Variabel lingkungan dari kluster terdaftar. Jangan hapus pengaturan.>>>
    
    
    systemctl enable kubelet
    systemctl start kubelet
    
    
    # Jalankan perintah kubeadm join.
    $KUBEADM_JOIN_CMD

Langkah 2: Simpan dan unggah skrip ke server file

Unggah skrip node kustom atau skrip node sampel yang telah dimodifikasi ke server file, seperti bucket Object Storage Service (OSS). Contoh: https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/join-ecs-nodes.sh.

Langkah 3: Modifikasi konfigurasi ack-cluster-agent

Penting

Selesaikan langkah ini sebelum membuat kelompok node. Jika tidak, skrip kustom tidak dapat diperoleh saat Anda memperluas kelompok node, sehingga operasi perluasan gagal.

Setelah skrip diunggah dan jalur skrip dicatat, tentukan jalur tersebut di bidang addNodeScriptPath dari konfigurasi ack-agent-config di namespace kube-system.

# Gunakan kubectl untuk memodifikasi konfigurasi ack-agent-config.
kubectl edit cm ack-agent-config -n kube-system

# Modifikasi bidang addNodeScriptPath sebagai berikut:
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