NetScaler Ingressコントローラー

イングレス・クラスのサポート

イングレス・クラスって何ですか

Kubernetes クラスターには複数の Ingress コントローラーが存在する場合があり、特定の Ingress リソースを Ingress コントローラーに関連付ける方法が必要です。

Ingress リソース定義でkubernetes.io/ingress.classアノテーションを使用することで、Ingress リソースを処理する Ingress コントローラーを指定できます。

NetScaler Ingress Controller とイングレスクラス

NetScaler Ingress Controllerは、kuberneters.io/ingress.classアノテーション付きの複数の入力リソースの受け入れをサポートします。各イングレスリソースは 1 つのingress.classのみに関連付けることができます。ただし、Ingress Controller は、異なるクラスからのさまざまな Ingress リソースを処理する必要がある場合があります。

YAMLファイルのspecセクションにある--ingress-classes引数を使用して、IngIngress Controller を複数の Ingress クラスに関連付けることができます。

Ingress Controllerにingress-classesが指定されていない場合は、Ingress オブジェクトにkubernetes.io/ingress.classアノテーションが存在するかどうかに関係なく、すべての Ingress リソースを受け入れます。

ingress-classes が指定されている場合、Ingress Controller はkubernetes.io/ingress.classアノテーションに一致する Ingress リソースのみを受け入れます。このような場合、Ingress コントローラーはingress.classアノテーションなしで Ingress リソースを処理しません。

:Ingress クラス名では大文字と小文字は区別されません。

Ingress クラスを使用した YAML 設定のサンプル

Ingress Controllerにingress-classesを関連付けるサンプル YAML ファイルのスニペットを次に示します。この構成は、Ingress Controller がスタンドアロンポッドとして実行される場合と、NetScaler CPXでサイドカーとして実行される場合の両方で機能します。指定された YAML スニペットでは、以下の Ingress クラスが Ingress Controller に関連付けられています。

  • my-custom-class

  • Citrix

spec:
    serviceAccountName: cic-k8s-role
    containers:
    - name: cic-k8s-ingress-controller
      image:"quay.io/citrix/citrix-k8s-ingress-controller:latest"
      # specify the ingress classes names to be supportedbyIngress Controller in args section.
      # First line should be --ingress-classes, andeverysubsequent line should be
      # the name of allowed ingress class. In the givenexampletwo classes named
      # "citrix" and "my-custom-class" are accepted. Thiswill be case-insensitive.
      args:
        - --ingress-classes
          Citrix
          my-custom-class
<!--NeedCopy-->

Ingress クラスの関連付けが示されている Ingress YAML ファイルのスニペットを次に示します。この例では、web-ingressという名前の Ingress リソースが Ingress クラスmy-custom-classに関連付けられています 。NetScaler Ingress Controller がmy-custom-classを許可するように構成されている場合、このIngressリソースを処理します。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: my-custom-class
  name: web-ingress
<!--NeedCopy-->

入力 V1 および IngressClass のサポート

Kubernetes バージョン 1.19 では、Ingress リソースが一般公開されています。 この変更の一環として、 IngressClass という名前の新しいリソースが Ingress API に追加されました。このリソースを使用して、特定の Ingress コントローラーを Ingress に関連付けることができます。 IngressClass リソースの詳細については、 Kubernetes のドキュメントを参照してください

以下はサンプルIngressClassリソースです。


apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: citrix
spec:
  controller: citrix.com/ingress-controller

<!--NeedCopy-->

IngressClassリソースは、以下のように Ingress ルールを実装するコントローラに関連付けられた Ingress クラスを参照する必要があります。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
spec:
  ingressClassName: citrix
  rules:
  - host: abc.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80
<!--NeedCopy-->

NetScaler Ingress Controllerは、次のルールを使用してイングレスと照合します。

  • --ingress-classes引数を指定せずにNetScaler Ingress Controller を起動した場合:

    • Kubernetes のバージョンが 1.19 より前の場合 (IngressClass V1 リソースはサポートされています)

      • 任意の Ingress オブジェクトに一致します
    • Kubernetes のバージョンが 1.19 以上の場合 (IngressClass V1 リソースはサポートされています)

      • spec.ingressClassName フィールドが設定されていない Ingress オブジェクトに一致します。

      • Ingress オブジェクトのspec.ingressClassNameフィールドが設定され、 同じ名前のv1.IngressClassリソースが存在し、 そのリソースのspec.controllerフィールドがcitrix.com/ingress-controllerである場合は、任意の Ingress に一致します。

  • --ingress-classes引数を使用して設定された1つ以上の入力クラスでNetScaler Ingress Controllerを起動した場合。

    • Kubernetes のバージョンが 1.19 より前の場合 (IngressClass V1 リソースはサポートされています)

      • 入力クラス注釈kubernetes.io/ingress.classが一致する任意の入力を、設定された入力クラスの入力クラスと照合します。
    • Kubernetes のバージョンが 1.19 以上の場合 (IngressClass V1 リソースはサポートされています)。

      • イングレスクラスアノテーションkubernetes.io/ingress.classが設定されたイングレスクラスと一致するすべてのイングレスに一致します。このアノテーションは非推奨ですが、下位互換性をサポートするためにspec.IngressClassNameフィールドよりも優先されます。

      • 次の属性を持つv1.IngressClassリソースが存在する場合、任意の Ingress オブジェクトに一致します。

        • --ingress-classes リソースの名前は引数の値と一致します。

        • リソースのspec.controllerフィールドはcitrix.com/ingress-controllerとして設定されます 。

        • リソースの名前は Ingress オブジェクトのspec.ingressClassNameフィールドと一致します。

      • spec.ingressClassName フィールドが設定されておらず、 次の属性を持つv1.IngressClassリソースが存在するすべての Ingress オブジェクトに一致します。

        • リソースの名前は--ingress-classes引数の値と一致します。

        • リソースのspec.controllerフィールドはcitrix.com/ingress-controllerに設定されます 。

        • このリソースは、 ingressclass.kubernetes.io/is-default-class アノテーションを使用してデフォルトクラスとして設定されます。詳細については、 Kubernetes のドキュメントを参照してください

