すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Nginx Ingress の gRPC サービスの設定

最終更新日:Mar 27, 2026

Container Service for Kubernetes (ACK) クラスター内の gRPC アプリケーションを外部クライアントに公開するには、nginx.ingress.kubernetes.io/backend-protocol: "GRPC" アノテーションを使用して NGINX Ingress を設定します。gRPC は HTTP/2 上で実行されるため、Ingress には TLS が必要です。

前提条件

作業を開始する前に、以下をご確認ください。

  • NGINX Ingress Controller がインストールされた ACK クラスター

  • クラスターに接続するように設定された kubectl。詳細については、「kubectl を使用した ACK クラスターへの接続」をご参照ください。

  • gRPC トラフィック用のドメイン名 (このチュートリアルでは grpc.example.com を使用します)

  • そのドメインの TLS 証明書 (証明書認証局 (CA) から購入、またはテスト用に自己署名)

仕組み

クライアントが Ingress エンドポイントに gRPC リクエストを送信すると、NGINX は次の処理を実行します。

  1. TLS を終端し、トラフィックを復号します。

  2. 復号された gRPC トラフィック (HTTP/2 経由) をポート 50051 のバックエンド Pod に転送します。

  3. gRPC 応答をクライアントに返します。

重要な設定は backend-protocol: "GRPC" アノテーションです。これにより、Ingress コントローラーはバックエンドへのプロキシ時に HTTP の代わりに gRPC を使用するよう指示されます。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: grpc-ingress
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"  # トラフィックを gRPC (HTTP/2) としてプロキシする
spec:
  tls:
  - hosts:
    - grpc.example.com          # ご利用のドメインに置き換えてください
    secretName: nginx-ingress-tls
  rules:
  - host: grpc.example.com      # ご利用のドメインに置き換えてください
  # ...

アプリケーションのサンプル YAML

コンソール

  1. クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、ワークロード > デプロイメント をクリックします。

  2. 展開 ページで YAML のリソースの作成 をクリックし、次の内容をテンプレートエディターにコピーしてから、デプロイ をクリックします。

    サンプルアプリケーションの YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: grpc-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          run: grpc-service
      template:
        metadata:
          labels:
            run: grpc-service
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/grpc-server:latest
            imagePullPolicy: Always
            name: grpc-service
            ports:
            - containerPort: 50051
              protocol: TCP
          restartPolicy: Always
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: grpc-service
    spec:
      ports:
      - port: 50051
        protocol: TCP
        targetPort: 50051
      selector:
        run: grpc-service
      sessionAffinity: None
      type: NodePort
  3. ポップアップウィンドウで、対象のステートレスアプリケーションを見つけ、ビュー をクリックし、Pod が 実行中 状態であることを確認します。

kubectl

  1. 次の内容で grpc.yaml という名前のファイルを作成します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: grpc-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          run: grpc-service
      template:
        metadata:
          labels:
            run: grpc-service
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/grpc-server:latest
            imagePullPolicy: Always
            name: grpc-service
            ports:
            - containerPort: 50051
              protocol: TCP
          restartPolicy: Always
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: grpc-service
    spec:
      ports:
      - port: 50051
        protocol: TCP
        targetPort: 50051
      selector:
        run: grpc-service
      type: NodePort
  2. アプリケーションをデプロイします。

    kubectl apply -f grpc.yaml

サンプルアプリケーションは、次の proto インターフェイスを実装しています。Greeter サービスは、単一のユニタリ RPC メソッド SayHello を公開します。

gRPC サンプルアプリケーションのインターフェイス定義

package helloworld;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

詳細については、「gRPC サービスの例」をご参照ください。

ステップ 2: TLS 証明書を Secret として保存

gRPC は HTTP/2 上で実行され、Ingress には TLS が必要です。Ingress コントローラーが使用できるように、証明書と秘密鍵を Kubernetes Secret に保存します。

  1. ご利用のドメインの TLS 証明書を取得します。

  2. 証明書と秘密鍵を保存するために、nginx-ingress-tls という名前の Secret を作成します。

    コンソール

    1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

    2. クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、設定 > シークレット をクリックします。

    3. シークレット ページで、default 名前空間を選択し、左上隅の 作成する をクリックします。表示されるパネルで新しい Secret を設定し、OK をクリックします。

      名前nginx-ingress-tls
      タイプTLS 証明書

      [+ 追加] で、証明書と秘密鍵を入力します。

      • 証明書: 証明書ファイル (.crt または .pem) の全内容。

      • キー: 秘密鍵ファイル (.key) の全内容。

    kubectl

    <PUBLIC_CERT><PRIVATE_KEY> を、ご利用の証明書ファイルと秘密鍵ファイルへのパスに置き換えます。

    # --cert: 証明書ファイル (.crt または .pem)
    # --key:  秘密鍵ファイル (.key)
    kubectl create secret tls nginx-ingress-tls --cert <PUBLIC_CERT> --key <PRIVATE_KEY>

