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

Elastic Container Instance:セルフマネージド Kubernetes クラスターに VNode をデプロイして Elastic Container Instance に接続する

最終更新日:Dec 28, 2024

Elastic Compute Service (ECS) インスタンスでホストされているセルフマネージド Kubernetes クラスターを Elastic Container Instance に接続するには、クラスターに VNode をデプロイする必要があります。このトピックでは、同じ仮想プライベートクラウド (VPC) 内のセルフマネージド Kubernetes クラスターに VNode をデプロイする方法について説明します。

背景情報

Elastic Container Instance と Kubernetes の統合により、Kubernetes リソース管理のための階層型ソリューションが提供されます。Elastic Container Instance は、基盤となるアーキテクチャでポッドのスケジューリングと管理を行い、Kubernetes はプラットフォーム層でワークロードを管理します。ECS インスタンス上にセルフマネージド Kubernetes クラスターを作成した場合、クラスターに VNode をデプロイして Elastic Container Instance を使用できます。詳細については、セルフマネージド Kubernetes クラスターを Elastic Container Instance に接続する を参照してください。

前提条件

  • kubeadm を使用して、バージョン 1.13 から 1.30 のセルフマネージド Kubernetes クラスターが ECS インスタンス上に作成されていること。

  • Flannel、Calico、または Cilium ネットワークプラグインがクラスターにデプロイされていること。

VNodectl のインストール

Elastic Container Instance は、VNode のデプロイと管理を行うための VNodectl CLI を提供しています。VNodectl は Kubernetes クラスターのマスターノードにインストールすることをお勧めします。

  1. Kubernetes クラスターに接続します。

  2. VNodectl のインストールパッケージをダウンロードします。

    wget https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnodectl_0.0.5-beta_linux_amd64.tar.gz -O vnodectl.tar.gz 
  3. ダウンロードした VNodectl のパッケージファイルを展開します。

    tar xvf vnodectl.tar.gz 
  4. 展開したパッケージファイルを指定したディレクトリにコピーします。

    cp vnodectl /usr/local/bin/vnode

~/.vnode/config ファイルの設定

  1. ~/.vnode/config ファイルの内容を変更します。

    vim ~/.vnode/config

    ビジネス要件に基づいて ~/.vnode/config ファイルの内容を変更します。例:

    重要
    • kubeconfig ファイルには、cluster-admin 権限が必要です。kubeconfig ファイルの権限スコープを縮小する場合は、クラスターの設定 を参照してください。

    • kubeconfig ファイルで指定された apiserver アドレスに VNode からアクセスできることを確認してください。

    kind: vnode
    contexts:
        - name: default                                          # コンテキストの名前。
          region-id: cn-hangzhou                                 # リージョン ID。
          access-key-id: LTAI5tJbBkHcHBUmuP7C****                # AccessKey ID。
          access-key-secret: 5PlpKJT6sgLcD4f9y5pACNDbEg****      # AccessKey シークレット。
          vswitch-id: vsw-7xv2yk45qp5etidgf****                  # VNode に接続されている vSwitch の ID。
          security-group-id: sg-7xv5tcch4kjdr65t****             # VNode が属するセキュリティグループの ID。
          kubeconfig: /path/to/kubeconfig                        # クラスターの kubeconfig ファイル。
    current-context: default
  2. VNode を実行して、コンテキスト内の設定を読み込みます。

    vnode config set-context <context-name>

VNode の作成

  1. VNode を作成します。

    vnode create

    次のサンプルコードは、出力例を示しています。VirtualNodeId パラメーターの値は、生成された VNode の ID です。

    {"RequestId":"AB772F9D-2FEF-5BFD-AAFB-DA3444851F29","VirtualNodeId":"vnd-7xvetkyase7gb62u****"}
  2. ノードに関する情報を表示します。

    kubectl get node

    次のサンプルコードは、VNode がクラスターにデプロイされていることを示す出力例を示しています。

    NAME                                    STATUS     ROLES                  AGE    VERSION
    cn-hangzhou.vnd-7xvetkyase7gb62u****    Ready      agent                  174m   v1.20.6
    vnode-test001                           Ready      control-plane,master   23h    v1.20.6
    vnode-test002                           Ready      <none>                 22h    v1.20.6

DaemonSet が VNode にスケジュールされないようにする

