NetScaler CPXを使用したLoadBalancerタイプのサービスおよびIngressの外部IPアドレスのBGPアドバタイズメント

最終公開日 : Oct 02, 2026
LoadBalancerタイプのKubernetesサービスサポートは、クラウド環境のクラウドロードバランサーによって提供されます。 クラウドサービスプロバイダーは、ロードバランサーを自動的に作成し、サービスステータスの一部として表示されるIPアドレスを割り当てることで、このサポートを有効にします。外部IPアドレス宛のトラフィックは、クラウドロードバランサーによってNodeIPとNodePortでロードバランシングされます。トラフィックがKubernetesクラスターに到達すると、kube-proxyはiptablesまたはIP仮想サーバーのルールを使用して、実際のアプリケーションポッドへのルーティングを実行します。ただし、オンプレミス環境では、クラウドロードバランサーの自動構成は利用できません。
NetScaler Ingress Controllerと、NetScaler VPXまたはMPXなどのTier-1 NetScalerデバイスを使用して、LoadBalancerタイプのサービスを公開できます。Kubernetesクラスターの外部にあるNetScaler VPXまたはMPXは、Kubernetesサービスへの受信トラフィックをロードバランシングします。このようなデプロイメントの詳細については、「LoadBalancerタイプのサービスを公開する」を参照してください。
しかし、オンプレミス環境でLoadBalancerタイプのサービスを公開するために外部ADCデバイスを使用することが常に可能であるとは限りません。外部コンポーネントなしで、Kubernetesクラスター自体から関連するすべてのリソースを管理することが望ましい場合があります。NetScaler Ingress Controllerは、Kubernetesクラスター内で実行されるNetScaler CPXを使用して、LoadBalancerタイプのサービスを公開する方法を提供します。Kubernetesノードへのトラフィックをルーティングするための既存のBGPファブリックが、このソリューションの実装に活用されます。
このデプロイメントでは、NetScaler CPXはホストモードでKubernetesノード上にデーモンセットとしてデプロイされます。NetScaler CPXは、ネットワークルーターとのBGPピアリングセッションを確立し、そのピアリングセッションを使用して外部クラスターサービスのIPアドレスをアドバタイズします。ルーターがECMP機能を備えている場合、トラフィックはアップストリームルーターによって複数のCPXインスタンスにロードバランシングされ、それが実際のアプリケーションポッドにロードバランシングされます。このモードでNetScaler CPXをデプロイすると、NetScaler CPXはKubernetesノード上のLoadBalancerタイプの各サービスに対してiptablesルールを追加します。外部IPアドレス宛のトラフィックは、NetScaler CPXポッドにルーティングされます。
次の図は、NetScaler CPXがLoadBalancerタイプのサービスを公開しているデプロイメントを説明しています。
Citrix ADC CPXサービスタイプLB
図に示すように、NetScaler CPXはデーモンセットとして実行され、Kubernetesノードリソースによって示されるノードIPアドレス上のポート179でBGPセッションを実行します。Kubernetes APIサーバーに追加されるLoadBalancerタイプのすべてのサービスに対して、NetScaler Ingress Controllerは、設定されたBGPルーターに外部IPアドレスをアドバタイズするようにNetScaler CPXを構成します。/32プレフィックスは外部ルーターへのルートをアドバタイズするために使用され、ノードIPアドレスは外部IPアドレスに到達するためのゲートウェイとして使用されます。トラフィックがKubernetesノードに到達すると、iptablesルールがトラフィックをNetScaler CPXに誘導し、NetScaler CPXが実際のサービスポッドにロードバランシングします。
このデプロイメントでは、Kubernetes Ingressリソースを使用し、Ingress仮想IP (VIP) アドレスをルーターにアドバタイズすることもできます。NetScaler Ingress Controllerをデプロイする際に、すべてのIngressリソースのVIPとして機能するNS_VIP環境変数を指定できます。Ingressリソースが追加されると、NetScaler CPXはBGPを介してNS_VIPを外部ルーターにアドバタイズし、トラフィックを引き付けます。トラフィックがNS_VIPに到達すると、NetScaler CPXはIngressリソースで指定されたコンテンツスイッチングとロードバランシングを実行します。
注:
このソリューションが機能するには、NetScaler Ingress Controllerがrootユーザーとして実行され、NET_ADMIN機能を持っている必要があります。

