NetScaler Ingress Controller を使用して gRPC サポートを有効にする

最終公開日 : Oct 02, 2026
gRPC は、Google が開発した高性能なオープンソースのユニバーサルRPCフレームワークです。gRPCでは、クライアントアプリケーションは、ローカルメソッドを呼び出すのと同じ方法で、別のサーバーからサーバーアプリケーション上のメソッドを直接呼び出すことができます。 GRPCを使用すると、分散アプリケーションやサービスを簡単に作成できます。

gRPC サポートを有効にする

HTTP2 を使用して GRPC サポートを有効にするには、次の手順を実行します。
  1. YAML ファイル cic-configmap.yaml を作成し、ConfigMap の次のエントリを使用して HTTP2 サーバー側サポートのグローバルパラメータを有効にします。ConfigMap の使用方法の詳細については、ConfigMap ドキュメント を参照してください。
    NS_HTTP2_SERVER_SIDE: 'ON'
  2. 次のコマンドを使用して ConfigMap を適用します。
    kubectl apply -f cic-configmap.yaml
  3. ConfigMap をサポートするように NetScaler Ingress Controller を展開するための cic.yaml ファイルを編集します。
    args:
      - --ingress-classes
        citrix®
      - --configmap
        default/cic-configmap
  4. 編集した YAML ファイルを適用して、NetScaler Ingress Controller をスタンドアロンポッドとして展開します。
    kubectl apply -f cic.yaml
  5. gRPC トラフィックをテストするには、grpcurl をインストールする必要がある場合があります。Linux マシンに grpcurl をインストールするには、次の手順を実行します。
    go get github.com/fullstorydev/grpcurl
    go install github.com/fullstorydev/grpcurl/cmd/grpcurl
  6. gRPC テストサービス YAML ファイル (grpc-service.yaml) を適用します。
    kubectl apply -f grpc-service.yaml
    grpc-service.yaml ファイルのサンプルコンテンツは次のとおりです。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: grpc-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: grpc-service
      template:
        metadata:
          labels:
            app: 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:
        app: grpc-service
      sessionAffinity: None
      type: NodePort
  7. gRPC Ingress 構成の証明書を作成します。
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=grpc.example.com/O=grpc.example.com"

    kubectl create secret tls grpc-secret --key tls.key --cert tls.crt

    secret "grpc-secret" created
  8. Ingress アノテーションを使用して HTTP2 を有効にします。NetScaler Ingress Controller を使用して HTTP2 を有効にする手順については、HTTP/2 サポート を参照してください。
    • フロントエンド Ingress 構成用の YAML ファイルを作成し、それを適用してコンテンツスイッチング仮想サーバーで HTTP/2 を有効にします。
      kubectl apply -f frontend-ingress.yaml を実行します。
    frontend-ingress.yamlファイルの内容は以下のとおりです。
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        ingress.citrix.com/frontend-httpprofile: '{"http2":"enabled", "http2direct" : "enabled"}'
        ingress.citrix.com/frontend-ip: 192.0.2.1
        ingress.citrix.com/secure-port: "443"
      name: frontend-ingress
    spec:
      ingressClassName: citrix
      rules:
      - {}
      tls:
      - {}
    • 以下の内容でバックエンドIngress構成用のYAMLファイルを作成し、バックエンド(サービスグループ)でHTTP2を有効にするために適用します。
      kubectl apply -f backend-ingress.yaml を実行します。
    backend-ingress.yamlファイルの内容は以下のとおりです。
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        ingress.citrix.com/backend-httpprofile: '{"grpc-service":{"http2": "enabled", "http2direct" : "enabled"}}'
        ingress.citrix.com/frontend-ip: 192.0.2.2
        ingress.citrix.com/secure-port: "443"
      name: grpc-ingress
    spec:
      ingressClassName: citrix
      rules:
      - host: grpc.example.com
        http:
          paths:
          - backend:
              service:
                name: grpc-service
                port:
                  number: 50051
            path: /
            pathType: Prefix
      tls:
      - hosts:
        - grpc.example.com
        secretName: grpc-secret
  9. grpcurlコマンドを使用してgRPCトラフィックをテストします。
    grpcurl -v -insecure -d '{"name": "gRPC"}' grpc.example.com:443 helloworld.Greeter.SayHello
    コマンドの出力は以下のとおりです。
    Resolved method descriptor:
    rpc SayHello ( .helloworld.HelloRequest ) returns ( .helloworld.HelloReply );


    Request metadata to send:
    (empty)


    Response headers received:
    content-type: application/grpc


    Response contents:
    {
        "message": "Hello gRPC"
    }


    Response trailers received:
    (empty)
    Sent 1 request and received 1 response

