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 は次の処理を実行します。
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 としての保存
Nginx Ingress では、gRPC が依存する HTTP/2 を有効にするために TLS が必要です。Ingress コントローラーが使用できるように、TLS 証明書と秘密鍵を 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:Service を公開するための Ingress の設定
ACK コンソールにログインし、クラスター名をクリックします。 左側のメニューで、Add-ons を選択します。
NGINX Ingress Controller を検索し、インストール または [アップグレード] をクリックします。
注: v1.2 より前のバージョンはメンテナンスされなくなりました。 最新バージョンにアップグレードしてください。
gRPC トラフィックをバックエンドサービスにルーティングするように Ingress を設定します。
コンソール
左側のメニューで、 を選択します。
default名前空間を選択し、Ingress の作成 をクリックします。次のように 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-protocolGRPCIngress ページで、新しい Ingress の エンドポイント をメモします。
Ingress がアクティブになるまで約 10 秒かかります。 更新してもエンドポイントが表示されない場合は、イベント タブを確認し、問題のトラブルシューティングを行ってください。
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:設定の確認
Ingress の IP を
hostsファイルに追加します。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 の 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 証明書を指します。