NetScaler® CPX Kubernetes Gateway Controllerのデプロイ

最終公開日 : Oct 02, 2026
デプロイプロセスには、トラフィックルーティングルールを定義するGateway CRDを監視および管理するGateway Controllerのデプロイが含まれます。その後、Gateway ControllerはNetScaler CPXを構成して、外部リクエストをサンプルアプリケーションに転送します。
NetScaler CPXとKubernetes Gateway Controllerをデプロイ
  1. 開始するには、サンプルアプリケーションをデプロイします。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cnn-website
      labels:
        name: cnn-website
        app: cnn-website
    spec:
      selector:
        matchLabels:
          app: cnn-website
      replicas: 2
      template:
        metadata:
          labels:
            name: cnn-website
            app: cnn-website
        spec:
          containers:
          - name: cnn-website
            image: quay.io/sample-apps/cnn-website:v1.0.0
            ports:
            - name: http-80
              containerPort: 80
            - name: https-443
              containerPort: 443
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: cnn-website
      labels:
        app: cnn-website
    spec:
      type: NodePort
      ports:
      - name: http-80
        port: 80
        targetPort: 80
      - name: https-443
        port: 443
        targetPort: 443
      selector:
        name: cnn-website
  2. Gateway API CRDがまだインストールされていない場合は、公式標準チャネルからインストールします。
  3. ユースケースに基づいてvalues.yamlを生成します。NetScaler Kubernetes Gateway Controllerのインストール中に構成できる必須およびオプションのパラメータについては、構成を参照してください。
    gatewayController:
        entityPrefix: gwy
        gatewayControllerName: "citrix.com/nscpxgw-controller"
    license:
        accept: yes
    service:
        annotations: {}
        spec:
            type: NodePort
            ports:
            - port: 80
              targetPort: 80
              protocol: TCP
              name: http
            - port: 443
              targetPort: 443
              protocol: TCP
              name: https
            - port: 6379
              targetPort: 6379
              protocol: TCP
              name: tcp6379
            - port: 5353
              targetPort: 5353
              protocol: UDP
              name: udp5353
    注:
    entityPrefixとgatewayControllerNameは必須であり、NetScaler CPXとKubernetes Gateway Controllerのすべてのデプロイメントで一意である必要があります。
  4. Helmチャートと、前の手順で生成されたvalues.yamlを使用して、NetScaler CPXとKubernetes Gateway Controllerをデプロイします。詳細については、Helmチャートを使用したNetScaler CPXとKubernetes Gateway Controllerのデプロイを参照してください。
    helm repo add netscaler https://netscaler.github.io/netscaler-helm-charts/

    helm install cpx-gateway-controller netscaler/netscaler-cpx-with-gateway-controller  -f values.yaml

GatewayおよびHTTPRoute CRDのサンプル

