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

Container Service for Kubernetes:NGINX IngressコントローラーのバックエンドにgRPCサービスをデプロイする

最終更新日:Dec 10, 2024

サービスが分散アーキテクチャを使用している場合は、Googleリモートプロシージャコール (gRPC) プロトコルを使用して、クライアントとサーバー間の通信効率を向上させることができます。 NGINX IngressコントローラーのバックエンドにgRPCプロトコルを使用するサービスをデプロイする場合は、それに応じてIngressリソースを構成する必要があります。

背景情報

gRPCは、HTTP/2プロトコルとプロトコルバッファ (ProtoBuf) シリアル化プロトコルに基づいて開発されています。 Googleが提供するオープンソースのリモートプロシージャコール (RPC) フレームワークであり、さまざまなプログラミング言語で開発されたプラットフォームで動作します。 gRPCは、その効率性、柔軟性、および複数のプログラミング言語のサポートにより、サービス間呼び出し、モノのインターネット (IoT) デバイス間の通信、複雑なデータ構造のリモートAPIサービスなど、マイクロサービスが展開される分散システムおよび環境に適しています。

gRPCサービスの例

次のコードを使用して、gRPCサービスを定義します。 クライアントはhelloworld.GreeterサービスのSAYHelloインターフェイスを呼び出すことができます。

オプションjava_multiple_files = true;
オプションjava_package = "io.grpc.examples.helloworld";
オプションjava_outer_classname = "HelloWorldProto";

パッケージhelloworld;

// 挨拶サービスの定義。
service Greeter {
  // 挨拶を送る
  rpc SayHello (HelloRequest) は (HelloReply) {} を返します
}

// ユーザーの名前を含むリクエストメッセージ。
メッセージHelloRequest {
  文字列名=1;
}

// 挨拶を含む応答メッセージ
メッセージHelloReply {
  文字列メッセージ=1;
} 

gRPCサービスのソースコードの詳細については、「grpc-go」をご参照ください。

前提条件

手順1: SSL証明書をクラスターにシークレットとして保存する

NGINX Ingressコントローラーでは、gRPCサービスはHTTPSポートでのみ実行されます。 gRPCサービスのデフォルトポートはポート443です。 したがって、SSL証明書をクラスターのシークレットとして設定する必要があります。

(オプション) 自己署名証明書の生成

証明書がない場合は、次の手順を実行して自己署名証明書を生成できます。 この例では、grpc.example.comは証明書のドメイン名として使用されます。

重要

信頼できるCA認証がないため、ブラウザとクライアントではデフォルトで自己署名証明書が信頼されず、顧客がサービスにアクセスするとセキュリティ警告が表示されます。 このトピックで生成された自己署名証明書は参考用であり、本番環境では使用しないでください。

  1. 次のコンテンツを作成し、/tmp/openssl.cn fファイルにコピーします。

    [ req]
    # default_bits = 2048
    # default_md = sha256
    # default_keyfile = privkey.pem
    distinguidied_name=req_distinguidied_name
    attributes = req_attributes
    req_extensions = v3_req
    
    [req_distingusingied_name]
    countryName=国名 (2文字コード)
    countryName_min = 2
    countryName_max = 2
    stateOrProvinceName=州または州名 (フルネーム)
    localityName=ローカル名 (例: 都市)
    0.organizationName=組織名 (例: 会社)
    organizationalUnitName=組織ユニット名 (例、セクション)
    commonName = Common Name (完全修飾ホスト名など)
    commonName_max = 64
    emailAddress=メールアドレス
    emailAddress_max = 64
    
    [req_attributes]
    challengePassword=チャレンジパスワード
    challengePassword_min = 4
    challengePassword_max = 20
    
    [v3_req]
    # 証明書リクエストに追加する拡張機能
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName = @ alt_names
    
    [alt_names]
    DNS.1 = grpc.example.com 
  2. 次のコマンドを実行して、証明書署名リクエストを生成します。

    openssl req -new -nodes -keyout grpc.key -out grpc.csr -config /tmp/openssl.cn f -subj "/C=CN/ST=浙江 /L=杭州 /O=アカバクラウド /OU=ContainerService/C N=grpc.example.com"
  3. 次のコマンドを実行して証明書に署名します。

    openssl x509 -req -days 3650 -in grpc.csr -signkey grpc.key -out grpc.crt-拡張子v3_req -extfile /tmp/openssl.cn f

    コマンド実行後, 証明書ファイルgrpc.crtと秘密鍵ファイルgrpc.keyが生成されます。

次のコマンドを実行して、grpc-secretを介してクラスターに証明書を追加します。

kubectl create secret tls grpc-secret -- key grpc.key -- cert grpc.crt# grpc.keyを証明書ファイルに置き換え、grpc.crtを秘密鍵ファイルに置き換えます

ステップ2: gRPCサービスの作成

  1. 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 
  2. 次のコマンドを実行して、gRPCサービスを作成します。

    kubectl apply -f grpc.yaml

    期待される出力:

    deployment.apps/grpc-serviceが作成されました
    service/grpc-サービスが作成されました 

ステップ3: Ingressを作成する

  1. 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を設定することはできません。

  2. 次のコマンドを実行してIngressを作成します。

    kubectl apply -f grpc-ingress.yaml

    期待される出力:

    ingress.net working.k8s.io/grpc-ingressが作成されました

ステップ4: 結果を確認する

  1. 次のコマンドを実行して、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列に記録します。

  2. grpcurlを使用してサービスに接続します。

    grpcurl -insecure -authorit y grpc.example.com <IP_ADDRESS>:443リスト# <IP_ADDRESS> を前の手順で記録したIPアドレスに置き換えます

    出力は、IngressがバックエンドgRPCサービスにリクエストを配信することを示します。

    grpc.reflection.v1alpha.ServerReflection
    helloworld. グリーター 

関連ドキュメント