ECS 上の自己管理型 Kubernetes クラスターに仮想ノード (VNode) をデプロイし、同一 VPC 内で Elastic Container Instance (ECI) を使用して Pod をスケジューリングします。
背景情報
ECI はインフラストラクチャレイヤーで Pod のスケジューリングとリソースを管理し、Kubernetes はその上でワークロード管理を担います。ECS 上の自己管理型クラスターに VNode を追加すると、ECI を使用できます。自己管理型 Kubernetes クラスターの ECI への接続では、統合プロセス全体について説明しています。
前提条件
-
kubeadm で作成された、ECS 上の自己管理型 Kubernetes クラスター (v1.13~1.30)。
-
クラスターに Flannel、Calico、または Cilium のネットワークプラグインがデプロイされていること。
vnodectl のインストール
ECI は、VNode を接続・管理するための vnodectl を提供しています。クラスターのコントロールプレーンノードにインストールすることを推奨します。
クラスターに接続します。
インストールパッケージをダウンロードします。
wget https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnodectl_0.0.5-beta_linux_amd64.tar.gz -O vnodectl.tar.gzパッケージを展開します。
tar xvf vnodectl.tar.gzvnodectl をディレクトリにコピーします。
cp vnodectl /usr/local/bin/vnode
~/.vnode/config ファイルの設定
-
~/.vnode/configファイルを編集します。vim ~/.vnode/config設定を追加します。例:
重要-
kubeconfig には
cluster-admin権限が必要です。権限を制限した代替案については、「クラスターの設定」をご参照ください。 -
VNode から kubeconfig 内の API サーバーアドレスに到達できる必要があります。
kind: vnode contexts: - name: default # コンテキストの名前 region-id: cn-hangzhou # リージョン ID access-key-id: <yourAccessKeyID> # AccessKey ID access-key-secret: <yourAccessKeySecret> # AccessKey Secret vswitch-id: vsw-7xv2yk45qp5etidgf**** # VNode が属する vSwitch の ID security-group-id: sg-7xv5tcch4kjdr65t**** # VNode が属するセキュリティグループの ID kubeconfig: /path/to/kubeconfig # クラスターの kubeconfig ファイルへのパス current-context: default -
-
アクティブなコンテキストを設定します。
vnode config set-context <context-name>
VNode の作成
-
VNode を作成します。
vnode create出力には VirtualNodeId が含まれます。
{"RequestId":"AB772F9D-2FEF-5BFD-AAFB-DA3444851F29","VirtualNodeId":"vnd-7xvetkyase7gb62u****"} -
ノードを確認します。
kubectl get nodeVNode が Ready ステータスで表示されます。
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-proxynodeAffinityを設定します。
spec.template.specに次の YAML コンテンツを追加します。affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: type operator: NotIn values: - virtual-kubelet
PodをVNodeにスケジュールする
VNodeを作成した後、次のいずれかの方法を使用してPodをVNodeにスケジュールできます。その後、PodをVNodeのエラスティックコンテナインスタンスとして実行できます。
手動スケジューリング
nodeSelectorおよびtolerationsパラメータを設定するか、nodeNameパラメータを指定して、PodをVNodeにスケジュールできます。詳細については、PodをVNodeにスケジュールするを参照してください。
自動スケジューリング
eci-profileコンポーネントをデプロイした後、Selectorパラメータを指定できます。このようにして、システムはSelectorで指定された条件を満たすPodをVNodeに自動的にスケジュールします。詳細については、eci-profileを使用してPodをVNodeにスケジュールするを参照してください。
Pod のネットワーク接続の確立
VNode 上の Pod は、VPC の vSwitch から ENI と内部 IP アドレスを受け取ります。
デフォルトでは、VNode 上の Pod はクラスターのオーバーレイネットワーク (Flannel、Calico、または Cilium) 上の Pod には到達できませんが、その逆は可能です。VPC のルートテーブルにルートエントリを追加して、VNode 上の Pod からのアウトバウンドトラフィックを正しい ECS ノードに転送する必要があります。
ルート設定の例:
-
シナリオ例
この例では、test1 は VNode 上で、test2 は ECS ノード上で実行されます。デフォルトでは、test2 は test1 に到達できますが、その逆はできません。
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 コンソールにログインします。
-
左側メニューで、ルートテーブル をクリックします。
-
クラスターのリージョンに切り替え、VPC のルートテーブルを見つけて、その ID をクリックします。
-
ルートエントリ タブで、カスタムルート タブをクリックします。
-
ルートエントリの追加 をクリックします。
-
[ルートエントリの追加] パネルで、ルートエントリを設定し、OK をクリックします。
設定例:
-
ターゲット CIDR:ターゲット ECS ノード上の Pod の CIDR ブロック (例:10.88.1.0/24) を入力します。
-
ネクストホップの種類:ECS インスタンス を選択します。
-
ECS インスタンス:ターゲットの ECS ノードを選択します。
-
-
-
結果の確認
kubectl execを実行して test1 でシェルを開き、test2 に ping を実行します。正常な応答があれば、test1 が test2 に到達できるようになったことが確認できます。
関連ドキュメント
-
VNodectl を使用せずに接続するには、コンソールまたは OpenAPI を使用します。「VNode への接続 (手動)」をご参照ください。