サービスが分散アーキテクチャを使用している場合は、Googleリモートプロシージャコール (gRPC) プロトコルを使用して、クライアントとサーバー間の通信効率を向上させることができます。 NGINX IngressコントローラーのバックエンドにgRPCプロトコルを使用するサービスをデプロイする場合は、それに応じてIngressリソースを構成する必要があります。
背景情報
gRPCは、HTTP/2プロトコルとプロトコルバッファ (ProtoBuf) シリアル化プロトコルに基づいて開発されています。 Googleが提供するオープンソースのリモートプロシージャコール (RPC) フレームワークであり、さまざまなプログラミング言語で開発されたプラットフォームで動作します。 gRPCは、その効率性、柔軟性、および複数のプログラミング言語のサポートにより、サービス間呼び出し、モノのインターネット (IoT) デバイス間の通信、複雑なデータ構造のリモートAPIサービスなど、マイクロサービスが展開される分散システムおよび環境に適しています。
gRPCサービスの例
前提条件
NGINX Ingressコントローラがインストールされ、そのバージョンは0.22.0以降です。 詳細については、「NGINX Ingressコントローラーの管理」をご参照ください。
kubectlクライアントがACKクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
gRPCurlがインストールされています。 詳細については、「gRPCurl」をご参照ください。
信頼できる証明書が取得されます。 次のいずれかの方法で証明書を取得できます。
証明書管理サービスコンソールで証明書を購入します。 詳細については、「SSL証明書の購入」をご参照ください。
別の認証局 (CA) によって発行された証明書を購入します。
(オプション) (オプション) 自己署名証明書の生成の手順に従って、自己署名証明書を生成します。
手順1: SSL証明書をクラスターにシークレットとして保存する
NGINX Ingressコントローラーでは、gRPCサービスはHTTPSポートでのみ実行されます。 gRPCサービスのデフォルトポートはポート443です。 したがって、SSL証明書をクラスターのシークレットとして設定する必要があります。
次のコマンドを実行して、grpc-secret
を介してクラスターに証明書を追加します。
kubectl create secret tls grpc-secret -- key grpc.key -- cert grpc.crt# grpc.keyを証明書ファイルに置き換え、grpc.crtを秘密鍵ファイルに置き換えます
ステップ2: gRPCサービスの作成
grpc.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: apps/v1 kind: 配置 メタデータ: 名前: grpc-service spec: replicas: 1 セレクタ: matchLabels: run: grpc-service template: metadata: labels: run: grpc-service 仕様: containers: -画像: registry.cn-hangzhou.aliyuncs.com/acs-sample/grpc-server:latest imagePullPolicy: Always 名前: grpc-service ポート: -containerPort: 50051 protocol: TCP restartPolicy: 常に --- apiVersion: v1 種類: サービス メタデータ: 名前: grpc-service spec: ポート: -ポート: 50051 protocol: TCP targetPort: 50051 セレクタ: run: grpc-service sessionAffinity: None タイプ: NodePort
次のコマンドを実行して、gRPCサービスを作成します。
kubectl apply -f grpc.yaml
期待される出力:
deployment.apps/grpc-serviceが作成されました service/grpc-サービスが作成されました
ステップ3: Ingressを作成する
grpc-ingress.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: 名前: grpc-ingress アノテーション: # バックエンドサービスがgRPCサービスであることを指定する必要があります nginx.ingress.kubernetes.io/backend-protocol: "GRPC" spec: # Secretを通じて保存されたSSL証明書の指定 tls: -ホスト: - grpc.example.com secretName: grpc-secret rules: -host:# gRPCサービスドメイン名をgrpc.example.comし、ドメイン名に置き換えます http: paths: - path: / pathType: プレフィックス backend: service: # gRPCサービス 名前: grpc-service port: 番号: 50051
重要NGINXのgrpc_pass制限により、gRPCサービスのservice-weightを設定することはできません。
次のコマンドを実行してIngressを作成します。
kubectl apply -f grpc-ingress.yaml
期待される出力:
ingress.net working.k8s.io/grpc-ingressが作成されました
ステップ4: 結果を確認する
次のコマンドを実行して、Ingress情報を表示します。
kubectl get ingress
期待される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE grpc-ingress ngin x grpc.example.com 139.196。***** 80、443 3m5 1s
IPアドレスを
address
列に記録します。grpcurlを使用してサービスに接続します。
grpcurl -insecure -authorit y grpc.example.com <IP_ADDRESS>:443リスト# <IP_ADDRESS> を前の手順で記録したIPアドレスに置き換えます
出力は、IngressがバックエンドgRPCサービスにリクエストを配信することを示します。
grpc.reflection.v1alpha.ServerReflection helloworld. グリーター
関連ドキュメント
NGINX Ingressコントローラーを使用してgRPCサービスのカナリアリリースを実行する方法の詳細については、「NGINX Ingressコントローラーを使用してカナリアリリースと青緑色展開を実装する」を参照してください。
NGINX Ingressコントローラーは、OpenTelemetry用のマネージドサービスと統合されています。 詳細については、「NGINX Ingressコントローラーのトレースの有効化」をご参照ください。