Citrix ADC ingress controller

Citrix ADC CPXを使用したロードバランサーサービスおよびイングレスタイプの外部IPアドレスのBGPアドバタイズ

サポートタイプLoadBalancerの Kubernetes サービスは、クラウド環境のクラウドロードバランサによって提供されます。 クラウドサービスプロバイダーは、ロードバランサーを自動的に作成し、サービスステータスの一部として表示される IP アドレスを割り当てることで、このサポートを有効にします。外部 IP アドレス宛てのトラフィックは、クラウドロードバランサーによって NodeIP と NodePort で負荷分散されます。トラフィックが Kubernetes クラスターに到達すると、kube-proxy は iptables または IP 仮想サーバルールを使用して実際のアプリケーション Pod へのルーティングを実行します。ただし、オンプレミス環境では、クラウドロードバランサーの自動構成は利用できません。

Citrix イングレスコントローラーと、Citrix ADC VPX や MPX などのティア1 Citrix ADCデバイスを使用して、タイプLoadBalancerのサービスを公開できます。Kubernetesクラスターの外部に存在するCitrix ADC VPXまたはMPXは、Kubernetesサービスへの着信トラフィックを負荷分散します。このような展開について詳しくは、[公開するサービスの種類 LoadBalancer] (/en-us/citrix-k8s-ingress-controller/network/type-loadbalancer.html) を参照してください。

ただし、オンプレミス環境で LoadBalancer タイプのサービスを公開するために、外部 ADC デバイスを使用することが常に可能であるとは限りません。外部コンポーネントを使用せずに Kubernetes クラスタ自体からすべての関連リソースを管理することが望ましい場合もあります。Citrix ingress controller は、Kubernetes クラスター内で実行される Citrix ADC CPX を使用して、ロードバランサータイプのサービスを公開する方法を提供します。Kubernetes ノードにトラフィックをルーティングする既存の BGP ファブリックを活用して、このソリューションを実装します。

この展開では、Citrix ADC CPXがホストモードのKubernetesノードにデーモンセットとして展開されます。Citrix ADC CPX は、ネットワークルーターとのBGPピアリングセッションを確立し、そのピアリングセッションを使用して外部クラスターサービスのIPアドレスをアドバタイズします。ルーターに ECMP 機能がある場合、トラフィックはアップストリームルーターによって複数の CPX インスタンスに負荷分散され、その結果、実際のアプリケーション Pod に負荷分散されます。このモードでCitrix ADC CPXを展開すると、Citrix ADC CPX はKubernetesノード上のロードバランサタイプの各サービスに対してiptablesルールを追加します。外部IPアドレス宛てのトラフィックは、Citrix ADC CPX ポッドにルーティングされます。

次の図は、Citrix ADC CPX がロードバランサータイプのサービスを公開している展開を示しています。

citrix-adc-cpx-service-type-lb

図に示すように、Citrix ADC CPXはデーモンセットとして実行され、Kubernetesノードリソースが指すノードIPアドレスのポート179を介してBGPセッションを実行します。Kubernetes APIサーバーに追加されたLoadBalancerタイプのすべてのサービスに対して、Citrix ingress controller は、構成されたBGPルーターに外部IPアドレスをアドバタイズするようにCitrix ADC CPXを構成します。/32 プレフィックスはルートを外部ルーターにアドバタイズするために使用され、ノード IP アドレスは外部 IP アドレスに到達するためのゲートウェイとして使用されます。トラフィックがKubernetesノードに到達すると、iptablesルールはトラフィックをCitrix ADC CPXに誘導し、Citrix ADC CPXが実際のサービスポッドに負荷分散します。

このデプロイメントでは、Kubernetes Ingress リソースを使用して Ingress 仮想 IP (VIP) アドレスをルーターにアドバタイズすることもできます。NS_VIP環境変数は、すべてのIngressリソースのVIPとして機能するCitrix ingress controller をデプロイするときに指定できます。Ingressリソースが追加されると、Citrix ADC CPXはNS_VIPをBGP経由で外部ルーターにアドバタイズしてトラフィックを引き付けます。トラフィックがNS_VIPに到達すると、Citrix ADC CPX は入力リソースで指定されたとおりにコンテンツの切り替えと負荷分散を実行します。

注:

このソリューションを機能させるには、Citrix ingress controller がrootユーザーとして実行され、 NET_ADMIN機能を備えている必要があります。

ロードバランサータイプのサービスにCitrix ADC CPXソリューションを展開する

