All Products
Search
Document Center

Container Service for Kubernetes:Cara membuat kelompok node elastis dengan gambar kustom

Last Updated:Jun 21, 2026

Menggunakan custom image yang telah dipra-instal dengan paket perangkat lunak dapat secara signifikan mengurangi waktu startup node cloud dengan meminimalkan waktu pengunduhan paket.

Prasyarat

Prosedur

Catatan
  • Topik ini menggunakan sistem operasi CentOS 7.9 dan kluster Kubernetes v1.28.3 yang terhubung menggunakan biner sebagai contoh cara membuat custom image untuk kelompok node elastis.

  • Jika Anda sudah memiliki custom image, Anda dapat langsung menuju Langkah 3.

Langkah 1: Buat kelompok node dan tambahkan node

  1. Pilih bucket OSS, buat file bernama join-ecs-node.sh dengan konten berikut, lalu unggah file tersebut ke bucket.

    echo "The node providerid is $ALIBABA_CLOUD_PROVIDER_ID"
    echo "The node name is $ALIBABA_CLOUD_NODE_NAME"
    echo "The node labels are $ALIBABA_CLOUD_LABELS"
    echo "The node taints are $ALIBABA_CLOUD_TAINTS"
  2. Dapatkan URL file join-ecs-node.sh (Anda dapat menggunakan signed URL), lalu modifikasi konfigurasi skrip kustom di kluster.

    1. Jalankan perintah berikut untuk mengedit ConfigMap ack-agent-config:

      kubectl edit cm ack-agent-config -n kube-system
    2. Modifikasi field addNodeScriptPath. Konfigurasi yang diperbarui adalah 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
  3. Buat kelompok node bernama cloud-test dan atur Expected Nodes menjadi 1. Untuk informasi selengkapnya, lihat Create and manage a node pool.

    Penting

    Node baru akan memiliki status Failed karena tidak memiliki paket perangkat lunak yang diperlukan. Anda harus login ke node ini untuk inisialisasi, jadi pastikan node tersebut dapat diakses melalui SSH.

