すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ハイブリッドエラスティックコンテナクラスターの作成 (エラスティック ECS)

最終更新日:Mar 07, 2026

ハイブリッドクラスターは、オンプレミス型セルフマネージド Kubernetes クラスターを登録済みクラスターを介して Alibaba Cloud に接続します。この設定により、クラウドベースのコンピューティングノードでセルフマネージド Kubernetes クラスターをスケーリングし、オンプレミスとクラウドの両方のリソースを管理できます。このトピックでは、Calico コンテナネットワークプラグインを使用するデータセンター内のセルフマネージド Kubernetes クラスターを例として、ハイブリッドクラスターの作成方法を説明します。

前提条件

  • オンプレミス型セルフマネージド Kubernetes クラスターのネットワークと、登録済みクラスターで使用される VPC (Virtual Private Cloud) は接続されている必要があります。これには、コンピューティングノードネットワークとコンテナネットワークの両方の接続性が含まれます。この接続を確立するには、Cloud Enterprise Network (CEN) を使用できます。詳細については、「さまざまなシナリオでの複数 VPC 接続の確立」をご参照ください。

  • 宛先クラスターは、登録済みクラスターによって提供されるプライベートクラスターインポートエージェント構成を使用して接続する必要があります。

  • 登録済みクラスターを介して追加されたクラウドベースのコンピューティングノードは、オンプレミス型セルフマネージド Kubernetes クラスターの API Server にアクセスできる必要があります。

  • kubectl を使用して登録済みクラスターに接続済みです。詳細については、「クラスターの kubeconfig ファイルの取得と kubectl を使用したクラスターへの接続」をご参照ください。

ハイブリッドエラスティックコンテナクラスターアーキテクチャ

セルフマネージド Kubernetes クラスターは、ルーティングに Calico を使用することがよくあります。このトピックでは、Calico のルートリフレクターモードを使用するデータセンター内のセルフマネージドクラスターを例として使用します。クラウド環境では、特定のクラウドプラットフォーム向けにカスタマイズされたネットワークプラグインを使用します。Container Service for Kubernetes (ACK) は、コンテナネットワークを管理するために Terway プラグインを使用します。次の図は、ハイブリッドクラスターのネットワークトポロジーを示しています。

image

ご利用のデータセンターでは、プライベート CIDR ブロックは 192.168.0.0/24 であり、コンテナネットワーク CIDR ブロックは 10.100.0.0/16 です。Calico ネットワークプラグインはルートリフレクターモードを使用します。クラウド側では、VPC CIDR ブロックは 10.0.0.0/8 です。コンピューティングノードの vSwitch CIDR ブロックは 10.10.24.0/24 であり、Pod の vSwitch CIDR ブロックは 10.10.25.0/24 です。Terway ネットワークコンポーネントは共有モードを使用します。