LoadBalancerタイプのサービス向けNetScaler CPXソリューションをデプロイする

この手順では、ホストネットワークにデーモンセットとしてNetScaler CPXをデプロイし、LoadBalancerタイプのサービスを公開する方法を説明します。
この構成には、次のタスクが含まれます。
  • NetScaler Ingress Controllerをサイドカーとして使用してNetScaler CPXをデプロイする
  • BGP設定
  • サービス設定

前提条件

  • ECMPをサポートするBGPルーティング用にアップストリームルーターを設定し、Kubernetesノードをネイバーとして追加する必要があります。
  • ルーターがロードバランシングをサポートしている場合、均等なロードバランシングのために、より高いエントロピーを持つ安定したECMPハッシュアルゴリズムを使用することをお勧めします。
次の操作を実行します。
  1. rbac.yamlファイルをダウンロードし、NetScaler CPXおよびNetScaler Ingress ControllerのRBACルールを展開します。
    kubectl apply -f rbac.yaml
  2. 次のコマンドを使用して、citrix-k8s-cpx-ingress.ymlをダウンロードします。
    wget  https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/configure/cpx-bgp-router/citrix-k8s-cpx-ingress.yml
  3. citrix-k8s-cpx-ingress.yamlファイルを編集し、必要な値を指定します。
    • 引数–configmapは、namespace/nameの形式でNetScaler Ingress ControllerのConfigMapの場所を指定します。
    • 自動IPアドレス割り当てのためにNetScaler IPAM Controllerを実行している場合は、引数--ipam citrix-ipam-controllerを指定できます。
    • (オプション) NetScaler CPXデーモンセットを実行する必要があるノードを選択するには、nodeSelectorを使用します。デフォルトでは、すべてのワーカーノードで実行されます。
  4. citrix-k8s-cpx-ingress.yamlファイルを適用して、NetScaler CPXとNetScaler Ingress Controllerを起動するデーモンセットを作成します。
    kubectl apply -f citrix-k8s-cpx-ingress.yml
  5. NetScaler Ingress Controllerへの引数として渡されるBGP設定を含むConfigMap (configmap.yaml) を作成します。BGP設定の詳細については、BGP設定を参照してください。
    BGPルーティングを設定するには、次の情報が必要です。
    • NetScaler CPXが接続するルーターのIPアドレス
    • ルーターの自律システム(AS番号)
    • NetScaler CPXのAS番号
    以下は、BGP構成を含むConfigMapのサンプルです。
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: config
      labels:
        app: cic
    data:
      NS_BGP_CONFIG: |
        bgpConfig:
        - bgpRouter:
            localAS: 100
            neighbor:
            - address: 10.102.33.33
              remoteAS: 100
              advertisementInterval: 10
              ASOriginationInterval: 10
  6. ステップ5で作成したConfigMapを適用して、BGP構成を適用します。
    kubectl apply -f configmap.yaml を実行します。
  7. LoadBalancerタイプのサービスに必要な構成を含むYAMLファイルを作成します。
    注:
    詳細については、サービス構成を参照してください。サービス構成セクションでは、サービスに外部IPアドレスを取得するさまざまな方法と、NetScalerが提供するサービスアノテーションを使用してさまざまなNetScaler機能を構成する方法について説明しています。
    以下は、LoadBalancerタイプのサービスの構成例です。
    apiVersion: v1
    kind: Service
    metadata:
      name: kuard-service
      annotations:
        # This uses IPAM to allocate an IP from range 'Dev'
        # service.citrix.com/ipam-range: 'Dev'
        service.citrix.com/frontend-ip: 172.217.163.17
        service.citrix.com/service-type-0: 'HTTP'
        service.citrix.com/service-type-1: 'SSL'
        service.citrix.com/lbvserver: '{"80-tcp":{"lbmethod":"ROUNDROBIN"}}'
        service.citrix.com/servicegroup: '{"80-tcp":{"usip":"yes"}}'
        service.citrix.com/ssl-termination: edge
        service.citrix.com/monitor: '{"80-tcp":{"type":"http"}}'
        service.citrix.com/frontend-httpprofile: '{"dropinvalreqs":"enabled", "websocket" : "enabled"}'
        service.citrix.com/backend-httpprofile: '{"dropinvalreqs":"enabled", "websocket" : "enabled"}'
        service.citrix.com/frontend-tcpprofile: '{"ws":"enabled", "sack" : "enabled"}'
        service.citrix.com/backend-tcpprofile: '{"ws":"enabled", "sack" : "enabled"}'
        service.citrix.com/frontend-sslprofile: '{"hsts":"enabled", "tls12" : "enabled"}'
        service.citrix.com/backend-sslprofile: '{"tls12" : "enabled"}
        service.citrix.com/ssl-certificate-data-1: |
          -----BEGIN-----
               [...]
          -----END-----
        service.citrix.com/ssl-key-data-1: |
    spec:
      type: LoadBalancer
      selector:
        app: kuard
      ports:
      - port: 80
        targetPort: 8080
        name: http
      - port: 443
        targetPort: 8443
        name: https
  8. LoadBalancerタイプのサービスを適用します。
    kubectl apply -f service-example.yaml
