Product Documentation

NetScaler CPXを使用したKubernetes環境でのIngressトラフィックの負荷分散

2017年10月5日

Kubernetes環境では、KubernetesサービスのIngressトラフィックの負荷分散を行うために、IngressリソースとIngressコントローラーが必要です。Ingressリソースは、Kubernetesサービス用のロードバランサーを構成するためのKubernetesリソースです。ロードバランサーは、外部から到達可能なサービスのURLを提供してKubernetesクラスターの外のクライアントにサービスを公開し、それらのURLに送信されるトラフィックを負荷分散します。NetScaler CPXをKubernetes環境内のIngressロードバランサーとして使用し、North-SouthトラフィックをKubernetesクラスターの外のクライアントごとにKubernetesサービスに負荷分散させることができます。

Ingressコントローラーは、ロードバランサーとKubernetesを統合します。Kubernetes APIを介してIngressリソースを監視し、スケーリング、ローリングアップデート、またはメタデータの変更によりサービスが変更された場合、ロードバランサーの構成を更新します。NetScaler Management and Analytics System(MAS)には、Kubernetes環境用のNetScaler Ingressコントローラーが含まれています。Kubernetesクラスターに展開されたNetScaler IngressコントローラーとNetScaler CPXインスタンスにより、Kubernetes環境でIngressトラフィックを処理できるようになります。NetScaler MASについて詳しくは、 NetScaler Management and Analytics System製品のドキュメントを参照してください

KubernetesのIngressリソースとIngressコントローラーについて詳しくは、 「Ingressリソース」を参照してください

NetScaler Ingressコントローラーの仕組み

Kubernetesクラスターの展開後、NetScaler MASにKubernetes環境の詳細を提供して、クラスターとNetScaler MASを統合する必要があります。NetScaler MASは、サービス、ポッド、IngressルールなどのKubernetesリソースの変更を監視します。

KubernetesクラスターでNetScaler CPXインスタンスをIngressリソースとして展開すると、NetScaler MASに自動的に登録されます。NetScaler MASは登録プロセスの一環として、NetScaler CPXインスタンスIPアドレスの情報と、NITRO REST APIを使用してNetScalerインスタンスに到達し、NetScaler固有の構成を行うためのポートの情報を取得します。

NetScaler MASのStylebookエンジンは、サービス、ポッド、Ingressルールなど、NetScaler MASがKubernetesから収集するすべての情報を処理します。Stylebookエンジンは、既存のプロビジョニング済みStylebook(com.citrix.adc.stylebooks/1.0/cs-lb-mon)を使用して、負荷分散に必要な仮想サーバー、サービス、サービスグループなどのNetScalerの構成を生成し、その構成をNetScaler CPX Ingressロードバランサーに適用します。StyleBookについて詳しくは、 「StyleBook」を参照してください

次の図は、Kubernetes環境を示しています。この図には、Ingressトラフィックを処理するためにKubernetesクラスター内のNetScaler CPX Ingressリソースと統合されたNetScaler Ingressコントローラーが含まれています。

ローカライズされた画像

この例では、NetScaler CPXコンテナーを展開し、仮想IP(VIP)アドレスを使用してクラスター外からKubernetesサービスにトラフィックを負荷分散しています。NetScaler CPXコンテナーは、サービスAとBを構成する複数のKubernetesポッド間で要求を分散することにより、North-Southトラフィックを負荷分散します。

重要

ドメインapi.example.comのDNS構成は、NetScaler CPXホストIPアドレスを使用してNetScaler CPXコンテナーにトラフィックを送信するように構成されています。複数のNetScaler CPXコンテナーがIngressロードバランサーとして構成されている場合は、DNS方式を使用してNetScaler CPXコンテナー全体にIngressトラフィックを分散させてください。

NetScaler MASは、Kubernetesクラスター内のNetScalerデバイスを管理し、情報とトラブルシューティングのための豊富な分析をデバイスから提供します。また、NetScalerデバイスから詳細なトラフィック統計を収集することで、アプリケーションのパフォーマンスとセキュリティを把握できます。

Kubernetes環境でNetScaler CPXをIngressロードバランサーとして展開する