以下は、GatewayClass、Gateway、およびHTTPRoute定義の例です。
  1. Gatewayオブジェクトを処理するコントローラーを定義するために、GatewayClassリソースを作成します。
    GatewayClassのサンプル
    apiVersion: gateway.networking.k8s.io/v1
    kind: GatewayClass
    metadata:
      name: example-gateway-class
    spec:
      controllerName: citrix.com/nscpxgw-controller
  2. (オプション) TLS構成のためにGateway-Listenerで使用する自己署名SSL証明書とキーを作成します。
    以下のコマンドは、自己署名証明書を作成するための単なるサンプルコマンドであり、アプリケーションのホスト名がexample.comであると仮定しています。
    openssl genrsa -out cnnwebsite_key.pem 2048
    openssl req -new -key cnnwebsite_key.pem -out cnnwebsite_csr.pem -subj "/CN=example.com"
    openssl x509 -req -in cnnwebsite_csr.pem -sha256 -days 365 -extensions v3_ca -signkey cnnwebsite_key.pem -CAcreateserial -out cnnwebsite_cert.pem
    注:
    すでにSSL証明書をお持ちの場合は、それを使用してKubernetesシークレットを作成できます。
  3. SSL証明書とキー(TLSペア)を保存するためのKubernetes Secretを作成します。
    kubectl create secret tls app1-secret --key cnnwebsite_key.pem --cert cnnwebsite_cert.pem
  4. 定義されたリスナーに基づいてサービスを公開するためのGatewayリソースを定義します。
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: example-gateway
    spec:
      gatewayClassName: example-gateway-class
      listeners:
      - name: http
        protocol: HTTP
        port: 80
      - name: https
        protocol: HTTPS
        port: 443
        tls:
          mode: Terminate
          certificateRefs:
          - kind: Secret
            name: app1-secret
            group: ""
    注:
    • Gatewayで定義されているgatewayClassNameが、前の手順で作成されたGatewayClassリソースと一致することを確認します。
  5. HTTPRouteまたはその他のルートCRDを適用して、バックエンドサービスにトラフィックをルーティングします。
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: example-route
    spec:
      parentRefs:
      - name: example-gateway
      hostnames:
        - "example.com"
      rules:
      - matches:
        - path:
            type: PathPrefix
            value: /
        backendRefs:
        - name: cnn-website
          namespace: default
          port: 80
    注:
    • parentRefsで指定されたゲートウェイ名が、前の手順で確立されたGateway CRDと一致することを確認してください。
    • 現在、HTTPRoute CRDは単一のparentRefのみをサポートしています。
  6. gatewayClassのステータスを確認します。ステータスがACCEPTED: Trueと表示されている場合、コントローラーはリソースを受け入れています。
    kubectl get gatewayclass
    NAME                     CONTROLLER                   ACCEPTED   AGE  
    example-gateway-class   citrix.com/nscpxgw-controller   True       2d
    kubectl describe gatewayclass
    ...
    Spec:
    Controller Name:  citrix.com/nscpxgw-controller
    Status:
    Conditions:
        Last Transition Time:  2025-10-16T06:24:51Z
        Message:               Accepted by the controller.
        Reason:                Accepted
        Status:                True
        Type:                  Accepted
    Events:                    <none>
    Gatewayリソースのステータスを確認します。ステータスがPROGRAMMED : Trueと表示されている場合、コントローラーは設定をNetScalerに正常にプッシュしています。
    kubectl get gateway example-gateway

    NAME            CLASS                    ADDRESS  PROGRAMMED  AGE
    example-gateway   example-gateway-class   10.244.2.28   True         14m
    kubectl describe gateway example-gateway

    Status:
        Addresses:
            Type:   IPAddress
            Value:  10.244.2.28
        Conditions:
            Last Transition Time:  2025-10-16T06:24:53Z
            Message:               Accepted by the controller.
            Reason:                CreatedCRDInstance
            Status:                True
            Type:                  Accepted
            Last Transition Time:  2025-10-16T06:25:01Z
            Message:               Config pushed by the controller.
            Reason:                ConfigPushedToNetscaler
            Status:                True
            Type:                  Programmed
        Events:                    <none>
  7. トラフィックの場合、CPXのサービスはnodePortとしてデプロイされているため、nodeIP:NodePortを使用してトラフィックを送信できます。
    kubectl get svc -o wide

    NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE   SELECTOR
    cpx-gateway-controller-cpx-service   NodePort       10.104.175.74   <none>        80:31375/TCP,443:31994/TCP   11m   app=cpx-gateway-controller-netscaler-cpx-with-gateway-controller
    curl -vik --resolve example.com:<nodePort>:<nodeIP> https://example.com:<nodePort>

    curl -vik --resolve example.com:31994:<nodeIP> https://example.com:31994

GatewayおよびTCPRoute CRDを使用してTCPアプリケーションを公開する

このセクションでは、NetScalerとKubernetes Gateway APIを使用してTCPベースのアプリケーションを公開するための段階的な手順を説明します。

ステップ 1: サンプル TCP アプリケーションをデプロイする

Kubernetes クラスターにサンプル TCP アプリケーション (例: Redis サーバー) をデプロイします。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-server
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:7.0
        ports:
        - containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
  name: redis-service
  namespace: default
spec:
  selector:
    app: redis
  ports:
  - port: 6379
    targetPort: 6379
    protocol: TCP
構成を適用します。
kubectl apply -f redis-deployment.yaml

ステップ 2: GatewayClass を作成する

NetScaler Gateway Controller を参照する GatewayClass リソースを作成します。
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: netscaler-gateway-class
spec:
  controllerName: citrix.com/netscaler-gateway-controller
GatewayClass を適用します。
kubectl apply -f gateway-class.yaml

