Ingress によるコンテナ ネイティブのロード バランシング

このページでは、Google Kubernetes Engine(GKE)でコンテナ ネイティブのロード バランシングを使用する方法について説明します。コンテナ ネイティブのロード バランシングにより、ロードバランサは Kubernetes Pod を直接ターゲットにして、トラフィックを Pod に均等に分配できます。

コンテナ ネイティブのロード バランシングのメリット、要件、制限事項の詳細については、コンテナ ネイティブのロード バランシングをご覧ください。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API を有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
  • すでに VPC ネイティブ クラスタが存在していることを確認する。必要な場合は、クラスタを作成します。GKE クラスタはデフォルトで VPC ネイティブです。

コンテナ ネイティブのロード バランシングを使用する

以下のセクションでは、GKE でのコンテナ ネイティブのロード バランシングの構成について説明します。

Deployment を作成する

次の Deployment のサンプル(neg-demo-app)では、コンテナ化された HTTP サーバーの単一インスタンスが実行されます。Pod の readiness フィードバックを使用するワークロードを使用することをおすすめします。

Pod の readiness フィードバックを使用する

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: neg-demo-app # Label for the Deployment
  name: neg-demo-app # Name of Deployment
spec:
  selector:
    matchLabels:
      run: neg-demo-app
  template: # Pod template
    metadata:
      labels:
        run: neg-demo-app # Labels Pods from this Deployment
    spec: # Pod specification; each Pod created by this Deployment has this specification
      containers:
      - image: registry.k8s.io/serve_hostname:v1.4 # Application to run in Deployment's Pods
        name: hostname # Container name
        ports:
        - containerPort: 9376
          protocol: TCP
  

ハードコードされた遅延を使用する

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: neg-demo-app # Label for the Deployment
  name: neg-demo-app # Name of Deployment
spec:
  minReadySeconds: 60 # Number of seconds to wait after a Pod is created and its status is Ready
  selector:
    matchLabels:
      run: neg-demo-app
  template: # Pod template
    metadata:
      labels:
        run: neg-demo-app # Labels Pods from this Deployment
    spec: # Pod specification; each Pod created by this Deployment has this specification
      containers:
      - image: registry.k8s.io/serve_hostname:v1.4 # Application to run in Deployment's Pods
        name: hostname # Container name
      # Note: The following line is necessary only on clusters running GKE v1.11 and lower.
      # For details, see https://cloud.google.com/kubernetes-engine/docs/how-to/container-native-load-balancing#align_rollouts
        ports:
        - containerPort: 9376
          protocol: TCP
      terminationGracePeriodSeconds: 60 # Number of seconds to wait for connections to terminate before shutting down Pods
  

この Deployment では、各コンテナで HTTP サーバーが実行されます。HTTP サーバーは、アプリケーション サーバーのホスト名(サーバーが実行されている Pod の名前)をレスポンスとして返します。

このマニフェストを neg-demo-app.yaml として保存し、Deployment を作成します。

kubectl apply -f neg-demo-app.yaml

コンテナ ネイティブのロードバランサに Service を作成する

Deployment を作成したら、Pod を Service にグループ化する必要があります。

次のサンプルの Service neg-demo-svc は、前のセクションで作成したサンプルの Deployment をターゲットにしています。

apiVersion: v1
kind: Service
metadata:
  name: neg-demo-svc # Name of Service
spec: # Service's specification
  type: ClusterIP
  selector:
    run: neg-demo-app # Selects Pods labelled run: neg-demo-app
  ports:
  - name: http
    port: 80 # Service's port
    protocol: TCP
    targetPort: 9376

ロードバランサは Service の Ingress を作成するまで作成されません。

このマニフェストを neg-demo-svc.yaml として保存し、Service を作成します。

kubectl apply -f neg-demo-svc.yaml

Service の Ingress を作成する

次の Ingress のサンプル(neg-demo-ing)では、作成した Service をターゲットとしています。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: neg-demo-ing
spec:
  defaultBackend:
    service:
      name: neg-demo-svc # Name of the Service targeted by the Ingress
      port:
        number: 80 # Should match the port used by the Service

このマニフェストを neg-demo-ing.yaml として保存し、Ingress を作成します。

kubectl apply -f neg-demo-ing.yaml

