Citrix ADC ingress controller

Citrix Ingress Controller での LoadBalancer サポートタイプの Kubernetes サービスの拡張

Citrix Ingress Controller でサポートされる LoadBalancer タイプの Kubernetes サービスは、次の機能によって強化されています。

  • BGP ルートヘルスインジェクション (RHI) のサポート
  • ノードのラベルで定義された一連のノード (ゾーン) 内のサービスの Pod の可用性に基づいて、ロードバランサー IP アドレス (VIP) をアドバタイズまたはリコールする

Citrix ADCでのBGP RHIの自動構成のサポート

ルートヘルスインジェクション(RHI)により、Citrix ADCはBGPを使用してネットワーク全体のホストルートとしてVIPの可用性をアドバタイズできます。ただし、RHIをサポートするには、Citrix ADCで構成を手動で実行する必要がありました。Kubernetes環境にデプロイされたCitrix Ingressコントローラーを使用すると、Citrix ADCでの構成を自動化してVIPをアドバタイズできます。

タイプLoadBalancerのサービスが作成されると、Citrix Ingress Controller はCitrix ADCでサービスのVIPを構成します。Citrix Ingress Controller でBGP RHIサポートが有効になっている場合、VIPをBGPネットワークにアドバタイズするようにCitrix ADCが自動的に構成されます。

Pod の可用性に基づいて VIP をアドバタイズおよびリコールする

次の図に示すトポロジでは、Kubernetes クラスタ内のノードが 3 つの異なるラックに物理的に分散されています。これらは論理的に 3 つのゾーンにグループ化されます。各ゾーンには、Tier-1 ADCとしてCitrix ADC MPXがあり、Kubernetesクラスター内の同じゾーンにCitrix Ingress Controller があります。すべてのゾーンのCitrix Ingressコントローラーは、同じKubernetes APIサーバーをリッスンします。そのため、タイプLoadBalancerのサービスが作成されるたびに、クラスター内のすべてのCitrix ADCが同じIPアドレスをBGPファブリックにアドバタイズします。ゾーンにワークロードがない場合でも、そのゾーン内のCitrix ADCは引き続きIPアドレスをアドバタイズします。

サンプルトポロジー

Citrix は、ゾーン内のポッドの可用性に基づいてVIPをアドバタイズまたはリコールするソリューションを提供します。Citrix Ingress Controller が同じゾーンに属するノードを識別できるように、各ゾーンのノードにラベルを付ける必要があります。各ゾーンのCitrix Ingress Controller は、ゾーン内のノードにPodがあるかどうかをチェックします。ゾーン内のノードに Pod がある場合は、VIP をアドバタイズします。それ以外の場合は、ゾーン上のCitrix ADCからVIPのアドバタイズメントが取り消されます。

Citrix Ingress Controller を使用した Citrix ADC でのBGP RHIの構成

このトピックでは、サンプルトポロジに基づいて、Citrix Ingress Controllerを使用して Citrix ADC で BGP RHI を構成する方法について説明します。このトポロジーでは、Kubernetes クラスタ内のノードが 2 つのゾーンにデプロイされます。各ゾーンには、Tier-1 ADCとしてのCitrix ADC VPXまたはMPX、およびKubernetesクラスターでADCを構成するためのCitrix Ingress Controller があります。ADC は、BGP を使用してアップストリームルータとピアリングされます。

BGP RHI 設定サンプルトポロジ

前提条件

  • Citrix ADC MPXまたはVPXをアップストリームルーターとのBGPピアとして構成する必要があります。