NetScaler CPXは、Kubernetes環境のIngressロードバランサーとして使用できます。NetScaler CPXコンテナーをクラスター内のノードにKubernetesポッドとして展開できます。または、そのホストが他のKubernetesノードと同じオーバーレイネットワークに参加している場合には、クラスター外のホストに展開することもできます。

前提条件

開始前に、以下を実行してください:

ローカライズされた画像

Kubernetesクラスターの外部にNetScaler CPXをIngressロードバランサーとして展開する

NetScaler CPXは、Kubernetesクラスターの外部にIngressロードバランサーとして展開できます。クラスターの外部にあるホストが、他のKubernetesノードと同じオーバーレイネットワークに参加している必要があります。

Kubernetesクラスターの外部にあるホストにNetScaler CPXをIngressロードバランサーとして展開するには: ホスト上で次のようなdocker runコマンドを実行して、NetScaler CPXインスタンスをDockerコンテナーに展開します:

docker run -dt --privileged=true -p <port_number> -e NS_HTTP_PORT=<netscaler_HTTP_port> -e NS_HTTPS_PORT=<netscaler_HTTPS_port> -e EULA=yes -e NS_MGMT_SERVER=<MAS_IP_address> -e NS_MGMT_FINGER_PRINT="<MAS_finger_print>" -e NS_ROUTABLE=<True|False> -e NS_LB_ROLE=<lb_role> -e HOST=$HOSTNAME store/citrix/netscalercpx:12.0-53.6

docker run -dt --privileged=true -p 5080:80 -p 5443:443 -p 80:5080 -e NS_HTTP_PORT=5080 -p 443:5443 -e NS_HTTPS_PORT=5443 -e EULA=yes -e NS_MGMT_SERVER=10.217.212.226 -e NS_MGMT_FINGER_PRINT="74:EA:04:90:2C:FA:BF:7A:31:C9:52:64:D3:9C:BC:D3:O8:9F:9A:O4" -e NS_ROUTABLE=FALSE -e NS_LB_ROLE=SERVER -e HOST=$HOSTNAME store/citrix/netscalercpx:12.0-53.6

このコマンドは、NetScaler CPX Dockerコンテナーを展開します。次の表では、docker runコマンドで使用されるさまざまなオプションと環境変数について説明しています:

オプションとNetScaler固有の環境変数 説明
-dt NetScaler CPXコンテナーがデーモン形式で実行されるように指定します。
–privileged = true NetScaler CPXコンテナーが特権モードで実行されるように指定します。
-p NetScaler CPXとホスト間のポートをマップします。デフォルトでは、Kubernetes Ingressオブジェクトは、ポート80および443を使用してクラスターにアクセスすることを前提としています。
-p 5080:80 コンテナーのポート80をホストのポート5080にバインドします。
-p 5443:443 コンテナーのポート443をホストのポート5443にバインドします。
-p 443:5443 コンテナーのポート5443をホストのポート443にバインドします。
-p 80:5080 コンテナーのポート5080をホストのポート80にバインドします。
-e NS_HTTP_PORTまたは-e NS_HTTPS_PORT NetScaler CPX固有の環境変数で、NetScaler CPXへの管理アクセス用のカスタムポートを割り当てることができます。NetScaler MASはこれらのポートを使用してNetScaler CPXにアクセスします。
-e NS_MGMT_SERVER NetScaler MASサーバーのIPアドレスを定義できるようにするNetScaler CPX固有の環境変数。NetScaler CPXは展開されると、このIPアドレスを使用してNetScaler MASサーバーに自動的に登録されます。
-e NS_MGMT_FINGER_PRINT NetScaler MASのフィンガープリントを定義するNetScaler CPX固有の環境変数。
-e NS_ROUTABLE = FALSE NetScaler CPXコンテナーを非IPコンテナーモードで実行するように指定するNetScaler CPX固有の環境変数。
-e NS_LB_ROLE=SERVER NetScaler CPX固有の環境変数で、NetScaler CPXコンテナーをIngressリソースとして使用することをNetScaler CPXおよびNetScaler MASに指定します。
-e HOST=$HOSTNAME NetScaler CPX固有の環境変数で、NetScaler MASがNetScaler CPXコンテナーにアクセスするために使用できるホスト名を指定します。NetScaler MASがホスト名を解決できることを確認し、解決できない場合にはIPアドレスを指定してください。

