全部产品
Search
文档中心

Container Service for Kubernetes:Membangun kluster cloud hybrid dan menambahkan Instance ECS ke dalam kluster

更新时间:Jul 02, 2025

Anda dapat membangun kluster cloud hybrid menggunakan kluster terdaftar untuk mendaftarkan kluster Kubernetes yang dikelola sendiri di pusat data ke Container Service for Kubernetes (ACK). Setelah membangun kluster cloud hybrid, Anda dapat menambahkan Instance Elastic Compute Service (ECS) ke dalam kluster dan mengelola secara terpusat sumber daya cloud serta lokal yang termasuk dalam kluster. Topik ini menjelaskan cara membangun kluster cloud hybrid dengan mendaftarkan kluster Kubernetes yang dikelola sendiri yang menggunakan plugin jaringan Calico ke ACK.

Prasyarat

  • Pusat data tempat kluster yang dikelola sendiri berada harus terhubung ke virtual private cloud (VPC) tempat kluster terdaftar diterapkan. Node komputasi dan kontainer di pusat data harus dapat berkomunikasi dengan node komputasi dan kontainer di VPC. Anda dapat menggunakan Cloud Enterprise Network (CEN) untuk menetapkan koneksi jaringan. Untuk informasi lebih lanjut, lihat Penggunaan Jaringan Berbasis Skenario untuk Koneksi VPC.

  • Kluster Kubernetes yang dikelola sendiri telah didaftarkan ke ACK menggunakan kluster terdaftar.

  • Node komputasi cloud yang ditambahkan ke kluster terdaftar harus dapat mengakses API server dari kluster Kubernetes yang dikelola sendiri di pusat data.

  • Klien kubectl harus terhubung ke kluster terdaftar. Untuk informasi lebih lanjut, lihat Mendapatkan File kubeconfig Kluster dan Menggunakan kubectl untuk Terhubung ke Kluster.

Arsitektur kluster cloud hybrid

Calico umumnya digunakan dalam kluster Kubernetes yang dikelola sendiri. Dalam topik ini, kluster yang dikelola sendiri menggunakan mode pencerminan rute Calico. Kami merekomendasikan agar Anda memilih plugin jaringan yang dioptimalkan untuk platform cloud Anda untuk mengelola jaringan kontainer. ACK menggunakan plugin jaringan Terway untuk mengelola jaringan kontainer. Gambar berikut menunjukkan arsitektur jaringan dari kluster cloud hybrid.

image

Blok CIDR privat pusat data adalah 192.168.0.0/24. Blok CIDR kontainer di pusat data adalah 10.100.0.0/16. Kluster yang dikelola sendiri menggunakan mode pencerminan rute Calico. Blok CIDR VPC adalah 10.0.0.0/8. Blok CIDR vSwitch yang digunakan oleh node dalam kluster terdaftar adalah 10.10.25.0/24. Kluster terdaftar menggunakan mode shared-network Terway.