Langkah 2: Konfigurasi node dan ekspor custom image

  1. Login ke node dan jalankan perintah berikut untuk melihat informasi node:

    cat /var/log/acs/init.log

    Output yang diharapkan:

    The node providerid is cn-zhangjiakou.i-xxxxx
    The node name is cn-zhangjiakou.192.168.66.xx
    The node labels are alibabacloud.com/nodepool-id=npf9fbxxxxxx,ack.aliyun.com=c22b1a2e122ff4fde85117de4xxxxxx,alibabacloud.com/instance-id=i-8vb7m7nt3dxxxxxxx,alibabacloud.com/external=true
    The node taints are

    Output ini mengonfirmasi bahwa skrip kustom dapat memperoleh informasi node Alibaba Cloud. Catat informasi ini untuk parameter startup kubelet.

  2. Jalankan perintah berikut untuk mengonfigurasi lingkungan dasar:

    # Install tool packages.
    yum update -y && yum -y install  wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git tar curl
    
    # Disable the firewall.
    systemctl disable --now firewalld
    
    # Disable SELinux.
    setenforce 0
    sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
    
    # Disable swap partitions.
    sed -ri 's/.*swap.*/#&/' /etc/fstab
    swapoff -a && sysctl -w vm.swappiness=0
    
    # Configure the network.
    systemctl disable --now NetworkManager
    systemctl start network && systemctl enable network
    
    # Synchronize the time.
    ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    yum install ntpdate -y
    ntpdate ntp.aliyun.com
    
    # Configure ulimit.
    ulimit -SHn 65535
    cat >> /etc/security/limits.conf <<EOF
    * soft nofile 655360
    * hard nofile 131072
    * soft nproc 655350
    * hard nproc 655350
    * seft memlock unlimited
    * hard memlock unlimitedd
    EOF
    Catatan

    Setelah menyelesaikan konfigurasi lingkungan di atas, upgrade kernel ke versi 4.18 atau lebih baru dan instal ipvsadm.

  3. Instal containerd.

    1. Jalankan perintah berikut untuk mengunduh plugin CNI dan paket containerd:

      wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
      mkdir -p /etc/cni/net.d /opt/cni/bin 
      # Decompress the CNI binary package.
      tar xf cni-plugins-linux-amd64-v*.tgz -C /opt/cni/bin/
      wget https://github.com/containerd/containerd/releases/download/v1.7.8/containerd-1.7.8-linux-amd64.tar.gz
      tar -xzf containerd-*-linux-amd64.tar.gz -C /
    2. Jalankan perintah berikut untuk membuat konfigurasi startup layanan:

      cat > /etc/systemd/system/containerd.service <<EOF
      [Unit]
      Description=containerd container runtime
      Documentation=https://containerd.io
      After=network.target local-fs.target
      
      [Service]
      ExecStartPre=-/sbin/modprobe overlay
      ExecStart=/usr/local/bin/containerd
      Type=notify
      Delegate=yes
      KillMode=process
      Restart=always
      RestartSec=5
      LimitNPROC=infinity
      LimitCORE=infinity
      LimitNOFILE=infinity
      TasksMax=infinity
      OOMScoreAdjust=-999
      
      [Install]
      WantedBy=multi-user.target
      EOF
    3. Jalankan perintah berikut untuk mengonfigurasi modul yang diperlukan oleh containerd:

      cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
      overlay
      br_netfilter
      EOF
      systemctl restart systemd-modules-load.service
    4. Jalankan perintah berikut untuk mengonfigurasi parameter kernel yang diperlukan oleh containerd:

      cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
      net.bridge.bridge-nf-call-iptables  = 1
      net.ipv4.ip_forward                 = 1
      net.bridge.bridge-nf-call-ip6tables = 1
      EOF
      
      # Load the kernel parameters.
      sysctl --system
    5. Jalankan perintah berikut untuk membuat file konfigurasi containerd:

      mkdir -p /etc/containerd
      containerd config default | tee /etc/containerd/config.toml
      
      # Modify the containerd configuration file.
      sed -i "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" /etc/containerd/config.toml
      cat /etc/containerd/config.toml | grep SystemdCgroup
      sed -i "s#registry.k8s.io#m.daocloud.io/registry.k8s.io#g" /etc/containerd/config.toml
      cat /etc/containerd/config.toml | grep sandbox_image
      sed -i "s#config_path\ \=\ \"\"#config_path\ \=\ \"/etc/containerd/certs.d\"#g" /etc/containerd/config.toml
      cat /etc/containerd/config.toml | grep certs.d
      
      # Configure a registry mirror.
      mkdir /etc/containerd/certs.d/docker.io -pv
      cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
      server = "https://docker.io"
      [host."https://hub-mirror.c.163.com"]
        capabilities = ["pull", "resolve"]
      EOF
    6. Jalankan perintah berikut untuk mengaktifkan containerd agar otomatis dimulai saat sistem startup:

      systemctl daemon-reload
      # Reloads systemd units. Required after creating or modifying unit files (for example, .service or .socket).
      
      systemctl enable --now containerd.service
      systemctl start containerd.service
      systemctl status containerd.service
    7. Jalankan perintah berikut untuk mengonfigurasi crictl:

      wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.28.0/crictl-v1.28.0-linux-amd64.tar.gz
      tar xf crictl-v*-linux-amd64.tar.gz -C /usr/bin/
      # Generate the configuration file.
      cat > /etc/crictl.yaml <<EOF
      runtime-endpoint: unix:///run/containerd/containerd.sock
      image-endpoint: unix:///run/containerd/containerd.sock
      timeout: 10
      debug: false
      EOF
      
      # Test the configuration.
      systemctl restart containerd
      crictl info
  4. Instal kubelet dan kube-proxy.

    1. Dapatkan file biner. Login ke node master dan salin file biner ke node saat ini.

      scp /usr/local/bin/kube{let,-proxy} $NODEIP:/usr/local/bin/
    2. Dapatkan sertifikat. Jalankan perintah berikut untuk membuat direktori penyimpanan sertifikat di mesin lokal:

      mkdir -p /etc/kubernetes/pki

      Login ke node master dan salin sertifikat ke node saat ini.

      for FILE in pki/ca.pem pki/ca-key.pem pki/front-proxy-ca.pem bootstrap-kubelet.kubeconfig kube-proxy.kubeconfig; 
        do scp /etc/kubernetes/$FILE $NODE:/etc/kubernetes/${FILE}; done
    3. Jalankan perintah berikut untuk mengonfigurasi layanan kubelet. Gunakan variabel kelompok node Alibaba Cloud yang Anda peroleh di Langkah 2.

      mkdir -p /var/lib/kubelet /var/log/kubernetes /etc/systemd/system/kubelet.service.d /etc/kubernetes/manifests/
      
      # Configure the kubelet service on all Kubernetes nodes.
      cat > /usr/lib/systemd/system/kubelet.service << EOF
      
      [Unit]
      Description=Kubernetes Kubelet
      Documentation=https://github.com/kubernetes/kubernetes
      After=network-online.target firewalld.service containerd.service
      Wants=network-online.target
      Requires=containerd.service
      
      [Service]
      ExecStart=/usr/local/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} \\
          --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig  \\
          --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \\
          --config=/etc/kubernetes/kubelet-conf.yml \\
          --container-runtime-endpoint=unix:///run/containerd/containerd.sock
      
      [Install]
      WantedBy=multi-user.target
      EOF
    4. Jalankan perintah berikut untuk membuat file konfigurasi startup kubelet:

      cat > /etc/kubernetes/kubelet-conf.yml <<EOF
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      address: 0.0.0.0
      port: 10250
      readOnlyPort: 10255
      authentication:
        anonymous:
          enabled: false
        webhook:
          cacheTTL: 2m0s
          enabled: true
        x509:
          clientCAFile: /etc/kubernetes/pki/ca.pem
      authorization:
        mode: Webhook
        webhook:
          cacheAuthorizedTTL: 5m0s
          cacheUnauthorizedTTL: 30s
      cgroupDriver: systemd
      cgroupsPerQOS: true
      clusterDNS:
      - 10.96.0.10
      clusterDomain: cluster.local
      containerLogMaxFiles: 5
      containerLogMaxSize: 10Mi
      contentType: application/vnd.kubernetes.protobuf
      cpuCFSQuota: true
      cpuManagerPolicy: none
      cpuManagerReconcilePeriod: 10s
      enableControllerAttachDetach: true
      enableDebuggingHandlers: true
      enforceNodeAllocatable:
      - pods
      eventBurst: 10
      eventRecordQPS: 5
      evictionHard:
        imagefs.available: 15%
        memory.available: 100Mi
        nodefs.available: 10%
        nodefs.inodesFree: 5%
      evictionPressureTransitionPeriod: 5m0s
      failSwapOn: true
      fileCheckFrequency: 20s
      hairpinMode: promiscuous-bridge
      healthzBindAddress: 127.0.0.1
      healthzPort: 10248
      httpCheckFrequency: 20s
      imageGCHighThresholdPercent: 85
      imageGCLowThresholdPercent: 80
      imageMinimumGCAge: 2m0s
      iptablesDropBit: 15
      iptablesMasqueradeBit: 14
      kubeAPIBurst: 10
      kubeAPIQPS: 5
      makeIPTablesUtilChains: true
      maxOpenFiles: 1000000
      maxPods: 110
      nodeStatusUpdateFrequency: 10s
      oomScoreAdj: -999
      podPidsLimit: -1
      registryBurst: 10
      registryPullQPS: 5
      resolvConf: /etc/resolv.conf
      rotateCertificates: true
      runtimeRequestTimeout: 2m0s
      serializeImagePulls: true
      staticPodPath: /etc/kubernetes/manifests
      streamingConnectionIdleTimeout: 4h0m0s
      syncFrequency: 1m0s
      volumeStatsAggPeriod: 1m0s
      EOF
    5. Jalankan perintah berikut untuk memulai kubelet:

      systemctl daemon-reload
      # Reloads systemd units. Required after creating or modifying unit files (for example, .service or .socket).
      
      systemctl enable --now kubelet.service
      systemctl start kubelet.service
      systemctl status kubelet.service
    6. Jalankan perintah berikut untuk melihat informasi kluster:

      kubectl  get node
    7. Login ke node master dan dapatkan file kubeconfig yang diperlukan oleh kube-proxy.

      scp /etc/kubernetes/kube-proxy.kubeconfig $NODE:/etc/kubernetes/kube-proxy.kubeconfig
    8. Jalankan perintah berikut untuk menambahkan konfigurasi layanan kube-proxy:

      cat >  /usr/lib/systemd/system/kube-proxy.service << EOF
      [Unit]
      Description=Kubernetes Kube Proxy
      Documentation=https://github.com/kubernetes/kubernetes
      After=network.target
      
      [Service]
      ExecStart=/usr/local/bin/kube-proxy \\
        --config=/etc/kubernetes/kube-proxy.yaml \\
        --v=2
      Restart=always
      RestartSec=10s
      
      [Install]
      WantedBy=multi-user.target
      
      EOF
    9. Jalankan perintah berikut untuk menambahkan konfigurasi startup kube-proxy:

      cat > /etc/kubernetes/kube-proxy.yaml << EOF
      apiVersion: kubeproxy.config.k8s.io/v1alpha1
      bindAddress: 0.0.0.0
      clientConnection:
        acceptContentTypes: ""
        burst: 10
        contentType: application/vnd.kubernetes.protobuf
        kubeconfig: /etc/kubernetes/kube-proxy.kubeconfig
        qps: 5
      clusterCIDR: 172.16.0.0/12,fc00:2222::/112
      configSyncPeriod: 15m0s
      conntrack:
        max: null
        maxPerCore: 32768
        min: 131072
        tcpCloseWaitTimeout: 1h0m0s
        tcpEstablishedTimeout: 24h0m0s
      enableProfiling: false
      healthzBindAddress: 0.0.0.0:10256
      hostnameOverride: ""
      iptables:
        masqueradeAll: false
        masqueradeBit: 14
        minSyncPeriod: 0s
        syncPeriod: 30s
      ipvs:
        masqueradeAll: true
        minSyncPeriod: 5s
        scheduler: "rr"
        syncPeriod: 30s
      kind: KubeProxyConfiguration
      metricsBindAddress: 127.0.0.1:10249
      mode: "ipvs"
      nodePortAddresses: null
      oomScoreAdj: -999
      portRange: ""
      udpIdleTimeout: 250ms
      EOF
    10. Jalankan perintah berikut untuk memulai kube-proxy:

       systemctl daemon-reload
      # Reloads systemd units. Required after creating or modifying unit files (for example, .service or .socket).
      
      systemctl enable --now kube-proxy.service
      systemctl restart kube-proxy.service
      systemctl status kube-proxy.service
  5. Sinkronkan status kelompok node.

    1. Login ke ACK console. Di panel navigasi kiri, klik Clusters.

    2. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Nodes > Node Pools.

    3. Di halaman Node Pools, klik Sync Node Pool. Setelah sinkronisasi selesai, verifikasi bahwa tidak ada pesan kegagalan yang ditampilkan dan kelompok node berada dalam kondisi normal.

  6. Ekspor custom image.

    1. Login ke ECS console.

    2. Di panel navigasi kiri, pilih Instances & Images > Instance.

    3. Klik Instance ID. Di tab Instance Details, klik Create custom image.

    4. Di panel navigasi kiri, pilih Instances & Images > Image.

    5. Di halaman Images, Anda dapat melihat Custom Image yang telah Anda buat. Status adalah Available.