サンプルトポロジに基づいて BGP RHI サポートを設定するには、次の手順を実行します。

  1. 以下のコマンドを使用して、各ゾーンのノードにラベルを付けます。

    ゾーン 1 の場合:

    kubectl label nodes node1 rack=rack-1
    kubectl label nodes node2 rack=rack-1
    

    ゾーン 2 の場合:

    kubectl label nodes node3 rack=rack-2
    kubectl label nodes node4 rack=rack-2
    
  2. Citrix Ingress Controller 構成 YAML ファイルで、以下の環境変数を次のように構成します。

    ゾーン 1 の場合:

    - name: "NODE_LABELS"
      value: "rack-1"
    - name: "BGP_ADVERTISEMENT"
      value: "True"
    

    ゾーン 2 の場合:

     - name: "NODE_LABELS"
       value: "rack-2"
     - name: "BGP_ADVERTISEMENT"
       value: "True"
    

    Citrix Ingress Controllerをゾーン1に展開するためのサンプルcic.yamlファイルを以下に示します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: cic-k8s-ingress-controller-1
      labels:
        app: cic-k8s-ingress-controller-1
    spec:
      serviceAccountName: cic-k8s-role
      containers:
      - name: cic-k8s-ingress-controller
        image: "quay.io/citrix/citrix-k8s-ingress-controller:1.26.7"
    
        env:
        # Set NetScaler NSIP/SNIP, SNIP in case of HA (mgmt has to be enabled)
        - name: "NS_IP"
          value: "10.217.212.24"
       # Set username for Nitro
        - name: "NS_USER"
          valueFrom:
            secretKeyRef:
              name: nslogin
              key: username
       # Set user password for Nitro
        - name: "NS_PASSWORD"
          valueFrom:
            secretKeyRef:
            name: nslogin
            key: password        
        - name: "EULA"
          value: "yes"
        - name: "NODE_LABELS"
          value: "rack=rack-1"
        - name: "BGP_ADVERTISEMENT"
          value: "True"
    args:
      - --ipam 
        citrix-ipam-controller
    imagePullPolicy: Always
    
  3. 次のコマンドを使用して、Citrix Ingress Controller を展開します。

    注:

    Citrix Ingress Controller を両方のラックに(ゾーンごとに)展開する必要があります。

    Kubectl create -f cic.yaml
    
  4. web-frontend-lb.yaml ファイルを使用してサンプルアプリケーションをデプロイします。

    kubectl create-f web-frontend-lb.yaml

    web-frontend-lb.yaml の内容は以下のとおりです。

    apiVersion: v1
    kind: Deployment
    metadata:
      name: web-frontend
    spec:
      selector:
        matchLabels:
          app: web-frontend
      replicas: 4
      template:
        metadata:
          labels:
            app: web-frontend
        spec:
          containers:
          - name: web-frontend
            image: 10.217.6.101:5000/web-test:latest
            ports:
              - containerPort: 80
            imagePullPolicy: Always
    
  5. アプリケーションを公開するタイプLoadBalancerのサービスを作成します。

    Kubectl create -f web-frontend-lb-service.yaml
    

    web-frontend-lb-service.yaml の内容は以下のとおりです。

    apiVersion: v1
    kind: Service
    metadata:
      name: web-frontend
      labels:
        app: web-frontend
    spec:
      type: LoadBalancer
      ports:
      - port: 80
        protocol: TCP
        name: http
      selector:
        app: web-frontend
    
  6. 次のコマンドを使用して、Citrix ADC でのサービスグループの作成を確認します。

    show servicegroup <service-group-name>
    

    コマンドの出力例を次に示します。

    #  show servicegroup k8s-web-frontend_default_80_svc_k8s-web-frontend_default_80_svc
       
    k8s-web-frontend_default_80_svc_k8s-web-frontend_default_80_svc - TCP
    State: ENABLED Effective State: UP Monitor Threshold : 0
    Max Conn: 0 Max Req: 0 Max Bandwidth: 0 kbits
    Use Source IP: NO
    Client Keepalive(CKA): NO
    TCP Buffering(TCPB): NO
    HTTP Compression(CMP): NO
    Idle timeout: Client: 9000 sec Server: 9000 sec
    Client IP: DISABLED 
    Cacheable: NO
    SC: OFF
    SP: OFF
    Down state flush: ENABLED
    Monitor Connection Close : NONE
    Appflow logging: ENABLED
    ContentInspection profile name: ???
    Process Local: DISABLED
    Traffic Domain: 0
    
    
    1)   10.217.212.23:30126 State: UP Server Name: 10.217.212.23 Server ID: None Weight: 1
      Last state change was at Wed Jan 22 23:35:11 2020 
      Time since last state change: 5 days, 00:45:09.760
    
      Monitor Name: tcp-default  State: UP Passive: 0
      Probes: 86941 Failed [Total: 0 Current: 0]
      Last response: Success - TCP syn+ack received.
      Response Time: 0 millisec
    
    2)   10.217.212.22:30126 State: UP Server Name: 10.217.212.22 Server ID: None Weight: 1
      Last state change was at Wed Jan 22 23:35:11 2020 
      Time since last state change: 5 days, 00:45:09.790
    
      Monitor Name: tcp-default State: UP Passive: 0
      Probes: 86941 Failed [Total: 0 Current: 0]
      Last response: Success - TCP syn+ack received.
    
  7. 次のコマンドを使用して、BGP ルータの VIP アドバタイズメントを確認します。

     >VTYSH
    # show ip route bgp
      B       172.29.46.78/32   [200/0] via 2.2.2.100, vlan20, 1d00h35m
                                [200/0] via 2.2.2.101, vlan20, 1d00h35m
      Gateway of last resort is not set
    
Citrix Ingress Controller での LoadBalancer サポートタイプの Kubernetes サービスの拡張