VNode は実際のノードではないため、DaemonSet は VNode 上で実行できません。VNode を作成した後、kube-proxy の DaemonSet を変更し、nodeAffinity を設定して、DaemonSet が VNode にスケジュールされないようにする必要があります。

  1. DaemonSet の設定を変更します。

    kubectl -n kube-system edit ds kube-proxy
  2. nodeAffinity を設定します。

    次の YAML コンテンツを spec > template > spec に追加します。

    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: type
              operator: NotIn
              values:
              - virtual-kubelet

VNode へのポッドのスケジュール

VNode を作成した後、次のいずれかの方法を使用して、ポッドを VNode にスケジュールできます。その後、ポッドを VNode 内の Elastic Container Instance として実行できます。

  • 手動スケジューリング

    nodeSelector パラメーターと tolerations パラメーターを設定するか、nodeName パラメーターを指定して、ポッドを VNode にスケジュールできます。詳細については、VNode へのポッドのスケジュール を参照してください。

  • 自動スケジューリング

    eci-profile コンポーネントをデプロイした後、Selector パラメーターを指定できます。これにより、システムは Selector で指定された条件を満たすポッドを VNode に自動的にスケジュールします。詳細については、eci-profile を使用してポッドを VNode にスケジュールする を参照してください。

セルフマネージド Kubernetes クラスターのオーバーレイネットワーク内のポッドを Elastic Container Instance ベースのポッドからアクセスできるようにする

VNode にスケジュールされたポッドは、ポッドが属する VPC 内の vSwitch の Elastic Network Interface (ENI) を使用します。デフォルトでは、ポッドには内部 IP アドレスが割り当てられます。

Elastic Container Instance ベースのポッドは、セルフマネージド Kubernetes クラスターのオーバーレイネットワーク (Flannel、Calico、または Cilium) 内のポッドにアクセスできません。ただし、セルフマネージド Kubernetes クラスターのオーバーレイネットワーク内のポッドは、Elastic Container Instance ベースのポッドにアクセスできます。Elastic Container Instance ベースのポッドがセルフマネージドクラスターのオーバーレイネットワーク内のポッドにアクセスする必要がある場合は、Elastic Container Instance ベースのポッドが属する VPC のルートテーブルにルートエントリを追加します。これにより、Elastic Container Instance ベースのポッドからのパケットをルートエントリを使用してセルフマネージドクラスター内の対応する ECS ノードにルーティングできます。

設定例:

  • シナリオ例

    たとえば、クラスターに 2 つのポッドが含まれているとします。1 つのポッド (test1) は VNode 上で実行されます。もう 1 つのポッド (test2) は ECS ノード上で実行されます。デフォルトでは、test2 は test1 にアクセスできますが、test1 は test2 にアクセスできません。

    NAME      READY     RESTARTS    AGE    IP                NODE                                   NOMINATED NODE   READINESS NODE
    test1     1/1       0           58s    192.168.0.245     cn-hangzhou.vnd-7xvetkyase7gb62u****   <none>           <none>
    test2     1/1       0           35s    10.88.1.4         vnode-test002                          <none>           <none>
  • 手順

    1. VPC コンソール にログインします。

    2. 左側のナビゲーションペインで、ルートテーブル をクリックします。

    3. Elastic Container Instance が存在するリージョンに切り替え、Elastic Container Instance ベースのポッドが属する VPC のルートテーブルを見つけ、ルートテーブルの ID をクリックします。

    4. ルートエントリ一覧 タブで、カスタムルート タブをクリックします。

    5. ルートエントリの追加 をクリックします。

    6. 表示されるダイアログボックスで、ルートエントリを設定し、OK をクリックします。

      この例では、次の設定が使用されています。

      • 宛先 CIDR ブロック:ECS ノードに接続されている vSwitch の CIDR ブロックを入力します。例:10.88.1.0/24。

      • ネクストホップタイプ:ドロップダウンリストから ECS インスタンス を選択します。

      • ECS インスタンス:ECS ノードを選択します。

  • 結果の確認

    kubectl exec コマンドを実行して test1 のコンテナーに入り、ping コマンドを実行します。test2 の IP アドレスに ping できる場合、2 つのポッド間の接続が確立され、test1 は test2 にアクセスできます。

参考文献