ホストにNetScaler CPXインスタンスを展開すると、NetScaler Management and Analytics System(MAS)に自動的に登録されます。展開されたNetScaler CPXインスタンスは、NetScaler MASのUI、[Networks]> [Instances]>[NetScaler CPX] で表示できます。

ローカライズされた画像

Kubernetesクラスター内でNetScaler CPXをIngressロードバランサーとして展開する

Kubernetesクラスター内でNetScaler CPXをIngressロードバランサーとして展開するには、Kubernetesクラスター内のノードにKubernetesポッドとして展開します。

Kubernetesクラスター内でNetScaler CPXをIngressロードバランサーとして展開するには 1. (オプション)クラスター内の特定のノードにNetScaler CPXをKubernetesポッドとして展開する場合には、ラベルを使用してノードを指定できます。Kubernetesノードにラベルを付けるには、kubectlコマンドを使用します:

kubectl label nodes <node_IP_address> node-role=<label_name>



kubectl label nodes 10.217.222.224 node-role=ingress

ノードにラベルを付けると、ポッドの仕様にそのラベルを指定して、ポッドがそのノードに展開されるようにできます。

  1. KubernetesクラスターでNetScaler CPXコンテナーがポッドとして展開されるように、NetScaler CPXのポッドの仕様を定義します。ポッドの仕様は、YAMLファイルまたはJSONスクリプトで定義します。YAMLファイルまたはJSONスクリプトには、コンテナーの種類、CPXイメージファイル名、NetScaler MASサーバーのIPアドレス、およびNetScaler MASサーバーのフィンガープリントを指定します。 次に、NetScaler CPXのポッドの仕様の例を示します:
    apiVersion: v1
    kind: Pod
    metadata:
    name: cpx-ingress
    annotations:
        NETSCALER_AS_APP: "True"
    spec:
        containers:
            - name: cpx-ingress
              image: "cpx:12.0-41.16"
        securityContext:
            privileged: true
        env:
            - name: "EULA"
              value: "yes"
            - name: "NS_MGMT_SERVER"
              value: "10.217.212.226"
            - name: "NS_MGMT_FINGER_PRINT"
              value: "74:EA:04:90:2C:FA:BF:7A:31:C9:52:64:D3:9C:BC:D3:O8:9F:9A:O4"
            - name: "NS_ROUTABLE"
              value: "FALSE"
            - name: "NS_HTTP_PORT"
              value: "5080"
            - name: "NS_HTTPS_PORT"
              value: "5443"
            - name: "NS_LB_ROLE"
              value: "SERVER"
            - name: "HOST"
              value: ""
            - name: "KUBERNETES_TASK_ID"
        valueFrom:
        fieldRef:
        fieldPath: metadata.name
            - name:"HOST"
    valueFrom:
        fieldRef:
            fieldPath: spec.nodeName
        ports:
            - containerPort: 80
              hostPort: 5080
            - containerPort: 443
              hostPort: 5443
            - containerPort: 5080
              hostPort: 80
            - containerPort: 5443
              hostPort: 443
        imagePullPolicy: Always
        nodeSelector:
            node-role: ingress

