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 は次の処理を実行します。
TLS を終端し、トラフィックを復号します。
復号された gRPC トラフィック (HTTP/2 経由) をポート 50051 のバックエンド Pod に転送します。
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 # ご利用のドメインに置き換えてください
# ...ステップ 2: TLS 証明書を Secret として保存
gRPC は HTTP/2 上で実行され、Ingress には TLS が必要です。Ingress コントローラーが使用できるように、証明書と秘密鍵を Kubernetes Secret に保存します。
ご利用のドメインの TLS 証明書を取得します。
本番環境: 信頼できる証明書認証局 (CA) から証明書を購入します。Alibaba Cloud を通じて購入した場合は、証明書ファイルをダウンロードします。
テスト環境: 自己署名証明書を生成します。
証明書と秘密鍵を保存するために、
nginx-ingress-tlsという名前の Secret を作成します。コンソール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
シークレット ページで、
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 の設定
ACK コンソールにログインし、クラスター名をクリックします。左側のナビゲーションウィンドウで、Add-ons を選択します。
NGINX Ingress Controller を検索し、アドオンカードの インストール または [アップグレード] をクリックします。
バックエンドサービスに gRPC トラフィックをルーティングするように Ingress を設定します。
コンソール
左側のナビゲーションウィンドウで、 を選択します。
default名前空間を選択し、Ingress の作成 をクリックします。次の設定で Ingress を設定し、OK をクリックします。
ゲートウェイのタイプ Nginx Ingress名前 grpc-ingressドメイン名 grpc.example.com[マッピング] で、以下を設定します。
マッピング /一致ルール プレフィックス (プレフィックスベースの一致)サービス名 grpc-serviceポート 50051[TLS 設定] で、オプションを有効にし、以下を設定します。
ドメイン名 grpc.example.comシークレット nginx-ingress-tls[アノテーション] の下に、次を追加します。
nginx.ingress.kubernetes.io/backend-protocolGRPCIngress ページで、新しい Ingress を見つけ、その エンドポイント をメモします。
NGINX Ingress が有効になるまで約 10 秒かかります。エンドポイントがまだ表示されない場合は、しばらく待ってから更新をクリックしてください。それでも表示されない場合は、Ingress 名をクリックし、イベント タブを確認して問題のトラブルシューティングを行ってください。
kubectl
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: 50051Ingress を適用します。
kubectl apply -f grpc-ingress.yamlエンドポイント アドレスを取得します。アドレスが返されない場合は、10 秒待機してリトライします:
ADDRESS=$(kubectl get ingress grpc-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo $ADDRESS
ステップ 4: 設定の確認
ローカルの
hostsファイルにエントリを追加して、サンプルドメインを Ingress の IP アドレスに解決します。次の行を追加し、<ADDRESS>を実際の IP に置き換えます。macOS/Linux:
sudo vi /etc/hostsを使用して/etc/hostsを編集しますWindows: メモ帳を管理者として実行し、
C:\Windows\System32\drivers\etc\hostsを開きます
<ADDRESS> grpc.example.comgrpcurl をインストールし、
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 証明書を意味するために使用されます。