注記:

  • 注釈とspec.ingressClassNameの両方が定義されている場合、注釈はspec.ingressClassNameの前に一致します。注釈が一致しない場合、 spec.ingressClassName フィールドの照合操作は実行されません。

  • Helmチャートを使用してNetScaler Ingressコントローラーをインストールする場合、IngressClassリソースがサポートされていて、NetScaler Ingress Controllerが--ingress-classes引数とともにデプロイされている場合、v1.IngressClassリソースはデフォルトで作成されます。

指定された IP アドレスで Ingress リソースの Ingress ステータスを更新する

NetScaler Ingress Controllerが管理するIngressリソースのStatus.LoadBalancer.Ingressフィールドを割り当てられたIPアドレスで更新するには、NetScaler Ingress Controller を起動するときにコマンドライン引数--update-ingress-status yesを指定します。この機能は、NetScaler VPXまたはMPXを管理するためのスタンドアロンポッドとして展開されたNetScaler Ingress Controllerでのみサポートされます。サイドカーとして展開されたCitrix ADC CPXでは、この機能はサポートされていません。

--update-ingress-status yes コマンドライン引数が有効になっている YAML の例を次に示します。

args:
    - --feature-node-watch false
    - --ipam citrix-ipam-controller
    - --update-ingress-status yes
    imagePullPolicy: Always
<!--NeedCopy-->

サイドカーデプロイメントの Ingress ステータスの更新

Kubernetes では、Ingress を複数のアプリケーションを外部に公開するための単一のエントリポイントとして使用できます。Ingress には Address (Status.LoadBalancer.IP) フィールドがあり、イングレスが正常に作成された後に更新されます。このフィールドは、Kubernetes アプリケーションに到達できるパブリック IP アドレスまたはホスト名で更新されます。クラウドデプロイメントでは、このフィールドにはクラウドロードバランサーの IP アドレスまたはホスト名を指定することもできます。

クラウド展開では、NetScaler CPXとIngressコントローラーがtype LoadBalancerのサービスを使用して公開され、そのサービスがクラウドロードバランサーを作成します。クラウドロードバランサーは、入力コントローラーとともにCitrix ADC CPXを公開します。そのため、NetScaler CPXで公開されるIngressリソースは、クラウドロードバランサーのパブリックIPアドレスまたはホスト名を使用して更新する必要があります。

これは、オンプレミス展開でも適用できます。NetScaler CPXがサービスタイプLoadBalancerとしてティア1のCitrix ADC VPXイングレスに公開されるデュアルティアイングレス展開では、NetScaler CPXによって操作されるイングレスリソースはVIPアドレスで更新されます。

このトピックでは、NetScaler Ingress Controllerをサイドカー展開としてNetScaler CPXのイングレスステータス更新を有効にする方法について説明します。

:サイドカー機能のイングレスステータス更新は、 タイプLoadBalancerのサービスでのみサポートされます。

入力ステータスの更新後の Ingress 出力の例

入力ステータスの更新後の Ingress 出力の例を次に示します。

    $ kubectl get ingress

    NAME             HOSTS              ADDRESS                           PORTS    AGE                                       
    sample-ingress   sample.citrix.com   sample.abc.somexampledomain.com   80      1d

サイドカーデプロイメントの Ingress ステータス更新を有効にする

NetScaler CPX YAML ファイルで次の引数を指定すると、サイドカー展開のイングレスステータス更新機能を有効にできます。NetScaler Ingress Controllerを搭載したNetScaler CPXのデプロイメントYAMLファイル内のNetScaler CPXのargsセクションに引数を追加する必要があります。

    args:
    - --cpx-service <namespace>/<name-of-the-type-load-balancer-service-exposing-cpx>

次の表に、イングレス更新の引数の詳細を示します。

キーワード/変数 説明
--cpx-service この機能を有効にする引数を指定します。
<namespace>/<name-of-the-type-load-balancer-service-exposing-cpx> 引数の値を指定する形式を指定します。
<namespace> サービスが作成される名前空間を指定します。
<name-of-the-type-load-balancer-service-exposing-cpx> NetScaler CPX を公開するサービスの名前を指定します。

注記:

サイドカー機能の Ingress ステータス更新は、 タイプLoadBalancerのサービスでのみサポートされます。--cpx-service default/some-cpx-service引数に定義されているサービスは、type LoadBalancerの Kubernetes サービスである必要があります 。