Ingress を作成すると、プロジェクト内にアプリケーション ロードバランサが作成され、クラスタが実行される各ゾーンにネットワーク エンドポイント グループ(NEG)が作成されます。NEG 内のエンドポイントと Service のエンドポイントは同期の状態が維持されます。

Ingress を確認する

ワークロードをデプロイし、Pod を Service にグループ化して Service の Ingress を作成したら、Ingress によってコンテナ ネイティブのロードバランサが正常にプロビジョニングされていることを確認します。

Ingress のステータスを取得します。

kubectl describe ingress neg-demo-ing

出力には、ADD イベントと CREATE イベントが含まれます。

Events:
Type     Reason   Age                From                     Message
----     ------   ----               ----                     -------
Normal   ADD      16m                loadbalancer-controller  default/neg-demo-ing
Normal   Service  4s                 loadbalancer-controller  default backend set to neg-demo-svc:32524
Normal   CREATE   2s                 loadbalancer-controller  ip: 192.0.2.0

ロードバランサをテストする

以降のセクションでは、コンテナ ネイティブのロードバランサの機能をテストする方法について説明します。

Ingress の IP アドレスにアクセスする

アプリケーション ロードバランサが構成されるまで数分待ちます。

Ingress の IP アドレスにアクセスすることで、コンテナ ネイティブのロードバランサが機能していることを確認できます。

Ingress の IP アドレスを取得するには、次のコマンドを実行します。

kubectl get ingress neg-demo-ing

コマンド出力の ADDRESS 列に、Ingress の IP アドレスが表示されます。この IP アドレスに、ウェブブラウザでアクセスします。

バックエンド サービスのヘルス ステータスをチェックする

ロードバランサのバックエンド サービスのヘルス ステータスを取得することもできます。

  1. プロジェクトで実行されているバックエンド サービスのリストを取得します。

    gcloud compute backend-services list
    

    Service の名前を含むバックエンド サービスの名前(neg-demo-svc など)を記録します。

  2. バックエンド サービスの稼働状況を取得します。

    gcloud compute backend-services get-health BACKEND_SERVICE_NAME --global
    

    BACKEND_SERVICE_NAME は、バックエンド サービスの名前に置き換えます。

Ingress をテストする

ロードバランサが期待どおりに機能しているかどうかをテストするもう 1 つの方法は、サンプルの Deployment をスケーリングし、テスト リクエストを Ingress に送信して、正しい数のレプリカが応答するかどうかを確認することです。

  1. neg-demo-app Deployment を 1 つのインスタンスから 2 つのインスタンスにスケーリングします。

    kubectl scale deployment neg-demo-app --replicas 2
    

    このコマンドの完了までに数分かかることがあります。

  2. ロールアウトが完了したことを確認します。

    kubectl get deployment neg-demo-app
    

    出力には、使用可能な 2 つのレプリカが含まれます。

    NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    neg-demo-app   2         2         2            2           26m
    
  3. Ingress の IP アドレスを取得します。

    kubectl describe ingress neg-demo-ing
    

    このコマンドで 404 エラーが返された場合は、ロードバランサが起動するまで数分待ってからもう一度お試しください。

  4. ロードバランサからの個別のレスポンスの数をカウントします。

    for i in `seq 1 100`; do \
      curl --connect-timeout 1 -s IP_ADDRESS && echo; \
    done  | sort | uniq -c
    

    IP_ADDRESS は、Ingress の IP アドレスに置き換えます。

    出力は次のようになります。

    44 neg-demo-app-7f7dfd7bc6-dcn95
    56 neg-demo-app-7f7dfd7bc6-jrmzf
    

    この出力では、個別のレスポンスの数はレプリカの数と同じです。これは、すべてのバックエンド Pod がトラフィックを処理していることを示しています。

クリーンアップ

このページのタスクを完了したら、アカウントで不要な請求が発生しないように、以下の手順でリソースを削除します。

クラスタの削除

gcloud

gcloud container clusters delete neg-demo-cluster

コンソール

  1. Google Cloud コンソールで [Google Kubernetes Engine] ページに移動します。

    Google Kubernetes Engine に移動

  2. neg-demo-cluster を選択し、 [削除] をクリックします。

  3. 確認のメッセージが表示されたら、[削除] をクリックします。

次のステップ