登録済み ACK クラスターを使用したハイブリッドコンテナクラスターの作成

  1. オンプレミスとクラウドベースのコンテナネットワークプラグインを構成します。

    ハイブリッドクラスターでは、オンプレミスの Calico プラグインがオンプレミスでのみ実行され、クラウドベースの Terway コンポーネントがクラウドでのみ実行されるようにします。

    登録済み ACK クラスターに追加されたクラウドベースの Elastic Compute Service (ECS) ノードには、自動的に alibabacloud.com/external=true のラベルが付けられます。データセンター内の Calico Pod がオンプレミスでのみ実行されるようにするには、NodeAffinity を構成します。次の例は、その方法を示しています。

    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. Terway プラグインの RAM 権限を構成します。

    onetl を使用した構成

    1. ローカルマシンに onectl をインストールして構成します。詳細については、「onetl を使用した登録済みクラスターの管理」をご参照ください。

    2. 次のコマンドを実行して、Terway プラグインの RAM 権限を構成します。

      onectl ram-user grant --addon terway-eniip

      予想される出力:

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

    コンソールでの構成

    Terway ネットワークコンポーネントの AccessKey 情報に必要な Resource Access Management (RAM) 権限を構成します。次のポリシードキュメントは、必要な権限を一覧表示します。詳細については、「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. Terway プラグインをインストールします。

    onetl を使用したインストール

    次のコマンドを実行して、Terway プラグインをインストールします。

    onectl addon install terway-eniip

    予想される出力:

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

    コンソールでのインストール

    1. Container Service 管理コンソールにログインします。Container Service 管理コンソール 。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

    2. [クラスターリスト] ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、[アドオン管理] をクリックします。

    3. アドオン管理」ページで、「[terway-eniip]」コンポーネントを検索します。コンポーネントカードの右下隅で、「インストール」をクリックし、その後「OK」をクリックします。

    4. 次のコマンドを実行して、Terway ネットワークコンポーネントの DaemonSet を表示します。

  4. kubectl を使用してクラスターに接続した後、登録済みクラスターで次のコマンドを実行して、Terway ネットワークコンポーネントの DaemonSet を表示します。

    クラウドベースのノードでハイブリッドクラスターをスケールアウトする前は、Terway はオンプレミスノードにはスケジュールされません。

    kubectl -nkube-system get ds |grep terway

    予想される出力:

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

    予想される出力は、Terway Pod が alibabacloud.com/external=true のラベルが付いたクラウドベースの ECS ノードでのみ実行されることを示しています。

  5. 次のコマンドを実行して eni-config ConfigMap を編集し、[eni_conf.access_key][eni_conf.access_secret] を設定します。

    kubectl -n kube-system edit cm eni-config

    次の例は、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. カスタムノード初期化スクリプトを構成します。

    1. セルフマネージド Kubernetes クラスターの元のノード初期化スクリプトを変更します。

      この例では、kubeadm ツールで初期化されたデータセンター内のセルフマネージド Kubernetes クラスターを使用します。次の例は、データセンター内のクラスターに新しいノードを追加する元の初期化スクリプト `init-node.sh` を示しています。

      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

      登録済み ACK クラスターに必要なカスタムノード初期化スクリプト `init-node-ecs.sh` は、`init-node.sh` スクリプトに基づいています。これは、登録済みクラスターから渡される ALIBABA_CLOUD_PROVIDER_IDALIBABA_CLOUD_NODE_NAMEALIBABA_CLOUD_LABELS、および ALIBABA_CLOUD_TAINTS 環境変数を受け取り、構成します。次の例は、`init-node-ecs.sh` スクリプトを示しています。

      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. カスタムスクリプトを保存して構成します。

      カスタムスクリプトを、Object Storage Service (OSS) バケットなどの HTTP ファイルサーバに保存します。次の例は、サンプル URL を示しています: https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.sh

      カスタムノード追加スクリプトのパス https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.shaddNodeScriptPath フィールドを設定し、構成を保存します。次の例は、その方法を示しています。

      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

    これらの構成を完了した後、宛先登録済み ACK クラスターでノードプールを作成し、ECS ノードをスケールアウトできます。

  7. ノードプールを作成し、ECS ノードをスケールアウトします。

    1. Container Service 管理コンソールにログインします。Container Service 管理コンソール 。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

    2. クラスターリスト」ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、ノード > ノードプール をクリックします。

    3. ノードプール ページで、ノードプールを作成し、必要に応じてノードをスケールアウトします。詳細については、「ノードプールの作成と管理」をご参照ください。

参照情報

Terway シナリオのコンテナネットワークを計画します。詳細については、「ACK マネージドクラスターのネットワーク計画」をご参照ください。

データセンター内の Kubernetes クラスターのネットワークをクラウド内の VPC に接続します。詳細については、「機能」をご参照ください。

登録済みクラスターを作成し、データセンター内のセルフマネージド Kubernetes クラスターに接続します。詳細については、「ACK One 登録済みクラスターの作成」をご参照ください。