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 クラスターのマスターノードにインストールすることをお勧めします。
Kubernetes クラスターに接続します。
VNodectl のインストールパッケージをダウンロードします。
wget https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnodectl_0.0.5-beta_linux_amd64.tar.gz -O vnodectl.tar.gz
ダウンロードした VNodectl のパッケージファイルを展開します。
tar xvf vnodectl.tar.gz
展開したパッケージファイルを指定したディレクトリにコピーします。
cp vnodectl /usr/local/bin/vnode
~/.vnode/config ファイルの設定
~/.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
VNode を実行して、コンテキスト内の設定を読み込みます。
vnode config set-context <context-name>
VNode の作成
VNode を作成します。
vnode create
次のサンプルコードは、出力例を示しています。VirtualNodeId パラメーターの値は、生成された VNode の ID です。
{"RequestId":"AB772F9D-2FEF-5BFD-AAFB-DA3444851F29","VirtualNodeId":"vnd-7xvetkyase7gb62u****"}
ノードに関する情報を表示します。
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 にスケジュールされないようにする必要があります。
DaemonSet の設定を変更します。
kubectl -n kube-system edit ds kube-proxy
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>
手順
VPC コンソール にログインします。
左側のナビゲーションペインで、ルートテーブル をクリックします。
Elastic Container Instance が存在するリージョンに切り替え、Elastic Container Instance ベースのポッドが属する VPC のルートテーブルを見つけ、ルートテーブルの ID をクリックします。
ルートエントリ一覧 タブで、カスタムルート タブをクリックします。
ルートエントリの追加 をクリックします。
表示されるダイアログボックスで、ルートエントリを設定し、OK をクリックします。
この例では、次の設定が使用されています。
宛先 CIDR ブロック:ECS ノードに接続されている vSwitch の CIDR ブロックを入力します。例:10.88.1.0/24。
ネクストホップタイプ:ドロップダウンリストから ECS インスタンス を選択します。
ECS インスタンス:ECS ノードを選択します。
結果の確認
kubectl exec
コマンドを実行して test1 のコンテナーに入り、ping
コマンドを実行します。test2 の IP アドレスに ping できる場合、2 つのポッド間の接続が確立され、test1 は test2 にアクセスできます。
参考文献
VNodectl を使用してセルフマネージド Kubernetes クラスターに VNode をデプロイする方法については、VNodectl を使用して VNode をセルフマネージド Kubernetes クラスターに接続する を参照してください。
VNodectl をインストールしたくない場合は、Elastic Container Instance コンソールを使用するか、API 操作を呼び出して VNode をデプロイできます。詳細については、VNode をセルフマネージド Kubernetes クラスターに手動で接続する を参照してください。