Langkah 3: Modifikasi atau buat kelompok node dengan custom image

Catatan

Jika Anda sudah memiliki custom image dan melewati Langkah 1 dan Langkah 2, Anda harus membuat kelompok node menggunakan custom image tersebut. Untuk informasi selengkapnya, lihat How do I create a custom image from an existing ECS instance and use the image to create nodes?.

  1. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Nodes > Node Pools.

  2. Di halaman Node Pools, temukan Node Pools yang dituju dan klik Edit di kolom Actions. Di tab Advanced, atur image kelompok node menjadi Custom Image. Temukan pengaturan Custom image, klik tautan Select custom image, lalu pilih custom image yang telah Anda buat.

  3. Di halaman Node Pools, Anda dapat melihat bahwa Operating System telah diperbarui menjadi Custom Image. Setelah pembaruan selesai, kolom Operating system untuk kelompok node akan menampilkan custom image beserta ID imagenya, yang menunjukkan bahwa image telah berhasil diganti.

Langkah 4: Perbarui skrip init node untuk parameter cloud

Catatan
  • Anda harus menghapus sertifikat kubelet sisa dari custom image, seperti yang ditunjukkan pada baris ketujuh skrip.

  • Untuk kelompok node kustom yang sudah ada, Anda harus mengonfigurasi URL unduhan skrip kustom seperti yang dijelaskan di Langkah 1.

  1. Buat atau perbarui file join-ecs-node.sh dengan konten berikut. Karena custom image sudah berisi tool dan dependensi yang diperlukan, skrip kustom hanya perlu menerima dan memperbarui parameter kelompok node Alibaba Cloud.

    echo "The node providerid is $ALIBABA_CLOUD_PROVIDER_ID"
    echo "The node name is $ALIBABA_CLOUD_NODE_NAME"
    echo "The node labels are $ALIBABA_CLOUD_LABELS"
    echo "The node taints are $ALIBABA_CLOUD_TAINTS"
    systemctl stop kubelet.service
    echo "Delete old kubelet pki" # The old node certificates must be deleted.
    rm -rf /var/lib/kubelet/pki/*
    echo "Add kubelet service config"
    # Configure the kubelet service.
    cat > /usr/lib/systemd/system/kubelet.service << EOF
    
    [Unit]
    Description=Kubernetes Kubelet
    Documentation=https://github.com/kubernetes/kubernetes
    After=network-online.target firewalld.service containerd.service
    Wants=network-online.target
    Requires=containerd.service
    
    [Service]
    ExecStart=/usr/local/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} \\
        --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig  \\
        --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \\
        --config=/etc/kubernetes/kubelet-conf.yml \\
        --container-runtime-endpoint=unix:///run/containerd/containerd.sock
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    systemctl daemon-reload
    # Start the kubelet service.
    systemctl start kubelet.service
  2. Unggah skrip join-ecs-node.sh yang telah diperbarui ke OSS.

Langkah 5: Tambah kapasitas kelompok node

  1. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Nodes > Node Pools.

  2. Di halaman Node Pools, temukan kelompok node yang dituju. Di kolom Actions, pilih More > Scale untuk menambahkan node baru.

    Verifikasi bahwa kedua node berada dalam kondisi normal. Hal ini mengonfirmasi keberhasilan pembuatan kelompok node elastis.

  3. Anda dapat mengonfigurasi kebijakan auto scaling untuk kelompok node tersebut. Untuk informasi selengkapnya, lihat Configure auto scaling.