または、NetScaler CPXがレプリケーションコントローラーとして展開されるようにポッドの仕様を定義し、NetScaler CPXがダウンした場合にKubernetesがクラスター内のNetScaler CPXコンテナーを再作成するようにもできます。仕様の例は次のとおりです:

    apiVersion: v1
    kind: ReplicationController
    metadata:
    name: cpx-ingress
    spec:
        replicas: 1
        selector:
            app: cpx-ingress-device
        template:
        metadata:
            name: cpx-ingress
        annotations:
            NETSCALER_AS_APP: "True"
        labels:
            app: cpx-ingress-device
        spec:
            containers:
                - name: cpx-ingress
                image: "cpx:12.0-41.16"
            securityContext:
                privileged: true
            env:
                - name: "EULA"
                value: "yes"
                - name: "NS_MGMT_SERVER"
                value: "10.217.212.226"
                - name: "NS_MGMT_FINGER_PRINT"
                value: "74:EA:04:90:2C:FA:BF:7A:31:C9:52:64:D3:9C:BC:D3:O8:9F:9A:O4"
                - name: "NS_ROUTABLE"
                value: "FALSE"
                - name: "NS_HTTP_PORT"
                value: "5080"
                - name: "NS_HTTPS_PORT"
                value: "5443"
                - name: "NS_LB_ROLE"
                value: "SERVER"
                - name: "HOST"
                value: ""
                - name: "KUBERNETES_TASK_ID"
        valueFrom:
        fieldRef:
        fieldPath: metadata.name
            - name:"HOST"
    valueFrom:
        fieldRef:
            fieldPath: spec.nodeName
        ports:
            - containerPort: 80
            hostPort: 5080
            - containerPort: 443
            hostPort: 5443
            - containerPort: 5080
            hostPort: 80
            - containerPort: 5443
            hostPort: 443
        imagePullPolicy: Always
        nodeSelector:
            node-role: ingress

次の表では、上記の例で使用されているセクション、パラメーター、および環境変数について説明しています:

セクション パラメーター 説明
containers name NetScaler CPXコンテナーの名前。
  image コンテナーを作成するためのイメージを指定します。
securityContext privileged: true NetScaler CPXコンテナーが特権モードで実行されるように指定します。
env name: “EULA” NetScaler CPX固有の環境変数で、https://www.citrix.com/products/netscaler-adc/cpx-express.htmlにあるエンドユーザーライセンス契約書(EULA)を読んで理解したことを確認する必要があります。
  name: “NS_MGMT_SERVER” NetScaler MASサーバーのIPアドレスを定義できるようにするNetScaler CPXの環境変数。NetScaler CPXは展開されると、このIPアドレスを使用してNetScaler MASサーバーに自動的に登録されます。
  name: “NS_MGMT_FINGER_PRINT” NetScaler MASのフィンガープリントを定義できるようにするNetScaler CPXの環境変数。
  name: “NS_ROUTABLE” NetScaler CPXコンテナーを非IPコンテナーモードで実行することを指定できるようにするNetScaler CPXの環境変数。値は必ず「FALSE」に設定してください。
  name: “NS_HTTP_PORT”またはname: “NS_HTTPS_PORT” NetScaler CPXへの管理アクセス用のカスタムポートを割り当てられるようにするNetScaler CPX固有の環境変数。NetScaler MASはこれらのポートを使用してNetScaler CPXコンテナーにアクセスします。
  name: “NS_LB_ROLE” NetScaler CPXの環境変数で、NetScaler CPXコンテナーをIngressリソースとして使用することをNetScaler CPXおよびNetScaler MASに指定できるようにします。
  name: “HOST” NetScaler CPXコンテナーが実行されているノードのホスト名。NetScaler MASはこのホスト名を使用してNetScaler CPXコンテナーにアクセスできます。
  name: “KUBERNETES_TASK_ID” Kubernetesクラスター内のNetScaler CPX IDを識別します。
  name: “HOST” NetScaler CPXコンテナーが実行されているノードのホスト名。NetScaler MASはこのホスト名を使用してNetScaler CPXにアクセスできます。
ports containerPort:またはhostPort: NetScaler CPXコンテナーとホスト間のポートをマップします。デフォルトでは、Kubernetes Ingressオブジェクトは、ポート80および443でクラスターにアクセスすることを前提としています。
imagePullPolicy   Kubernetesがイメージをどのようにプルするかを指定します。
nodeSelector node-role: ポッドを展開するノードのラベル。

3. 次のコマンドを使用して、NetScaler CPXのポッドの仕様を展開します:

kubectl create –f  (fileName | scriptName)

kubectl create –f sample.yaml

NetScaler CPXインスタンスをホストに展開すると、NetScaler Management and Analytics System(MAS)に自動的に登録されます。展開されたNetScaler CPXインスタンスは、NetScaler MASのUI、[Networks]> [Instances]>[NetScaler CPX] で表示できます。

ローカライズされた画像

NetScaler CPXを使用したKubernetes環境でのIngressトラフィックの負荷分散