全部产品
Search
文档中心

Container Service for Kubernetes:Buat kluster kontainer elastis hibrida (ECS elastis)

更新时间:Mar 08, 2026

Kluster hibrida menghubungkan kluster Kubernetes yang dikelola sendiri di lingkungan on-premises Anda ke Alibaba Cloud melalui kluster terdaftar. Konfigurasi ini memungkinkan Anda melakukan penskalaan kluster Kubernetes yang dikelola sendiri dengan node komputasi berbasis cloud serta mengelola resource on-premises dan cloud secara bersamaan. Topik ini menggunakan contoh kluster Kubernetes yang dikelola sendiri di pusat data yang menggunakan plugin jaringan kontainer Calico untuk menunjukkan cara membuat kluster hibrida.

Prasyarat

  • Jaringan kluster Kubernetes yang dikelola sendiri di on-premises dan virtual private cloud (VPC) yang digunakan oleh kluster terdaftar harus saling terhubung, mencakup konektivitas antara jaringan node komputasi maupun jaringan kontainer. Anda dapat menggunakan Cloud Enterprise Network (CEN) untuk membuat koneksi tersebut. Untuk informasi selengkapnya, lihat Buat koneksi multi-VPC dalam berbagai skenario.

  • Kluster tujuan harus menggunakan konfigurasi agen impor kluster privat yang disediakan oleh kluster terdaftar untuk terhubung dengannya.

  • Node komputasi berbasis cloud yang ditambahkan melalui kluster terdaftar harus dapat mengakses API Server kluster Kubernetes yang dikelola sendiri di on-premises Anda.

  • Anda telah terhubung ke kluster terdaftar menggunakan kubectl. Untuk informasi selengkapnya, lihat Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.

Arsitektur kluster kontainer elastis hibrida

Kluster Kubernetes yang dikelola sendiri umumnya menggunakan Calico untuk routing. Topik ini menggunakan contoh kluster yang dikelola sendiri di pusat data yang menggunakan mode route reflector Calico. Untuk lingkungan cloud, gunakan plugin jaringan yang dikustomisasi untuk platform cloud tertentu. Alibaba Cloud Container Service for Kubernetes (ACK) menggunakan plugin Terway untuk mengelola jaringan kontainer. Gambar berikut menunjukkan topologi jaringan kluster hibrida.

image

Di pusat data Anda, blok CIDR pribadi adalah 192.168.0.0/24 dan blok CIDR jaringan kontainer adalah 10.100.0.0/16. Plugin jaringan Calico menggunakan mode route reflector. Di sisi cloud, blok CIDR VPC adalah 10.0.0.0/8. Blok CIDR virtual switch untuk node komputasi adalah 10.10.24.0/24, dan blok CIDR virtual switch untuk Pod adalah 10.10.25.0/24. Komponen jaringan Terway menggunakan mode bersama.

