全部产品
Search
文档中心

Container Service for Kubernetes:Cara Membangun Kelompok Node Elastis dengan Gambar Kustom

更新时间:Jul 06, 2025

Untuk mempersingkat durasi sebuah node mencapai status Ready di cloud, disarankan untuk menginstal paket perangkat lunak yang diperlukan menggunakan gambar kustom. Hal ini dapat secara signifikan mengurangi waktu yang dibutuhkan dan meningkatkan efisiensi startup sistem. Topik ini menjelaskan cara membangun kelompok node elastis untuk kluster terdaftar menggunakan gambar kustom.

Prasyarat

Langkah-langkah

Catatan
  • Contoh ini menggunakan sistem operasi CentOS 7.9 untuk membangun kelompok node elastis dengan gambar kustom. Versi kluster Kubernetes 1.28.3 dihubungkan menggunakan file biner.

  • Lanjutkan ke Langkah 3 jika Anda sudah memiliki gambar kustom siap digunakan.

Langkah 1: Buat kelompok node cloud dan tambahkan node ke dalamnya

  1. Pilih Bucket OSS, buat file bernama join-ecs-node.sh, salin konten berikut ke dalam file tersebut, lalu unggah.

    echo "ID penyedia node adalah $ALIBABA_CLOUD_PROVIDER_ID"
    echo "Nama node adalah $ALIBABA_CLOUD_NODE_NAME"
    echo "Label node adalah $ALIBABA_CLOUD_LABELS"
    echo "Taints node adalah $ALIBABA_CLOUD_TAINTS"
  2. Dapatkan URL file join-ecs-node.sh (Anda dapat menggunakan URL yang ditandatangani) dan modifikasi skrip konfigurasi kustom di kluster.

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

      kubectl edit cm ack-agent-config -n kube-system
    2. Modifikasi bidang 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 cloud bernama cloud-test dan atur parameter Expected Nodes menjadi 1. Untuk informasi lebih lanjut, lihat Buat dan Kelola Kelompok Node.

    image

    Penting

    Sebuah node baru akan berada dalam status Gagal karena belum diinisialisasi dengan tugas pengaturan, seperti menginstal paket perangkat lunak node. Pastikan Anda dapat masuk ke node melalui SSH untuk inisialisasi pada langkah-langkah selanjutnya.

Langkah 2: Konfigurasikan node dan ekspor gambar kustom

  1. Masuk ke node dan jalankan perintah berikut untuk memeriksa informasi node:

    cat /var/log/acs/init.log

    Output yang Diharapkan:

    ID penyedia node adalah cn-zhangjiakou.i-xxxxx
    Nama node adalah cn-zhangjiakou.192.168.66.xx
    Label node adalah alibabacloud.com/nodepool-id=npf9fbxxxxxx,ack.aliyun.com=c22b1a2e122ff4fde85117de4xxxxxx,alibabacloud.com/instance-id=i-8vb7m7nt3dxxxxxxx,alibabacloud.com/external=true
    Taints node adalah

    Output yang diharapkan menunjukkan bahwa skrip kustom dapat memperoleh informasi node. Catat informasi ini dan tambahkan ke parameter startup kubelet pada langkah-langkah berikutnya.

  2. Jalankan perintah berikut untuk mengonfigurasi lingkungan dasar:

    # Instal paket alat.
    yum update -y && yum -y install  wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git tar curl
    
    # Nonaktifkan firewall.
    systemctl disable --now firewalld
    
    # Nonaktifkan SELinux.
    setenforce 0
    sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
    
    # Nonaktifkan partisi swap.
    sed -ri 's/.*swap.*/#&/' /etc/fstab
    swapoff -a && sysctl -w vm.swappiness=0
    
    # Konfigurasi jaringan.
    systemctl disable --now NetworkManager
    systemctl start network && systemctl enable network
    
    # Sinkronisasi waktu.
    ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    yum install ntpdate -y
    ntpdate ntp.aliyun.com
    
    # Konfigurasikan 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, tingkatkan kernel ke versi 4.18 atau lebih baru dan instal ipvsadm.

  3. Instal containerd.

    1. Jalankan perintah berikut untuk mengunduh plug-in jaringan 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 
      # Ekstrak paket binari cni
      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 cri-containerd-cni-*-linux-amd64.tar.gz -C /
    2. Jalankan perintah berikut untuk membuat file 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 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
      
      # Muat kernel
      sysctl --system
    5. Jalankan perintah berikut untuk membuat file konfigurasi untuk containerd:

      mkdir -p /etc/containerd
      containerd config default | tee /etc/containerd/config.toml
      
      # Modifikasi file konfigurasi containerd
      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
      
      # Konfigurasikan akselerator
      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 mengatur containerd agar berjalan saat startup sistem:

      systemctl daemon-reload
      # Digunakan untuk memuat ulang file unit yang dikelola oleh systemd. Saat Anda menambahkan atau memodifikasi file unit (seperti file .service, file .socket, dll.), Anda perlu menjalankan perintah ini untuk menyegarkan konfigurasi systemd dari file tersebut.
      
      systemctl enable --now containerd.service
      systemctl start containerd.service
      systemctl status containerd.service
    7. Jalankan perintah berikut untuk mengonfigurasi perintah crictl:

      wget https://mirrors.chenby.cn/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/
      # Hasilkan file konfigurasi
      cat > /etc/crictl.yaml <<EOF
      runtime-endpoint: unix:///run/containerd/containerd.sock
      image-endpoint: unix:///run/containerd/containerd.sock
      timeout: 10
      debug: false
      EOF
      
      # Uji
      systemctl restart  containerd
      crictl info
  4. Instal kubelet dan kube-proxy.

    1. Dapatkan file biner, masuk ke Master node, lalu salin file biner ke node.

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

      mkdir -p /etc/kubernetes/pki

      Masuk ke master node dan salin sertifikat ke node.

      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. Isi variabel terkait kelompok node yang diperoleh di Langkah 2.

      mkdir -p /var/lib/kubelet /var/log/kubernetes /etc/systemd/system/kubelet.service.d /etc/kubernetes/manifests/
      
      # Konfigurasikan layanan kubelet di semua node k8s
      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 untuk 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
      # Digunakan untuk memuat ulang file unit yang dikelola oleh systemd. Saat Anda menambahkan atau memodifikasi file unit (seperti file .service, file .socket, dll.), Anda perlu menjalankan perintah ini untuk menyegarkan konfigurasi systemd dari file tersebut.
      
      systemctl enable --now kubelet.service
      systemctl start kubelet.service
      systemctl status kubelet.service
    6. Jalankan perintah berikut untuk memeriksa informasi kluster:

      kubectl  get node
    7. Masuk ke master node dan dapatkan 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 untuk 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 untuk 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
      # Digunakan untuk memuat ulang file unit yang dikelola oleh systemd. Saat Anda menambahkan atau memodifikasi file unit (seperti file .service, file .socket, dll.), Anda perlu menjalankan perintah ini untuk menyegarkan konfigurasi systemd dari file tersebut.
      
      systemctl enable --now kube-proxy.service
      systemctl restart kube-proxy.service
      systemctl status kube-proxy.service
  5. Sinkronkan status kelompok node.

    1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

    2. Di halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel kiri, pilih Nodes > Node Pools.

    3. Di sebelah kanan halaman Node Pools, klik Sync Node Pool. Tunggu hingga sinkronisasi selesai dan Anda akan melihat tidak ada node yang berada dalam status Kegagalan.

      image

  6. Ekspor gambar kustom.

    1. Masuk ke Konsol ECS.

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

    3. Klik Instance ID, lalu buka tab Instance Details, dan klik Create Custom Image.

      image

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

    5. Di halaman gambar, Anda akan melihat Custom Image yang telah dibuat dengan kolom Status sebagai Available.