ステップ 3: TCP リスナーを持つ Gateway を作成する

TCP プロトコル リスナーを持つ Gateway リソースを作成します。addresses フィールドは NetScaler 上の VIP アドレスを指定します。
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: tcp-gateway
  namespace: default
spec:
  gatewayClassName: netscaler-gateway-class
  addresses:
    - type: IPAddress
      value: "192.168.1.100"
  listeners:
    - name: redis-listener
      protocol: TCP
      port: 6379
      allowedRoutes:
        namespaces:
          from: Same
Gateway を適用します。
kubectl apply -f tcp-gateway.yaml

ステップ 4: TCPRoute を作成する

Gateway リスナーにアタッチし、バックエンド サービスにトラフィックをルーティングする TCPRoute リソースを作成します。
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TCPRoute
metadata:
  name: redis-route
  namespace: default
spec:
  parentRefs:
    - name: tcp-gateway
      sectionName: redis-listener
  rules:
    - backendRefs:
        - name: redis-service
          port: 6379
TCPRoute を適用します。
kubectl apply -f tcp-route.yaml

ステップ 5: 構成を確認する

  1. Gateway のステータスを確認します。
kubectl get gateway tcp-gateway -o yaml
  1. TCPRoute のステータスを確認します。
kubectl get tcproute redis-route -o yaml
Accepted と Programmed の両方の条件が status: "True" を示していることを確認します。
  1. TCP接続をテストします。
redis-cli -h 192.168.1.100 -p 6379 ping
期待される出力: PONG

Gateway および UDPRoute CRD を使用した UDP アプリケーションの公開

このセクションでは、NetScaler を使用して Kubernetes Gateway API を介して UDP ベースのアプリケーション (DNS サーバーなど) を公開するための段階的な手順を説明します。

ステップ 1: サンプル UDP アプリケーションを展開する

Kubernetes クラスターにサンプル DNS サーバー (CoreDNS) を展開します。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: coredns-server
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: coredns
  template:
    metadata:
      labels:
        app: coredns
    spec:
      containers:
      - name: coredns
        image: coredns/coredns:1.11.1
        args: ["-conf", "/etc/coredns/Corefile"]
        ports:
        - containerPort: 5353
          protocol: UDP
        volumeMounts:
        - name: config-volume
          mountPath: /etc/coredns
      volumes:
      - name: config-volume
        configMap:
          name: coredns-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns-config
  namespace: default
data:
  Corefile: |
    .:5353 {
        forward . 8.8.8.8
        log
        errors
    }
---
apiVersion: v1
kind: Service
metadata:
  name: dns-service
  namespace: default
spec:
  selector:
    app: coredns
  ports:
  - port: 5353
    targetPort: 5353
    protocol: UDP
構成を適用します。
kubectl apply -f coredns-deployment.yaml

ステップ 2: GatewayClass を作成する

まだ作成されていない場合は、GatewayClass を作成します。
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: netscaler-gateway-class
spec:
  controllerName: citrix.com/netscaler-gateway-controller

ステップ 3: UDP リスナーを持つ Gateway を作成する

UDP プロトコル リスナーを持つ Gateway リソースを作成します。
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: udp-gateway
  namespace: default
spec:
  gatewayClassName: netscaler-gateway-class
  addresses:
    - type: IPAddress
      value: "192.168.1.101"
  listeners:
    - name: dns-listener
      protocol: UDP
      port: 53
      allowedRoutes:
        namespaces:
          from: Same
Gateway を適用します。
kubectl apply -f udp-gateway.yaml

ステップ 4: UDPRoute を作成する

Gateway リスナーにアタッチする UDPRoute リソースを作成します。
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: UDPRoute
metadata:
  name: dns-route
  namespace: default
spec:
  parentRefs:
    - name: udp-gateway
      sectionName: dns-listener
  rules:
    - backendRefs:
        - name: dns-service
          port: 5353
UDPRouteを適用します:
kubectl apply -f udp-route.yaml

ステップ5: 設定を確認する

  1. Gatewayのステータスを確認します:
kubectl get gateway udp-gateway -o yaml
  1. UDPRouteのステータスを確認します:
kubectl get udproute dns-route -o yaml
  1. Gateway経由でDNS解決をテストします:
dig @192.168.1.101 -p 53 example.com