ステップ 3: サービスを公開するための Ingress の設定

  1. ACK コンソールにログインし、クラスター名をクリックします。左側のナビゲーションウィンドウで、Add-ons を選択します。

  2. NGINX Ingress Controller を検索し、アドオンカードの インストール または [アップグレード] をクリックします。

  3. バックエンドサービスに gRPC トラフィックをルーティングするように Ingress を設定します。

    コンソール

    1. 左側のナビゲーションウィンドウで、ネットワーク > Ingress を選択します。default 名前空間を選択し、Ingress の作成 をクリックします。

    2. 次の設定で Ingress を設定し、OK をクリックします。

      ゲートウェイのタイプNginx Ingress
      名前grpc-ingress
      ドメイン名grpc.example.com

      [マッピング] で、以下を設定します。

      マッピング/
      一致ルールプレフィックス (プレフィックスベースの一致)
      サービス名grpc-service
      ポート50051

      [TLS 設定] で、オプションを有効にし、以下を設定します。

      ドメイン名grpc.example.com
      シークレットnginx-ingress-tls

      [アノテーション] の下に、次を追加します。

      nginx.ingress.kubernetes.io/backend-protocolGRPC
    3. Ingress ページで、新しい Ingress を見つけ、その エンドポイント をメモします。

      NGINX Ingress が有効になるまで約 10 秒かかります。エンドポイントがまだ表示されない場合は、しばらく待ってから更新をクリックしてください。それでも表示されない場合は、Ingress 名をクリックし、イベント タブを確認して問題のトラブルシューティングを行ってください

    kubectl

    1. grpc-ingress.yaml という名前のファイルを作成します。

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: grpc-ingress
        annotations:
          # トラフィックを gRPC (HTTP/2) としてバックエンドにプロキシする
          nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
      spec:
        ingressClassName: nginx
        tls:
        - hosts:
          - grpc.example.com             # ご利用のドメインに置き換えてください
          secretName: nginx-ingress-tls  # 前のステップで作成した Secret
        rules:
        - host: grpc.example.com         # ご利用のドメインに置き換えてください
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: grpc-service
                  port:
                    number: 50051
    2. Ingress を適用します。

      kubectl apply -f grpc-ingress.yaml
    3. エンドポイント アドレスを取得します。アドレスが返されない場合は、10 秒待機してリトライします:

      ADDRESS=$(kubectl get ingress grpc-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
      echo $ADDRESS

ステップ 4: 設定の確認

  1. ローカルの hosts ファイルにエントリを追加して、サンプルドメインを Ingress の IP アドレスに解決します。次の行を追加し、<ADDRESS> を実際の IP に置き換えます。

    • macOS/Linux: sudo vi /etc/hosts を使用して /etc/hosts を編集します

    • Windows: メモ帳を管理者として実行し、C:\Windows\System32\drivers\etc\hosts を開きます

    <ADDRESS> grpc.example.com
  2. grpcurl をインストールし、SayHello メソッドを呼び出します。

    grpcurl -d '{"name": "gRPC"}' grpc.example.com:443 helloworld.Greeter/SayHello

    期待される応答:

    {
      "message": "Hello gRPC"
    }

制限事項

gRPC では重みベースのルーティングはサポートされていません。gRPC は長時間持続する接続のため、NGINX Ingress は gRPC バックエンドに対するサービス重み付けルーティング (service-weight) をサポートしていません。

よくある質問

テスト用に自己署名証明書を生成する方法

openssl を使用して、365 日間有効な自己署名証明書と秘密鍵を生成します。

openssl req -x509 -newkey rsa:2048 -keyout grpc.key -out grpc.crt -days 365 -nodes \
  -subj "/CN=grpc.example.com" \
  -addext "subjectAltName=DNS:grpc.example.com"
重要

自己署名証明書は、デフォルトではブラウザや gRPC クライアントから信頼されません。本番環境では自己署名証明書を使用しないでください。

SSL と TLS の違い

Transport Layer Security (TLS) は、古く非推奨となった Secure Sockets Layer (SSL) プロトコルの後継となる最新のプロトコルです。実際には、「SSL 証明書」という言葉は、口語的に TLS 証明書を意味するために使用されます。

次のステップ