サービスが適用されると、NetScaler Ingress ControllerはBGPルートヘルスインジェクションが有効なロードバランシング仮想サーバーを作成します。ロードバランシング仮想サーバーの状態がUPの場合、外部IPアドレスのルートは、ノードIPアドレスをゲートウェイとする/32プレフィックスでネイバールーターにアドバタイズされます。

BGP構成

BGP構成は、NetScaler Ingress Controllerに引数として渡されるConfigMapを使用して実行されます。
BGPルーティングを構成するには、以下の情報が必要です。
  • NetScaler CPXが接続できるようにするルーターのIPアドレス
  • ルーターの自律システム(AS番号)
  • NetScaler CPXのAS番号
以下のBGP構成のConfigMapでは、bgpConfigフィールドがBGP構成を表します。

apiVersion: v1
kind: ConfigMap
metadata:
  name: config
  labels:
    app: cic
data:
  NS_BGP_CONFIG: |
    bgpConfig:
    - bgpRouter:
        localAS: 100
        neighbor:
        - address: x.x.x.x
          remoteAS: 100
          advertisementInterval: 10
          ASOriginationInterval: 10
次の表は、bgpConfigフィールドのさまざまなフィールドについて説明しています。
フィールド 説明 タイプ デフォルト値 必須
nodeSelector nodeSeclectorフィールドが存在する場合、BGPルーター構成はnodeSelectorフィールドに一致するノードに適用されます。nodeSelectorは、各キーがラベル名を表し、値がラベル値であるカンマ区切りのkey=valueペアを受け入れます。例:nodeSelector: datacenter=ds1,rack-rack1 文字列 いいえ
bgpRouter BGP構成を指定します。bgpRouterのさまざまなフィールドについては、次の表を参照してください。 bgpRouter はい
次の表は、bgpRouterフィールドの各フィールドについて説明しています。
フィールド 説明 タイプ デフォルト値 必須
localAS NetScaler CPXのAS番号 整数 はい
neighbor ネイバールーターのBGP構成。 ネイバー はい
次の表は、neighbor フィールドについて説明しています。
フィールド 説明 タイプ デフォルト値 必須
address ネイバー ルーターの IP アドレス。 文字列 はい
remoteAS ネイバー ルーターの AS 番号。 整数 はい
advertisementInterval このフィールドは、BGPルーティングアップデートの送信間の最小間隔(秒単位)を設定します。 整数 10秒 はい
ASOriginationInterval このフィールドは、AS発信ルーティングアップデートの送信間隔(秒単位)を設定します。 整数 10秒 はい

ノードごとに異なるネイバー

デフォルトでは、クラスター内のすべてのノードは、設定にリストされているすべてのネイバーに接続します。しかし、Kubernetesクラスターが異なるデータセンターや異なるネットワークにまたがっている場合、ノードごとに異なるネイバー設定が必要になることがあります。BGPルーティング設定に必要なノードを選択するには、nodeSelectorフィールドを使用できます。
ノードセレクター
nodeSelector設定を含むConfigMapの例を以下に示します。