レート制限CRDを検証する

レート制限CRDを検証するには、以下の手順を実行します。
  1. ratelimit-crd.yamlファイルを使用してレート制限CRDを適用します。
    kubectl create -f ratelimit-crd.yaml を実行します。
  2. レート制限ポリシーのために、以下の内容でYAMLファイル (ratelimit-crd-object.yaml) を作成します。
    apiVersion: citrix.com/v1beta1
    kind: ratelimit
    metadata:
      name: throttle-req-per-clientip
    spec:
      servicenames:
        - grpc-service
      selector_keys:
      basic:
        path:
        - "/"
        per_client_ip: true
      req_threshold: 5
      timeslice: 60000
      throttle_action: "RESPOND"
  3. 以下のコマンドを使用してYAMLファイルを適用します。
    kubectl create -f ratelimit-crd-object.yaml
  4. grpcurlコマンドを使用してgRPCトラフィックをテストします。
    grpcurl -v -insecure -d '{"name": "gRPC"}' grpc.example.com:443 helloworld.Greeter.SayHello
    レート制限に達した後、コマンドは応答として以下のエラーを返します。
    Error invoking method "helloworld.Greeter.SayHello": failed to query for service descriptor "helloworld.Greeter": rpc error: code = Unavailable desc =

    Too Many Requests: HTTP status code 429; transport: missing content-type field

gRPCでリライトおよびレスポンダーCRDを検証する

RewriteおよびResponder CRDを検証するには、次の手順を実行します。
  1. rewrite-responder-policies-deployment.yamlファイルを使用して、RewriteおよびResponder CRDを適用します。
    kubectl create -f rewrite-responder-policies-deployment.yaml
  2. リライトポリシーのYAMLファイル (rewrite-crd-object.yaml) を次の内容で作成します。
    apiVersion: citrix.com/v1
    kind: rewritepolicy
    metadata:
      name: addcustomheaders
    spec:
      rewrite-policies:
        - servicenames:
            - grpc-service
          rewrite-policy:
            operation: insert_http_header
            target: 'sessionID'
            modify-expression: '"48592th42gl24456284536tgt2"'
            comment: 'insert SessionID in header'
            direction: RESPONSE
            rewrite-criteria: 'http.res.is_valid'
  3. 次のコマンドを使用してYAMLファイルを適用します。
    kubectl create -f rewrite-crd-object.yaml
  4. grpcurlコマンドを使用してgRPCトラフィックをテストします。
    grpcurl -v -insecure -d '{"name": "gRPC"}' grpc.example.com:443 helloworld.Greeter.SayHello
    このコマンドは、gRPCリクエスト応答にセッションIDを追加します。
    Resolved method descriptor:
    rpc SayHello ( .helloworld.HelloRequest ) returns ( .helloworld.HelloReply );

    Request metadata to send:
    (empty)

    Response headers received:
    content-type: application/grpc
    sessionid: 48592th42gl24456284536tgt2

    Response contents:
    {
      "message": "Hello gRPC"
    }

    Response trailers received:
    (empty)
    Sent 1 request and received 1 response