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

Container Service for Kubernetes:gRPC 用の Nginx Ingress の設定

最終更新日:Jun 16, 2026

Container Service for Kubernetes (ACK) クラスターにデプロイされた gRPC アプリケーションでは、Nginx Ingress を設定し、nginx.ingress.kubernetes.io/backend-protocol: "GRPC" アノテーションを追加して gRPC トラフィックをルーティングし、外部クライアントからのアクセスを有効にします。

前提条件

以下を確認してください。

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

  • kubectl がクラスターに接続済みであること。

  • gRPC トラフィック用のドメイン名 (例: grpc.example.com)

  • そのドメイン用の TLS 証明書 (CA 署名済み、またはテスト用の自己署名証明書)

仕組み

クライアントが gRPC リクエストを Ingress エンドポイントに送信すると、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      # お使いのドメインに置き換えます
  # ...

ステップ1: サンプル gRPC アプリケーションのデプロイ

コンソール

  1. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ワークロード] > [デプロイ] を選択します。

  2. 展開 ページで、YAML のリソースの作成 をクリックします。 次の 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 が Running 状態であることを確認します。

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

このサンプルアプリケーションは、単一の単項 RPC である SayHello を提供する Greeter サービスを公開します。

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

package helloworld;

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

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

gRPC サービスの例をご参照ください。

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

Nginx Ingress では、gRPC が依存する HTTP/2 を有効にするために TLS が必要です。Ingress コントローラーが使用できるように、TLS 証明書と秘密鍵を 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_CERTPRIVATE_KEY を、お使いの証明書とキーファイルのパスに置き換えます。

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

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

  1. ACK コンソールにログインし、クラスター名をクリックします。 左側のメニューで、Add-ons を選択します。

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

    注: v1.2 より前のバージョンはメンテナンスされなくなりました。 最新バージョンにアップグレードしてください。
  3. gRPC トラフィックをバックエンドサービスにルーティングするように Ingress を設定します。

    コンソール

    1. 左側のメニューで、ネットワーク > Ingress を選択します。 default 名前空間を選択し、Ingress の作成 をクリックします。

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

      [ゲートウェイのタイプ]

      Nginx Ingress

      [名前]

      grpc-ingress

      [ドメイン名]

      grpc.example.com

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

      [マッピング]

      /

      [一致ルール]

      Prefix (プレフィックス一致)

      [サービス名]

      grpc-service

      [ポート]

      50051

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

      [ドメイン名]

      grpc.example.com

      [シークレット]

      nginx-ingress-tls

      [アノテーション] で、以下を追加します。

      nginx.ingress.kubernetes.io/backend-protocol

      GRPC

    3. Ingress ページで、新しい Ingress の エンドポイント をメモします。

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

    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. Ingress の IP を hosts ファイルに追加します。 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 の 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 の違いは何ですか?

トランスポート層セキュリティ (TLS) は、非推奨となったセキュアソケットレイヤー (SSL) の後継プロトコルです。 実際には、「SSL 証明書」という言葉は、口語的に TLS 証明書を指します。

次のステップ