Menggunakan kluster terdaftar untuk membangun kluster cloud hybrid

  1. Konfigurasikan plugin jaringan yang berjalan di pusat data dan plugin jaringan yang berjalan di cloud.

    Untuk membangun kluster cloud hybrid, Anda harus mengonfigurasi plugin jaringan yang hanya berjalan di pusat data dan plugin jaringan yang hanya berjalan di cloud.

    Label alibabacloud.com/external=true secara otomatis ditambahkan ke Instance ECS yang ditambahkan ke kluster terdaftar. Oleh karena itu, Anda harus mengonfigurasi pengaturan afinitas node untuk pod Calico untuk mencegah pod tersebut dijadwalkan ke node di cloud. Contoh:

    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 jaringan Terway.

    Menggunakan onectl

    1. Instal dan konfigurasikan onectl pada mesin lokal Anda. Untuk informasi lebih lanjut, lihat Gunakan onectl untuk Mengelola Kluster Terdaftar.

    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.

    Menggunakan konsol

    Gunakan kebijakan berikut untuk memberikan izin RAM kepada plugin jaringan Terway. Untuk informasi lebih lanjut, lihat Memberikan Izin kepada 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.

    Menggunakan onectl

    Jalankan perintah berikut untuk menginstal plugin Terway:

    onectl addon install terway-eniip

    Output yang diharapkan:

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

    Menggunakan konsol

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

    2. Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel kiri, pilih Operations > Add-ons.

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

    4. Jalankan perintah berikut untuk menanyakan DaemonSet yang dibuat untuk Terway:

  4. Setelah Anda terhubung ke kluster menggunakan kubectl, jalankan perintah berikut di kluster terdaftar untuk melihat DaemonSet yang dibuat untuk Terway.

    Sebelum Anda menambahkan node di cloud dalam kluster hybrid, pod Terway tidak dijadwalkan ke node lokal 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 menunjukkan bahwa pod Terway hanya dijadwalkan ke Instance ECS dengan label alibabacloud.com/external=true.

  5. Jalankan perintah berikut untuk memodifikasi eni-config di ConfigMap dan konfigurasikan eni_conf.access_key dan eni_conf.access_secret:

    kubectl -n kube-system edit cm eni-config

    Template berikut menyediakan contoh 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. Buat skrip inisialisasi node kustom.

    1. Buat skrip inisialisasi node kustom berdasarkan skrip inisialisasi node asli dari kluster Kubernetes yang dikelola sendiri.

      Dalam contoh ini, kluster Kubernetes yang dikelola sendiri diinisialisasi menggunakan alat Kubeadm. Blok kode berikut adalah contoh skrip inisialisasi asli yang digunakan untuk menambahkan node ke kluster Kubernetes yang dikelola sendiri. Skrip tersebut bernama init-node.sh.

      Lihat 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

      Buat skrip inisialisasi node kustom bernama init-node-ecs.sh untuk kluster terdaftar berdasarkan skrip init-node.sh. Skrip kustom digunakan untuk menerima dan mengonfigurasi variabel lingkungan berikut yang dikeluarkan oleh kluster terdaftar:ALIBABA_CLOUD_PROVIDER_ID, ALIBABA_CLOUD_NODE_NAME, ALIBABA_CLOUD_LABELS, dan ALIBABA_CLOUD_TAINTS. Blok kode berikut adalah contoh skrip kustom:

      Lihat 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
      
      ####### <Konten berikut ditambahkan.
      # Konfigurasikan label node, taints, nama node, dan ID Provider.
      #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
      
      # Mulai ulang Docker dan mulai kubelet.
      systemctl daemon-reload
      systemctl enable kubelet && systemctl start kubelet
      
      ####### Konten sebelumnya ditambahkan.>
      
      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 ke server file HTTP, seperti Bucket OSS. Dalam contoh ini, jalur OSS dari skrip kustom adalah https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.sh.

      Tetapkan parameter addNodeScriptPath dalam blok kode berikut ke https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.sh dan simpan perubahan:

      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 langkah-langkah sebelumnya selesai, Anda dapat membuat pool node di kluster terdaftar dan menambahkan Instance ECS ke dalam pool node.

  7. Buat pool node dan tambahkan Instance ECS ke dalam pool node.

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

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

    3. Di halaman Node Pools, buat pool node dan tambahkan Instance ECS ke dalam pool node. Untuk informasi lebih lanjut, lihat Membuat dan Mengelola Pool Node.

Referensi

Rencanakan jaringan kontainer untuk kluster yang menggunakan plugin jaringan Terway. Untuk informasi lebih lanjut, lihat Perencanaan Jaringan Kluster ACK yang Dikelola.

Sambungkan pusat data ke VPC. Untuk informasi lebih lanjut, lihat Fitur.

Buat kluster terdaftar di VPC dan daftarkan kluster Kubernetes yang dikelola sendiri ke ACK. Untuk informasi lebih lanjut, lihat Buat Kluster Terdaftar ACK One.