apiVersion: v1
kind: ConfigMap
metadata:
  name: config
  labels:
    app: cic
data:
  NS_BGP_CONFIG: |
    bgpConfig:
    - nodeSelector: datacenter=ds1
      bgpRouter:
        localAS: 100
        neighbor:
        - address: 10.102.33.44
          remoteAS: 100
          advertisementInterval: 10
          ASOriginationInterval: 10
    - nodeSelector: datacenter=ds2
      bgpRouter:
        localAS: 100
        neighbor:
        - address: 10.102.28.12
          remoteAS: 100
          advertisementInterval: 10
          ASOriginationInterval: 10
この例では、IPアドレス10.102.33.44を持つルーターは、datacenter=ds1ラベルを持つノードによってネイバーとして使用されます。IPアドレス10.102.28.12を持つルーターは、datacenter=ds2ラベルを持つノードによって使用されます。

サービス構成

外部IPアドレス構成

LoadBalancerタイプのサービス用の外部IPアドレスは、以下のいずれかの方法で取得できます。
  • サービス仕様でservice.citrix.com/frontend-ipアノテーションを次のように指定します。
    metadata:
        annotations:
            service.citrix.com/frontend-ip: 172.217.163.17
  • サービス仕様のspec.loadBalancerIPフィールドにIPアドレスを次のように指定します。
    spec:
        loadBalancerIP: 172.217.163.17
  • NetScalerが提供するIPAMコントローラーを使用して、サービスに仮想IPアドレスを自動的に割り当てます。他の2つの方法のいずれかが指定されている場合、その方法がIPAMコントローラーよりも優先されます。IPAMソリューションは、InfobloxなどのExternalDNSプロバイダーと簡単に統合できるように設計されています。詳細については、「ExternalDNSとの相互運用性」を参照してください。NetScaler IPAM Controllerの展開と使用については、ドキュメントを参照してください。

サービスアノテーション構成

NetScaler Ingress Controllerは、NetScalerのさまざまな機能を活用するための多くのサービスアノテーションを提供します。たとえば、ロードバランシング仮想サーバーのデフォルトのサービスタイプはTCPですが、service.citrix.com/service-typeアノテーションによってこの構成を上書きできます。
metadata:
    annotations:
        service.citrix.com/service-type-0: 'HTTP'
        service.citrix.com/service-type-1: 'SSL'
NetScaler Ingress Controllerが提供するさまざまなアノテーションを利用することで、SSLオフロード、HTTPリライト、レスポンダーポリシー、その他のカスタムリソース定義 (CRD) など、さまざまなADC機能を活用できます。
LoadBalancerタイプのサービスのすべてのアノテーションの詳細については、以下を参照してください。 サービスアノテーション。
LoadBalancerタイプのサービスのSSL証明書にシークレットリソースを使用する方法については、LoadBalancerタイプのサービスのSSL証明書を参照してください。

外部トラフィックポリシー構成

デフォルトでは、NetScaler Ingress Controllerは、NetScaler CPX内のロードバランシング仮想サービスに対して、すべてのサービスポッドをバックエンドとして追加します。この手順により、高可用性が向上し、サービスポッドインスタンスへの均等な分散が保証されます。NetScaler CPXを実行しているすべてのノードは、アップストリームサーバーへのルートをアドバタイズし、ルーターからのトラフィックを引き付けます。この動作は、サービスのspec.externalTrafficPolicyをLocalに設定することで変更できます。外部トラフィックポリシーがLocalに設定されている場合、次の図に示すように、同じノードで実行されているポッドのみがロードバランシング仮想サーバーのバックエンドとして追加されます。このモードでは、サービスポッドを持つノードのみがルーターに外部IPアドレスをアドバタイズし、CPXはローカルポッドにのみトラフィックを送信します。 パフォーマンス上の理由からノード間でトラフィックがホッピングするのを避けたい場合は、この機能を使用できます。

Ingressリソースの使用

