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

Container Service for Kubernetes:NGINX Ingress の gRPC Service の設定

最終更新日:Nov 07, 2025

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

コア設定

次の例は、NGINX Ingress を使用して gRPC Service を安全に公開するためのコア設定を示しています。

  • gRPC プロトコルプロキシ: backend-protocol: "GRPC" アノテーションは、Ingress コントローラーに対し、デフォルトの HTTP プロトコルではなく、HTTP/2 に基づく gRPC プロトコルを使用してトラフィックをプロキシするように指示します。

  • TLS 暗号化: サンプルドメイン grpc.example.com に対して Transport Layer Security (TLS) が有効になっています。トラフィックは Secret に保存されている証明書を使用して暗号化されます。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: grpc-ingress
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC" # キー設定: バックエンドサービスが gRPC であることを指定します
spec:
  tls:
  - hosts:
    - grpc.example.com                                   # ご自身の gRPC Service ドメインに置き換えてください
    secretName: nginx-ingress-tls                        # TLS 証明書を含む Secret。
  rules:
  - host: grpc.example.com                               # ご自身の gRPC Service ドメインに置き換えてください
  #...

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

  1. クラスターの kubeconfig を取得し、kubectl を使用してクラスターに接続します

  2. grpc.yaml という名前のファイルを作成し、次の内容で gRPC サンプルサービスを定義します。

    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

    この Service は、次の .proto ファイルで定義されます。Service 名は Greeter で、SayHello メソッドを提供します。

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

    option java_multiple_files = true;
    option java_package = "io.grpc.examples.helloworld";
    option java_outer_classname = "HelloWorldProto";
    
    package helloworld;
    
    // 挨拶サービスの定義
    service Greeter {
      // 挨拶を送信します
      rpc SayHello (HelloRequest) returns (HelloReply) {}
    }
    
    // ユーザー名を含むリクエストメッセージ
    message HelloRequest {
      string name = 1;
    }
    
    // 挨拶を含む応答メッセージ
    message HelloReply {
      string message = 1;
    }

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

  3. gRPC アプリケーションをデプロイします。

    kubectl apply -f grpc.yaml

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

gRPC が依存する HTTP/2 を有効にするには、まず Ingress の TLS 暗号化を有効にする必要があります。安全な管理のために、SSL 証明書と秘密鍵を Secret に保存します。次に、この Secret を参照して TLS 暗号化を設定します。

  1. SSL 証明書を取得します。

  2. (オプション) Alibaba Cloud から証明書を購入した場合は、SSL 証明書ファイルをダウンロードします。

  3. 証明書と秘密鍵を保存するための Kubernetes Secret を作成します。

    コンソール

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

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

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

      • キー: nginx-ingress-tls

      • タイプ: TLS 証明書

      • [+ 追加] をクリックします

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

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

    kubectl

    ご自身の証明書ファイル (.crt または .pem) と秘密鍵ファイル (.key) のパスで <PUBLIC_CERT><PRIVATE_KEY> を置き換えます。次に、コマンドを実行して証明書と秘密鍵を Secret として保存します。

    # --key パラメーターは秘密鍵ファイルを指定し、--cert パラメーターは証明書ファイルを指定します。
    kubectl create secret tls nginx-ingress-tls --cert <PUBLIC_CERT> --key <PRIVATE_KEY>

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

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

  2. 検索ボックスに Nginx Ingress Controller と入力します。アドオンカードで、[インストール] または [アップグレード] をクリックします。

  3. Ingress を設定します。annotations を使用して、バックエンドプロトコルが gRPC であることを指定し、作成した Secret を参照します。

    コンソール

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

    2. 次のパラメーターで Ingress を設定し、[OK] をクリックします。

      • ゲートウェイタイプ: Nginx Ingress を選択します。

      • 名前: grpc-ingress

      • ドメイン名: grpc.example.com

      • マッピング

        • パス: /

        • マッチングルール: プレフィックス (プレフィックスベースのマッチ)

        • Service: grpc-service

        • ポート: 50051

      • TLS 設定: このオプションを有効にします。

        • ドメイン名: grpc.example.com

        • Secret: nginx-ingress-tls

      • アノテーション

        • 名前: nginx.ingress.kubernetes.io/backend-protocol

        • : GRPC

    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 であることを指定します
          nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
      spec:
        ingressClassName: nginx
        # Secret を参照して TLS を設定します
        tls:
        - hosts:
          - grpc.example.com             # gRPC Service ドメインに置き換えます
          secretName: nginx-ingress-tls  # 前のステップで作成した Secret に指定した名前
        rules:
        - host: grpc.example.com         # gRPC Service ドメインに置き換えます
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: grpc-service
                  port:
                    number: 50051
    2. Ingress リソースをデプロイします。

      kubectl apply -f grpc-ingress.yaml
    3. Ingress コントローラーの外部 IP アドレスを取得します。IP が割り当てられるまで少し時間がかかる場合があります。アドレスが返されない場合は、10 秒待ってから再試行してください。

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

ステップ 4: gRPC Service へのアクセス

  1. テスト目的で、ローカルの hosts ファイルにエントリを追加して、ドメインを Ingress IP アドレスにマッピングします。

    • macOS/Linux: sudo vi /etc/hosts

    • Windows: メモ帳を管理者として開き、C:\Windows\System32\drivers\etc\hosts にあるファイルを開きます。

    <ADDRESS> を実際の [エンドポイント] に置き換えます。次のドメイン名マッピングをファイルの末尾に追加して保存します。

    <ADDRESS> grpc.example.com
  2. grpcurl をインストールします。次に、gRPC Service インターフェイスを呼び出します。

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

制限事項

gRPC の長時間接続という特性により、NGINX Ingress は現在、gRPC バックエンドに対する Service の重み (service-weight) に基づくルーティングをサポートしていません。

よくある質問

テスト用に自己署名証明書を生成するにはどうすればよいですか?

次のコマンドを実行して、有効期間 365 日のドメイン名 grpc.example.com の自己署名証明書 (grpc.crt) と秘密鍵 (grpc.key) を生成します:

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"
重要

自己署名証明書は、デフォルトではブラウザや他のクライアントから信頼されておらず、セキュリティ警告が表示されます。本番環境では自己署名証明書を使用しないでください。

SSL 証明書と TLS 証明書の違いは何ですか?

Secure Sockets Layer (SSL) は古い暗号化プロトコルであり、より安全な Transport Layer Security (TLS) プロトコルに置き換えられました。

現代の用語では、「SSL 証明書」は、技術的には「TLS 証明書」を指す俗称としてよく使われます。

関連ドキュメント