Citrix ADC ingress controller

Citrix ingress controller を使用して gRPC サポートを有効にする

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

gRPC サポートを有効にする

HTTP2 を使用して GRPC サポートを有効にするには、次の手順を実行します。

  1. ConfigMap の次のエントリを使用して、YAML ファイルcic-configmap.yamlを作成し、HTTP2 サーバー側サポートのグローバルパラメーターを有効にします。ConfigMap の使用について詳しくは、 ConfigMap のドキュメントを参照してください

       NS_HTTP2_SERVER_SIDE: 'ON'
    
  2. 次のコマンドを使用して ConfigMap を適用します。

       kubectl apply -f cic-configmap.yaml
    
  3. ConfigMapをサポートするようにCitrix ingress controller を展開するためのcic.yamlファイルを編集します。

            args:
              - --ingress-classes
                citrix
              - --configmap
                default/cic-configmap
    
  4. 編集した YAML ファイルを適用して、Citrix ingress controller をスタンドアロン Pod としてデプロイします。

    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 を有効にします。Citrix 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"
          kubernetes.io/ingress.class: citrix
        name: frontend-ingress
      spec:
        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"
          kubernetes.io/ingress.class: citrix
        name: grpc-ingress
      spec:
        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. gRPC トラフィックをテストするには、grpcurlコマンドを使用します。

    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 の検証

書き換えとレスポンダー CRD を検証するには、次の手順を実行します。

  1. リライトレスポンダーポリシー deployment.yaml ファイルを使用して、リライトとレスポンダー 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
    
Citrix ingress controller を使用して gRPC サポートを有効にする