この手順では、Citrix ADC CPX をホストネットワークにデーモンセットとして展開して、LoadBalancer タイプのサービスを公開する方法について説明します。

この構成には、次のタスクが含まれます。

  • CitrixイングレスコントローラーをサイドカーとしてCitrix ADC CPXを展開する

  • BGP 構成

  • サービス設定

前提条件

  • ECMP をサポートする BGP ルーティング用にアップストリームルーターを設定し、Kubernetes ノードをネイバーとして追加する必要があります。
  • ルータが負荷分散をサポートしている場合は、負荷分散に安定したECMPハッシュアルゴリズムを使用し、エントロピーを高くして均等な負荷分散を行うことをお勧めします。

以下の手順に従います。

  1. rbac.yaml ファイルをダウンロードし、Citrix ADC CPX および Citrix 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には、Citrix ingress controller の ConfigMap の場所をnamespace/nameの形式で指定します 。
    • 引数--ipam citrix-ipam-controllerは、Citrix IPAMコントローラーでIPアドレスの自動割り当てを実行している場合に指定できます。
    • (オプション) nodeSelector、Citrix ADC CPX デーモンセットを実行する必要があるノードを選択します。デフォルトでは、すべてのワーカーノードで実行されます。
  4. citrix-k8s-cpx-ingress.yaml ファイルを適用して、Citrix ADC CPX と Citrix ingress controller を起動するデーモンセットを作成します。

      kubectl apply -f citrix-k8s-cpx-ingress.yml
    
  5. Citrix ingress controller に引数として渡される BGP 構成を使用して ConfigMap(configmap.yaml)を作成します。BGP 設定の詳細については、「 BGP 設定」を参照してください。

    BGP ルーティングを設定するには、次の情報が必要です。

    • Citrix ADC CPXが接続するためのルーターIPアドレス
    • ルータの自律システム(AS 番号)
    • Citrix ADC 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アドレスを取得するさまざまな方法と、Citrixが提供するサービスアノテーションを使用してさまざまなCitrix ADC機能を構成する方法について説明します。

    以下は、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
    

サービスが適用されると、Citrix ingress controller はBGPルートヘルスインジェクションを有効にした負荷分散仮想サーバーを作成します。負荷分散仮想サーバの状態がUPの場合、外部 IP アドレスのルートは、ノード IP アドレスをゲートウェイとして /32 プレフィックスが付いたネイバールーターにアドバタイズされます。

BGP 構成

BGP 構成は、Citrix ingress controller に引数として渡される ConfigMap を使用して実行されます。

BGP ルーティングを設定するには、次の情報が必要です。

  • Citrix ADC CPXがルーターに接続できるようにするためのルーターのIPアドレス
  • ルータの自律システム(AS 番号)
  • Citrix ADC 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
<!--NeedCopy-->

次の表に、bgpConfigフィールドのさまざまなフィールドについて説明します。

フィールド 説明 種類 デフォルト値 必須
nodeSelector nodeSeclectorフィールドが存在する場合、NodeSelector フィールドに一致するノードに BGP ルータの設定が適用されます。 nodeSelectorはカンマ区切りのkey=valueペアを使用できます。各キーはラベル名を表し、値はラベル値を表します。例:nodeSelector: データセンター = ds1、ラック-ラック 1 string   いいえ
bgpRouter BGP 設定を指定します。bgpRouterの各フィールドについては、次の表を参照してください。 bgpRouter   はい

次の表に、bgpRouterフィールドの説明を示します。

フィールド 説明 種類 デフォルト値 必須
localAS Citrix ADC CPX の AS 番号 整数   はい
neighbor ネイバールータ BGP 設定 ネイバー   はい

次の表に、neighborフィールドの説明を示します。

| フィールド | 説明 | 種類 | デフォルト値 | 必須 | | ———————– | ————————————————————————————— | ——- | ————- | ——– | | address | ネイバールータの IP アドレス。 | string | | はい | | remoteAS | ネイバールータの AS 番号。 | integer | | Yes | | advertisementInterval | BGP ルーティングアップデートの最小送信間隔 (秒単位) を設定します。| 整数 | 10 秒 | はい | | ASOriginationInterval | このフィールドは AS を送信する間隔を設定しますオリジネーションルーティングアップデート(秒単位)。 | 整数 | 10 秒 | はい |

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

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

ノードセレクタ

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
<!--NeedCopy-->

