クラウド・エッジ連携シナリオでは、エッジユニットサービスがトラフィックをクラウド経由でルーティングするのではなく、自らのノードプール内においてローカルに処理する必要があります。ack-ingress-nginx-v1 を、クラウドノードプールとエッジノードプールそれぞれに個別にデプロイすることで、各ノードプールが専用の Ingress コントローラーを持ち、トラフィックを独立して処理できるようにします。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
Kubernetes 1.19 以降を実行している ACK Edge クラスター
ACK コンソール へのアクセス権限
対象とするクラウドノードプールおよびエッジノードプールのノードプール ID
ノードプール ID を確認するには、ACK コンソールのクラスタ詳細ページを開き、左側のナビゲーションウィンドウから [ノード] > [ノードプール] を選択します。
注意事項
同一の ACK Edge クラスター内に、
ack-ingress-nginx-v1を複数回デプロイできます。各デプロイには一意のリリース名を割り当て、操作を分離するために各デプロイごとに別の名前空間を使用してください。初回デプロイでデフォルト設定を使用した場合、
ack-ingress-nginx-v1はクラスターのデフォルトノードプールにデプロイされます。
仕組み
ack-ingress-nginx-v1 の各デプロイは、nodeSelector パラメーターで指定されたノードプール ID により、単一のノードプールを対象とします。クラウドノードプールおよびエッジノードプールのそれぞれに 1 回ずつコントローラーをデプロイすることで、各プールがトラフィックをローカルでルーティングできるようになります。
エッジノードプールの場合、global.edgeNodePool を true に設定すると、以下の 2 つの自動変更が行われます。
エッジノードはクラウドのロードバランサー基盤にアクセスできないため、Service の種類が
LoadBalancerからNodePortに変更されます。NGINX Ingress コントローラーがパブリックなコンテナイメージアドレスを使用するようになり、クラスターが Alibaba Cloud の非公開イメージレジストリに到達できない場合でも、イメージのプル失敗を回避できます。
デプロイ後にエッジアプリケーションをパブリックインターネットに公開するには、パブリック IP アドレスを持つロードバランサーを別途設定してください。
NGINX Ingress コントローラーのデプロイ
ack-ingress-nginx-v1 を、対象とする各ノードプールについて、ACK Marketplace から 1 回ずつデプロイします。同一クラスター内で競合が発生しないよう、各デプロイには一意のリリース名および一意の ingressClassResource 値を使用してください。
クラウドノードプールへのデプロイ
ACK コンソール にログインします。左側のナビゲーションウィンドウから、[マーケットプレイス] > [マーケットプレイス] を選択します。
[アプリカタログ] タブで、ack-ingress-nginx-v1 を検索してクリックします。
ack-ingress-nginx-v1 ページの右上隅にある [デプロイ] をクリックします。
デプロイウィザードで、[クラスター]、[名前空間]、および[リリース名]を設定します。リリース名には、
ack-ingress-nginx-v1-{ノードプール名}の形式を使用します。たとえば:ack-ingress-nginx-v1-cloud-hangzhou。[次へ] をクリックして [パラメーター] ページに移動し、以下の設定を行います。
nodeSelectorパラメーターに、ラベルalibabacloud.com/nodepool-id: {ノードプール ID}を追加します。これは必須となる唯一のラベルです。
ingressClassResourceパラメーターで、nameおよびcontrollerValueを一意の値に設定し、同一クラスター内の複数デプロイ間で競合が発生しないようにします:
name:ack-nginx-{ノードプール名}の形式を使用します。例:ack-nginx-cloud-hangzhou。controllerValue:"k8s.io/ack-ingress-nginx-{ノードプール名}"の形式を使用します。例:"k8s.io/ack-ingress-nginx-cloud-hangzhou"。
[OK] をクリックします。
エッジノードプールへのデプロイ
ACK コンソール にログインします。左側のナビゲーションウィンドウから、[マーケットプレイス] > [マーケットプレイス] を選択します。
[アプリカタログ] タブで、ack-ingress-nginx-v1 を検索してクリックします。
ack-ingress-nginx-v1 ページの右上隅にある [デプロイ] をクリックします。
デプロイウィザードで、[クラスター]、[名前空間]、および [リリース名] を設定します。リリース名には、
ack-ingress-nginx-v1-{node pool name}の形式を使用します。例:ack-ingress-nginx-v1-edge-hangzhou。[次へ] をクリックして [パラメーター] ページに移動し、以下の設定を行います。
nodeSelectorパラメーターに、ラベルalibabacloud.com/nodepool-id: {エッジノードプール ID}を追加します。これは必須となる唯一のラベルです。
global.edgeNodePoolをtrueに設定します。エッジノードはクラウドのロードバランサー基盤を利用できないため、LoadBalancerサービスを使用できません。このパラメーターを設定すると、Service の種類がNodePortに変更され、コントローラー向けにパブリックなコンテナイメージアドレスが構成されます。デプロイ後にエッジアプリケーションをパブリックインターネットに公開するには、パブリック IP アドレスを持つロードバランサーを別途設定してください。
ingressClassResourceパラメーターで、nameおよびcontrollerValueを一意の値に設定します:
name:ack-nginx-{ノードプール名}の形式を使用します。例:ack-nginx-edge-hangzhou。controllerValue:"k8s.io/ack-ingress-nginx-{ノードプール名}"の形式を使用します。例:"k8s.io/ack-ingress-nginx-edge-hangzhou"。
[OK] をクリックします。
デプロイの確認
デプロイが完了したら、対象のノードプールで NGINX Ingress コントローラーが実行中であることを確認します。
クラスター詳細ページの左側ナビゲーションウィンドウから、[アプリケーション] > [Helm] を選択します。作成した Helm リリースが一覧に表示されていることを確認します。