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

:ハイブリッドクラウドクラスターを構築し、クラスターにECSインスタンスを追加する

最終更新日:Nov 14, 2024

登録済みクラスターを使用して、データセンター内の自己管理型KubernetesクラスターをContainer Service for Kubernetes (ACK) に登録することで、ハイブリッドクラウドクラスターを構築できます。 ハイブリッドクラウドクラスターを構築した後、クラスターにElastic Compute Service (ECS) インスタンスを追加し、クラスターに属するクラウドリソースとオンプレミスリソースを一元管理できます。 このトピックでは、Calicoネットワークプラグインを使用してACKを取得する自己管理Kubernetesクラスターを登録することにより、ハイブリッドクラウドクラスターを構築する方法について説明します。

前提条件

  • 自己管理クラスターが存在するデータセンターは、登録されたクラスターがデプロイされている仮想プライベートクラウド (VPC) に接続されています。 データセンター内のコンピューティングノードおよびコンテナは、VPC内のコンピューティングノードおよびコンテナと通信できます。 Cloud Enterprise Network (CEN) を使用してネットワーク接続を確立できます。 詳細については、「概要」をご参照ください。

  • 自己管理Kubernetesクラスターは、登録済みクラスターを使用してACKに登録されます。

  • 登録済みクラスターに追加されたクラウドコンピューティングノードは、データセンターの自己管理KubernetesクラスターのAPIサーバーにアクセスできます。

  • kubectlクライアントが登録済みクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。

ハイブリッドクラウドクラスターのアーキテクチャ

Calicoは、自己管理Kubernetesクラスターで一般的に使用されます。 このトピックでは、自己管理クラスターでCalico route reflectorモードを使用します。 コンテナネットワークを管理するために、クラウドプラットフォーム用に最適化されたネットワークプラグインを選択することを推奨します。 ACKは、Terwayネットワークプラグインを使用してコンテナネットワークを管理します。 次の図は、ハイブリッドクラウドクラスターのネットワークアーキテクチャを示しています。

image

データセンターのプライベートCIDRブロックは192.168.0.0/24です。 データセンターのコンテナのCIDRブロックは10.100.0.0/16です。 自己管理クラスターは、Calico route reflectorモードを使用します。 VPCのCIDRブロックは10.0.0.0/8です。 登録済みクラスターのノードで使用されるvSwitchのCIDRブロックは10.10.25.0/24です。 登録済みクラスターはTerway共有ネットワークモードを使用します。

登録済みクラスターを使用したハイブリッドクラウドクラスターの構築

  1. データセンターで実行されるネットワークプラグインと、クラウドで実行されるネットワークプラグインを設定します。

    ハイブリッドクラウドクラスターを構築するには、データセンターでのみ実行されるネットワークプラグインと、クラウドでのみ実行されるネットワークプラグインを設定する必要があります。

    alibabacloud.com/external=trueラベルは、登録済みクラスターに追加されたECSインスタンスに自動的に追加されます。 したがって、ポッドがクラウド内のノードにスケジュールされないように、Calicoポッドのノードアフィニティ設定を構成する必要があります。 例:

    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権限を設定します。

    onectlの使用

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

    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ネットワークプラグインに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プラグインをインストールします。

    onectlの使用

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

    onectl addon install terway-eniip

    期待される出力:

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

    コンソールの使用

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

    2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[操作] > [アドオン] を選択します。

    3. On theアドオンページを検索し、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ポッドがalibabacloud.com/external=trueラベルのECSインスタンスにのみスケジュールされていることを示しています。

  5. 次のコマンドを実行して、ConfigMapでeni-configを変更し、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クラスターの元のノード初期化スクリプトに基づいて、カスタムノード初期化スクリプトを作成します。

      この例では、自己管理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

      init-node.shスクリプトに基づいて、登録済みクラスターのinit-node-ecs.shという名前のカスタムノード初期化スクリプトを作成します。 カスタムスクリプトは、登録済みクラスターによって発行された次の環境変数ALIBABA_CLOUD_PROVIDER_IDALIBABA_CLOUD_NODE_NAMEALIBABA_CLOUD_LABELS、およびALIBABA_CLOUD_TAINTSを受信および設定するために使用されます。 次のコードブロックは、カスタムスクリプトの例です。

      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
      
      ####### <The following content is added.
      # Configure node labels, taints, the node name, and the 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
      
      ####### The preceding content is added.>
      
      kubeadm join 10.200.1.253:XXXX --token cqgql5.1mdcjcvhszol**** --discovery-token-unsafe-skip-ca-verification
    2. カスタムスクリプトを保存して設定します。

      OSSバケットなどのHTTPファイルサーバーにカスタムスクリプトを保存します。 この例では、カスタムスクリプトのOSSパスはhttps:// kubelet-**** .oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.shです。

      次のコードブロックのaddNodeScriptPathパラメーターをhttps:// kubelet-**** .oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.shに設定し、変更を保存します。

      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

    上記の手順が完了したら、登録済みクラスターにノードプールを作成し、ノードプールにECSインスタンスを追加できます。

  7. ノードプールを作成し、ECSインスタンスをノードプールに追加します。

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

    2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ノード] > [ノードプール] を選択します。

    3. [ノードプール] ページで、ノードプールを作成し、ノードプールにECSインスタンスを追加します。 詳細については、「ノードプールの作成」をご参照ください。

関連ドキュメント

Terwayネットワークプラグインを使用するクラスターのコンテナーネットワークを計画します。 詳細については、「ACKクラスターのネットワークの計画」をご参照ください。

データセンターをVPCに接続します。 詳細については、「機能と特徴」をご参照ください。

VPCに登録済みクラスターを作成し、自己管理型KubernetesクラスターをACKに登録します。 詳細については、「ACKコンソールでの登録済みクラスターの作成」をご参照ください。