Langkah 3: Gunakan gambar kustom untuk memodifikasi atau membuat kelompok node cloud

Catatan

Jika Anda menggunakan gambar kustom yang ada dan melewati Langkah 1 dan Langkah 2, Anda harus menggunakan gambar kustom untuk membuat kelompok node terlebih dahulu. Untuk informasi lebih lanjut, lihat Buat dan Kelola Kelompok Node.

  1. Di halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel kiri, pilih Nodes > Node Pools.

  2. Di halaman Node Pools, temukan Node Pool, klik Edit di sebelah kanan di kolom Aksi, perluas Advanced Options dan ubah gambar kelompok node dengan memilih gambar kustom di samping Custom Image.

    image

  3. Anda dapat melihat bahwa kolom Operating System di halaman Node Pools diperbarui menjadi Custom Image.image

Langkah 4: Modifikasi skrip inisialisasi untuk node agar menerima parameter terkait Alibaba Cloud

Catatan
  • Anda harus membersihkan sertifikat kubelet residu di gambar kustom seperti yang ditunjukkan pada baris ketujuh skrip.

  • Jika Anda memiliki kelompok node kustom yang ada, lihat Langkah 1 untuk mengonfigurasi URL unduhan skrip kustom.

  1. Gunakan konten berikut untuk membuat atau memperbarui file join-ecs-node.sh. Karena gambar kustom berisi paket alat dan dependensi yang diperlukan untuk node, skrip kustom hanya menerima dan memperbarui parameter kelompok node.

    echo "ID penyedia node adalah $ALIBABA_CLOUD_PROVIDER_ID"
    echo "Nama node adalah $ALIBABA_CLOUD_NODE_NAME"
    echo "Label node adalah $ALIBABA_CLOUD_LABELS"
    echo "Taints node adalah $ALIBABA_CLOUD_TAINTS"
    systemctl stop kubelet.service
    echo "Hapus sertifikat kubelet lama" # Perlu menghapus sertifikat node lama
    rm -rf /var/lib/kubelet/pki/*
    echo "Tambahkan konfigurasi layanan kubelet"
    # Konfigurasikan layanan kubelet
    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
    # Mulai Layanan Kubelet
    systemctl start kubelet.service
  2. Perbarui skrip join-ecs-node.sh di OSS.

Langkah 5: Skalakan kelompok node

  1. Di halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel kiri, pilih Nodes > Node Pools.

  2. Pergi ke halaman Node Pools, temukan kelompok node, klik More > Scale di sebelah kanan di kolom Aksi, dan tambahkan node baru.

    image

    Status menunjukkan bahwa kedua node normal, yang menunjukkan bahwa kelompok node elastis telah dibangun.

  3. Anda dapat mengonfigurasi kebijakan penskalaan otomatis untuk kelompok node. Untuk informasi lebih lanjut, lihat Konfigurasikan Penskalaan Otomatis.