Buat kluster kontainer hibrida menggunakan kluster ACK terdaftar

  1. Konfigurasikan plugin jaringan kontainer on-premises dan berbasis cloud.

    Pada kluster hibrida, pastikan plugin Calico on-premises hanya berjalan di lingkungan on-premises dan komponen Terway berbasis cloud hanya berjalan di cloud.

    Node Elastic Compute Service (ECS) berbasis cloud yang ditambahkan ke kluster ACK terdaftar secara otomatis diberi label alibabacloud.com/external=true. Untuk memastikan Pod Calico di pusat data hanya berjalan di on-premises, konfigurasikan NodeAffinity untuk Pod tersebut. Contoh berikut menunjukkan cara melakukannya:

    cat <<EOF > calico-ds.patch
    spec:
      template:
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: alibabacloud.com/external
                    operator: NotIn
                    values:
                    - "true"
                  - key: type
                    operator: NotIn
                    values:
                    - "virtual-kubelet"
    EOF
    kubectl -n kube-system patch ds calico-node -p "$(cat calico-ds.patch)"
  2. Konfigurasikan izin RAM untuk plugin Terway.

    Konfigurasikan menggunakan onectl

    1. Instal dan konfigurasikan onectl di mesin lokal Anda. Untuk informasi selengkapnya, lihat Kelola kluster terdaftar menggunakan onectl.

    2. Jalankan perintah berikut untuk mengonfigurasi izin RAM untuk plugin Terway.

      onectl ram-user grant --addon terway-eniip

      Output yang diharapkan:

      Ram policy ack-one-registered-cluster-policy-terway-eniip granted to ram user ack-one-user-ce313528c3 successfully.

    Konfigurasikan di Konsol

    Konfigurasikan izin Resource Access Management (RAM) yang diperlukan untuk informasi AccessKey komponen jaringan Terway. Dokumen kebijakan berikut mencantumkan izin yang diperlukan. Untuk informasi selengkapnya, lihat Kelola izin pengguna RAM.

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "ecs:CreateNetworkInterface",
                    "ecs:DescribeNetworkInterfaces",
                    "ecs:AttachNetworkInterface",
                    "ecs:DetachNetworkInterface",
                    "ecs:DeleteNetworkInterface",
                    "ecs:DescribeInstanceAttribute",
                    "ecs:AssignPrivateIpAddresses",
                    "ecs:UnassignPrivateIpAddresses",
                    "ecs:DescribeInstances",
                    "ecs:ModifyNetworkInterfaceAttribute"
                ],
                "Resource": [
                    "*"
                ],
                "Effect": "Allow"
            },
            {
                "Action": [
                    "vpc:DescribeVSwitches"
                ],
                "Resource": [
                    "*"
                ],
                "Effect": "Allow"
            }
        ]
    }
  3. Instal plugin Terway.

    Instal menggunakan onectl

    Jalankan perintah berikut untuk menginstal plugin Terway.

    onectl addon install terway-eniip

    Output yang diharapkan:

    Addon terway-eniip, version **** installed.

    Instal di Konsol

    1. Masuk ke Container Service Management Console . Di panel navigasi sebelah kiri, klik Clusters.

    2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi sebelah kiri, klik Add-ons.

    3. Pada halaman Add-ons, cari komponen terway-eniip. Di pojok kanan bawah kartu komponen, klik Install, lalu klik OK.

    4. Jalankan perintah berikut untuk melihat DaemonSet komponen jaringan Terway.

  4. Setelah terhubung ke kluster menggunakan kubectl, jalankan perintah berikut di kluster terdaftar untuk melihat DaemonSet komponen jaringan Terway.

    Sebelum melakukan penskalaan kluster hibrida dengan node berbasis cloud, Terway tidak dijadwalkan pada node on-premises mana pun.

    kubectl -nkube-system get ds |grep terway

    Output yang diharapkan:

    terway-eniip   0         0         0       0            0           alibabacloud.com/external=true      16s

    Output yang diharapkan menunjukkan bahwa Pod Terway hanya berjalan pada node ECS berbasis cloud yang diberi label alibabacloud.com/external=true.

  5. Jalankan perintah berikut untuk mengedit ConfigMap eni-config dan konfigurasikan eni_conf.access_key dan eni_conf.access_secret.

    kubectl -n kube-system edit cm eni-config

    Contoh berikut menunjukkan konfigurasi eni-config:

    kind: ConfigMap
    apiVersion: v1
    metadata:
     name: eni-config
     namespace: kube-system
    data:
     eni_conf: |
      {
       "version": "1",
       "max_pool_size": 5,
       "min_pool_size": 0,
       "vswitches": {"AZoneID":["VswitchId"]}, 
       "eni_tags": {"ack.aliyun.com":"{{.ClusterID}}"},
       "service_cidr": "{{.ServiceCIDR}}",
       "security_group": "{{.SecurityGroupId}}",
       "access_key": "",
       "access_secret": "",
       "vswitch_selection_policy": "ordered"
      }
     10-terway.conf: |
      {
       "cniVersion": "0.3.0",
       "name": "terway",
       "type": "terway"
      }
  6. Konfigurasikan skrip inisialisasi node kustom.

    1. Modifikasi skrip inisialisasi node asli kluster Kubernetes yang dikelola sendiri.

      Contoh ini menggunakan kluster Kubernetes yang dikelola sendiri di pusat data yang diinisialisasi dengan tool kubeadm. Contoh berikut menunjukkan skrip inisialisasi asli, `init-node.sh`, yang menambahkan node baru ke kluster di pusat data.

      Lihat contoh skrip init-node.sh

      #!/bin/bash
      
      export K8S_VERSION=1.24.3
      
      export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
      cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
      overlay
      br_netfilter
      EOF
      modprobe overlay
      modprobe br_netfilter
      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
      sysctl --system
      yum remove -y containerd.io
      yum install -y yum-utils device-mapper-persistent-data lvm2
      yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
      yum install -y containerd.io-1.4.3
      mkdir -p /etc/containerd
      containerd config default > /etc/containerd/config.toml
      sed -i "s#k8s.gcr.io#registry.aliyuncs.com/k8sxio#g"  /etc/containerd/config.toml
      sed -i '/containerd.runtimes.runc.options/a\ \ \ \ \ \ \ \ \ \ \ \ SystemdCgroup = true' /etc/containerd/config.toml
      sed -i "s#https://registry-1.docker.io#${REGISTRY_MIRROR}#g"  /etc/containerd/config.toml
      systemctl daemon-reload
      systemctl enable containerd
      systemctl restart containerd
      yum install -y nfs-utils
      yum install -y wget
      cat <<EOF > /etc/yum.repos.d/kubernetes.repo
      [kubernetes]
      name=Kubernetes
      baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
      enabled=1
      gpgcheck=0
      repo_gpgcheck=0
      gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
             http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
      EOF
      yum remove -y kubelet kubeadm kubectl
      yum install -y kubelet-$K8S_VERSION kubeadm-$K8S_VERSION kubectl-$K8S_VERSION
      crictl config runtime-endpoint /run/containerd/containerd.sock
      systemctl daemon-reload
      systemctl enable kubelet && systemctl start kubelet
      containerd --version
      kubelet --version
      
      kubeadm join 10.200.1.253:XXXX --token cqgql5.1mdcjcvhszol**** --discovery-token-unsafe-skip-ca-verification

      Skrip inisialisasi node kustom yang diperlukan oleh kluster ACK terdaftar, `init-node-ecs.sh`, didasarkan pada skrip `init-node.sh`. Skrip ini menerima dan mengonfigurasi variabel lingkungan ALIBABA_CLOUD_PROVIDER_ID, ALIBABA_CLOUD_NODE_NAME, ALIBABA_CLOUD_LABELS, dan ALIBABA_CLOUD_TAINTS yang dikirimkan dari kluster terdaftar. Contoh berikut menunjukkan skrip `init-node-ecs.sh`.

      Lihat contoh skrip init-node-ecs.sh

      #!/bin/bash
      
      export K8S_VERSION=1.24.3
      
      export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
      cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
      overlay
      br_netfilter
      EOF
      modprobe overlay
      modprobe br_netfilter
      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
      sysctl --system
      yum remove -y containerd.io
      yum install -y yum-utils device-mapper-persistent-data lvm2
      yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
      yum install -y containerd.io-1.4.3
      mkdir -p /etc/containerd
      containerd config default > /etc/containerd/config.toml
      sed -i "s#k8s.gcr.io#registry.aliyuncs.com/k8sxio#g"  /etc/containerd/config.toml
      sed -i '/containerd.runtimes.runc.options/a\ \ \ \ \ \ \ \ \ \ \ \ SystemdCgroup = true' /etc/containerd/config.toml
      sed -i "s#https://registry-1.docker.io#${REGISTRY_MIRROR}#g"  /etc/containerd/config.toml
      systemctl daemon-reload
      systemctl enable containerd
      systemctl restart containerd
      yum install -y nfs-utils
      yum install -y wget
      cat <<EOF > /etc/yum.repos.d/kubernetes.repo
      [kubernetes]
      name=Kubernetes
      baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
      enabled=1
      gpgcheck=0
      repo_gpgcheck=0
      gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
             http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
      EOF
      yum remove -y kubelet kubeadm kubectl
      yum install -y kubelet-$K8S_VERSION kubeadm-$K8S_VERSION kubectl-$K8S_VERSION
      crictl config runtime-endpoint /run/containerd/containerd.sock
      systemctl daemon-reload
      systemctl enable kubelet && systemctl start kubelet
      containerd --version
      kubelet --version
      
      ####### <Start of added section
      # Configure Node Labels, Taints, Node Name, and Provider ID
      #KUBEADM_CONFIG_FILE="/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf"
      KUBELET_CONFIG_FILE="/etc/sysconfig/kubelet"
      #KUBELET_CONFIG_FILE="/etc/systemd/system/kubelet.service.d/10-kubeadm.conf"
      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
      
      # Restart Docker and start kubelet
      systemctl daemon-reload
      systemctl enable kubelet && systemctl start kubelet
      
      ####### End of added section>
      
      kubeadm join 10.200.1.253:XXXX --token cqgql5.1mdcjcvhszol**** --discovery-token-unsafe-skip-ca-verification
    2. Simpan dan konfigurasikan skrip kustom.

      Simpan skrip kustom di server file HTTP, misalnya di bucket Object Storage Service (OSS). Contoh berikut menunjukkan URL sampel: https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.sh.

      Atur bidang addNodeScriptPath ke path skrip penambahan node kustom https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.sh dan simpan konfigurasinya. Contoh berikut menunjukkan cara melakukannya:

      apiVersion: v1
      data:
        addNodeScriptPath: https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.sh
      kind: ConfigMap
      metadata:
        name: ack-agent-config
        namespace: kube-system

    Setelah menyelesaikan konfigurasi ini, Anda dapat membuat kelompok node dan melakukan penskalaan node ECS di kluster ACK terdaftar tujuan.

  7. Buat kelompok node dan lakukan penskalaan node ECS.

    1. Masuk ke Container Service Management Console . Di panel navigasi sebelah kiri, klik Clusters.

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

    3. Pada halaman Node Pools, buat kelompok node dan lakukan penskalaan node sesuai kebutuhan. Untuk informasi selengkapnya, lihat Buat dan kelola kelompok node.

Referensi

Rencanakan jaringan kontainer untuk skenario Terway. Untuk informasi selengkapnya, lihat Perencanaan jaringan untuk kluster ACK yang dikelola.

Hubungkan jaringan kluster Kubernetes di pusat data ke VPC di cloud. Untuk informasi selengkapnya, lihat Fitur.

Buat kluster terdaftar dan hubungkan ke kluster Kubernetes yang dikelola sendiri di pusat data. Untuk informasi selengkapnya, lihat Buat kluster terdaftar ACK One.