この例では、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
    
  • Citrix が提供するIPAMコントローラーを使用して、サービスに仮想IPアドレスを自動的に割り当てます。他の 2 つの方法のいずれかを指定すると、その方法が IP アドレス管理コントローラよりも優先されます。IP アドレス管理ソリューションは、Infoblox などの ExternalDNS プロバイダーとソリューションを簡単に統合できるように設計されています。詳細については、「ExternalDNS との相互運用性」を参照してください。Citrix IPAM コントローラーの展開と使用については、 ドキュメントを参照してください

サービスアノテーション設定

Citrix ingress controller は、Citrix ADC さまざまな機能を活用するために、多くのサービス注釈を提供します。たとえば、負荷分散仮想サーバーのデフォルトのサービスタイプはTCPですが、この構成はservice.citrix.com/service-typeアノテーションで上書きできます。

metadata:
    annotations:
        service.citrix.com/service-type-0: 'HTTP'
        service.citrix.com/service-type-1: 'SSL'

Citrix Ingress Controller が提供するさまざまな注釈を利用して、SSLオフロード、HTTP書き換えポリシーとレスポンダーポリシー、その他のカスタムリソース定義(CRD)など、さまざまなADC機能を活用できます。

LoadBalancer タイプのサービスのすべてのアノテーションの詳細については、「 サービスアノテーション」を参照してください。

Type LoadBalancer サービスの SSL 証明書にシークレットリソースを使用する方法については、 LoadBalancer タイプのサービスの SSL 証明書を参照してください

外部トラフィックポリシー設定

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

外部トラフィックポリシー:ローカル

Ingress リソースの使用

Citrix ingress controller は、すべてのイングレスリソースの外部IPアドレスであるnt変数NS_VIPを提供します。入力リソースが追加されるたびに、Citrix ADC CPXは入力IPアドレスを外部ルーターにアドバタイズします。 Citrix ingress controller は、イングレスに関するさまざまなアノテーションを提供します。詳細については、 Ingress アノテーションのドキュメントを参照してください

Ingress 設定では、次の手順を実行します。

  1. rbac.yaml ファイルをダウンロードし、Citrix ADC CPX および Citrix 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には、Citrix ingress controller の ConfigMapの場所を名前空間または名前の形式で指定します。

    • すべての Ingress リソースに使用される外部 IPを指定する環境変数NS_VIP。(これは必須パラメータです)。

  4. citrix-k8s-cpx-ingress.yml ファイルを適用して、Citrix ADC CPX と Citrix 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チャートを使用して、Citrix ADC CPX をBGPルーターとしてインストールできます。詳しくは、 Citrix Helm チャートのドキュメントを参照してください

トラブルシューティング

  • 既定では。Citrix ADC CPXは、IPアドレス範囲192.168.1.0/24を内部通信に使用し、IPアドレス192.168.1.1をホストへの内部ゲートウェイとして使用し、IPアドレスIPアドレス192.168.1.2をNSIPとして使用します。ポート9080と9443は、CitrixイングレスコントローラーとCitrix ADC CPXの間のHTTPおよびHTTPS用の管理ポートとして使用されます。192.168.1.0/24 ネットワークが PodCIDR の範囲内にある場合は、内部通信用に別の IP アドレスを割り当てることができます。NS_IPおよびNS_GATEWAY環境変数は、NSIPおよびゲートウェイ用にCitrix ADC CPXが使用するIPアドレスをそれぞれ制御します。Citrix イングレスコントローラーと Citrix ADC CPX間の通信を確立するには、Citrix ingress controller 環境変数NS_IPの一部として同じIPアドレスを指定する必要もあります。

  • デフォルトでは、Citrix ADC CPX上のBGPはポート179で実行され、TCPポート179に到達するすべてのBGPトラフィックはCitrix ADC CPXによって処理されます。Calico の外部 BGP ピアリング機能を使用して BGP 経由でクラスタープレフィックスをアドバタイズする場合など、競合が発生した場合は、環境変数を含む BGP ポートを Citrix ingress controller BGP_PORTに変更できます。

  • Kubernetesの制約により、Citrix ADC ソースIP(USIP)モードを使用が機能しません。送信元 IP アドレスがサービスに必要な場合は、次の注釈を使用して HTTP/SSL サービスタイプサービスで CIP (クライアント IP ヘッダー) 機能を有効にできます。

    service.citrix.com/servicegroup: ‘{“cip”:”ENABLED”, “cipheader”:”x-forwarded-for”}’

Citrix ADC CPXを使用したロードバランサーサービスおよびイングレスタイプの外部IPアドレスのBGPアドバタイズ