Container Service for Kubernetes (ACK) Edge クラスターは、クラウドノードプールとエッジノードプールそれぞれに、異なる Service タイプとアクセス方法を持つ独立した NGINX Ingress コントローラーを実行します。このトピックでは、両方のノードプールに NGINX Ingress をデプロイおよび設定する方法、そしてトラフィックが正しくルーティングされることを確認する方法について説明します。
前提条件
作業を開始する前に、以下のものが揃っていることを確認してください:
-
少なくとも 1 つのクラウドノードプールと 1 つのエッジノードプールを持つ ACK Edge クラスター
-
両方のノードプールにデプロイされた NGINX Ingress コントローラー (「NGINX Ingress コントローラーのインストール」をご参照ください)
ACK Edge クラスターでは、NGINX Ingress コントローラーはアプリケーションマーケットプレイスからのみデプロイできます。
仕組み
ACK Edge は、クラウドノードプール用とエッジノードプール用に、2 つの独立した NGINX Ingress コントローラーを実行します。トラフィックは、各 Ingress リソースの ingressClassName フィールドに基づいて、正しいコントローラーに到達します。
2 つのコントローラーは、サービスを公開する方法が異なります:
| クラウドノードプール | エッジノードプール | |
|---|---|---|
| 名前空間 | ingress-cloud |
ingress-edge |
| Service タイプ | LoadBalancer | NodePort |
| 外部アクセス | ロードバランサーの IP アドレス | ノード IP アドレス + NodePort |
| Ingress クラス | ack-nginx-cloud |
ack-nginx-edge |
| Ingress の ADDRESS フィールド | ロードバランサーの外部 IP (自動入力) | NodePort サービスの ClusterIP |
NGINX Ingress コントローラーの確認
NGINX Ingress コントローラーをインストールした後、Pod とサービスが両方のノードプールで実行されていることを確認します。
-
クラウドノードプールの Pod ステータスを確認します:
kubectl get po -n ingress-cloud -o wide期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ack-ingress-nginx-v1-cloud-controller-7d7b555f8b-5kgqb 1/1 Running 0 20s 10.10.0.1 cloud-node-1 <none> <none> ack-ingress-nginx-v1-cloud-controller-7d7b555f8b-725cl 1/1 Running 0 20s 10.10.0.2 cloud-node-2 <none> <none> -
クラウドノードプールの Service ステータスを確認します:
kubectl get svc -n ingress-cloud期待される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ack-ingress-nginx-v1-cloud-controller LoadBalancer 172.12.0.1 xxx.xxx.xxx.xxx 80:30080/TCP,443:30443/TCP 30SEXTERNAL-IPフィールドには、ロードバランサーの IP アドレスが表示されます。この IP のポート 80 または 443 に送信されたトラフィックは、クラウド Ingress コントローラーによってルーティングされます。 -
エッジノードプールの Pod ステータスを確認します:
kubectl get po -n ingress-edge -o wide期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ack-ingress-nginx-v1-edge-controller-7d57b84c88-4wsm4 1/1 Running 0 17s 10.10.0.1 edge-node-1 <none> <none> ack-ingress-nginx-v1-edge-controller-7d57b84c88-fqvj8 1/1 Running 0 17s 10.10.1.1 edge-node-2 <none> <none> -
エッジノードプールの Service ステータスを確認します:
kubectl get svc -n ingress-edge期待される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ack-ingress-nginx-v1-edge-controller NodePort 172.12.0.2 <none> 80:32080/TCP,443:32443/TCP 3m51sエッジコントローラーは NodePort を使用します。ノードプールの外部からエッジサービスにアクセスするには、任意のエッジノードの IP と、サービスによって公開されている NodePort (例:HTTP の場合はポート
32080) を使用します。
テストアプリケーションのデプロイ
-
cube.yamlという名前のファイルを作成し、次の内容を記述します:apiVersion: v1 kind: Service metadata: name: cube-svc annotations: openyurt.io/topologyKeys: openyurt.io/nodepool spec: type: ClusterIP selector: app: cube ports: - port: 80 targetPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: cube labels: app: cube spec: replicas: 4 selector: matchLabels: app: cube template: metadata: labels: app: cube spec: containers: - name: cube-web image: registry.cn-hangzhou.aliyuncs.com/acr-toolkit/ack-cube:1.0 ports: - containerPort: 80 -
マニフェストを適用して、
cubeアプリケーションとその Service を作成します:kubectl apply -f cube.yaml -
Pod が両方のノードプールで実行されていることを確認します:
kubectl get pod -o wide期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE cube-757558c974-9zfkn 1/1 Running 0 11m 10.10.0.1 cloud-node-1 cube-757558c974-cw72m 1/1 Running 0 11m 10.10.0.2 cloud-node-2 cube-757558c974-fbvlf 1/1 Running 0 11m 10.10.1.1 edge-node-1 cube-757558c974-ngwxt 1/1 Running 0 11m 10.10.1.2 edge-node-2続行する前に、Pod がクラウドノードとエッジノードの両方にスケジュールされていることを確認してください。
Ingress リソースの作成
-
ingress.yamlという名前のファイルを作成し、次の内容を記述します:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cube-ingress-cloud namespace: default spec: ingressClassName: ack-nginx-cloud # クラウド Ingress コントローラー用の Ingress を作成します。 rules: - host: example.cube.com http: paths: - path: / backend: service: name: cube-svc port: number: 80 pathType: ImplementationSpecific --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cube-ingress-edge namespace: default spec: ingressClassName: ack-nginx-edge # エッジ Ingress コントローラー用の Ingress を作成します。 rules: - host: example.cube.com http: paths: - path: / backend: service: name: cube-svc port: number: 80 pathType: ImplementationSpecific両方の Ingress リソースは同じ
cube-svcService をターゲットにしますが、ingressClassNameフィールドによって、どちらのコントローラーがトラフィックを処理するかが決まります。 -
マニフェストを適用します:
kubectl apply -f ingress.yaml -
両方の Ingress リソースが作成され、アドレスが割り当てられていることを確認します:
kubectl get ingress期待される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE cube-ingress-cloud ack-nginx-cloud example.cube.com 139.224.xxx.xxx 80 24m cube-ingress-edge ack-nginx-edge example.cube.com 172.20.xxx.xxx 80 24m-
cube-ingress-cloud:ADDRESS フィールドには、ロードバランサーの外部 IP が表示されます。この IP を使用して、クラウドコントローラー経由でサービスにアクセスします。 -
cube-ingress-edge:ADDRESS フィールドには、NodePort サービスの ClusterIP が表示されますが、これはクラスターの外部から直接アクセスできません。ノードプールの外部からエッジサービスにアクセスするには、任意のエッジノードの IP と NodePort を使用します。
-
次のステップ
ACK Edge クラスターは、ACK Pro マネージドクラスターの機能を拡張して、エッジノードをデータセンターに接続します。次の表は、追加の NGINX Ingress 操作と、ACK Edge 固有の違いを示しています:
| 操作 | リファレンス | ACK Edge での違い |
|---|---|---|
| NGINX Ingress の作成 | NGINX Ingress の作成 | 実際のシナリオに基づいてトラフィックのトポロジーを設定 |
| NGINX Ingress コントローラーのインストール | NGINX Ingress コントローラーのインストール | アプリケーションマーケットプレイスからのデプロイのみをサポート |
| NGINX Ingress コントローラーの更新 | ACK コンソールのマーケットプレイスページから ack-ingress-nginx を ack-ingress-nginx-v1 に更新 | アプリケーションマーケットプレイスからのアップグレードのみをサポート |
| 高負荷アプリケーション向けのインストール | 高負荷シナリオでの NGINX Ingress コントローラーのインストール | なし |
| インターネット向けおよび内部向け CLB インスタンスの設定 | インターネット向けまたは内部向け NGINX Ingress コントローラーの設定 | クラウドノードプールにデプロイされた Ingress コントローラーのみをサポート |
| カナリアリリースとブルーグリーンリリース | NGINX Ingress コントローラーを使用したカナリアリリースとブルーグリーンリリースの実装 | なし |
| ネットワークトラフィックのミラーリング | Ingress コントローラーを使用したネットワークトラフィックのミラーリング | なし |
| トレース分析 | NGINX Ingress コントローラーでのトレース分析の実行 | なし |
| アクセスログの表示 | nginx-ingress-controller のアクセスログの分析とモニター | コマンドラインでの有効化のみをサポート |
| gRPC サービスへのアクセス | Ingress コントローラーによる gRPC サービスへのアクセス | なし |