NetScaler Ingress Controllerは、すべてのIngressリソースの外部IPアドレスであるnt変数NS_VIPを提供します。Ingressリソースが追加されるたびに、NetScaler CPXはIngress IPアドレスを外部ルーターにアドバタイズします。 NetScaler Ingress Controllerは、Ingress用のさまざまなアノテーションを提供します。詳細については、Ingressアノテーションのドキュメントを参照してください。
Ingress構成には、次の手順を実行します。
  1. rbac.yamlファイルをダウンロードし、NetScaler CPXおよびNetScaler Ingress ControllerのRBACルールを展開します。
    kubectl apply -f rbac.yaml
  2. 次のコマンドを使用して、citrix-k8s-cpx-ingress.ymlをダウンロードします。
    wget  https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/configure/cpx-bgp-router/citrix-k8s-cpx-ingress.yml
  3. citrix-k8s-cpx-ingress.ymlファイルを編集し、必要な値を指定します。
    • 引数–configmapは、NetScaler Ingress ControllerのConfigMapの場所を名前空間または名前の形式で指定します。
    • すべてのIngressリソースに使用する外部IPを指定する環境変数NS_VIP。(これは必須パラメーターです)。
  4. citrix-k8s-cpx-ingress.ymlファイルを適用して、NetScaler CPXとNetScaler Ingress Controllerを起動するデーモンセットを作成します。
    kubectl apply -f citrix-k8s-cpx-ingress.yml
  5. 前のセクションで示したように、ConfigMapを使用してBGPを構成します。
  6. 次のようにサンプルIngressリソースを展開します。この手順では、NS_VIP環境変数で指定されたIPアドレスを、ConfigMapで構成された外部ルーターにアドバタイズします。
    kubectl apply -f https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/configure/cpx-bgp-router/ingress-example.yaml
  7. NS_VIP:<port>を使用してアプリケーションにアクセスします。デフォルトでは、Ingressは安全でない通信にはポート80を、安全な通信にはポート443を使用します(TLSセクションが提供されている場合)。
注: 現在、ingress.citrix.com/frontend-ipアノテーションはBGPアドバタイズメントではサポートされていません。

Helmのインストール

Helmチャートを使用して、NetScaler CPXをBGPルーターとしてインストールできます。詳細については、Citrix Helmチャートのドキュメントを参照してください。

トラブルシューティング

  • デフォルトでは、NetScaler CPX は内部通信に IP アドレス範囲 192.168.1.0/24 を使用し、ホストへの内部ゲートウェイとして IP アドレス 192.168.1.1 を使用し、NSIP として IP アドレス 192.168.1.2 を使用します。ポート 9080 および 9443 は、HTTP および HTTPS 用の NetScaler Ingress Controller と NetScaler CPX 間の管理ポートとして使用されます。192.168.1.0/24 ネットワークが PodCIDR の範囲内にある場合、内部通信用に異なる IP アドレスのセットを割り当てることができます。NS_IP および NS_GATEWAY 環境変数は、NetScaler CPX が NSIP およびゲートウェイにそれぞれ使用する IP アドレスを制御します。NetScaler Ingress Controller と NetScaler CPX 間の通信を確立するには、同じ IP アドレスを NetScaler Ingress Controller 環境変数 NS_IP の一部として指定する必要もあります。
  • デフォルトでは、NetScaler CPX の BGP はポート 179 で実行され、TCP ポート 179 に到達するすべての BGP トラフィックは NetScaler CPX によって処理されます。競合がある場合、たとえば Calico の外部 BGP ピアリング機能を使用して BGP 経由でクラスタプレフィックスをアドバタイズしている場合、NetScaler Ingress Controller の環境変数 BGP_PORT を使用して BGP ポートを変更できます。
  • Kubernetes の制約により、NetScaler のソース IP (USIP) モードは機能しません。サービスでソース IP アドレスが必要な場合は、次のアノテーションを使用して、HTTP/SSL サービスタイプのサービスで CIP (クライアント IP ヘッダー) 機能を有効にできます。
    service.citrix.com/servicegroup: '{"cip":"ENABLED", “cipheader”:”x-forwarded-for”}' を設定します。