Ingressクラスのサポート
Ingressクラスとは?
Kubernetesクラスターには複数のIngressコントローラーが存在する可能性があり、特定のIngressリソースをIngressコントローラーに関連付ける方法が必要です。
Ingressリソース定義で
ingressClassNameを使用することで、Ingressリソースを処理するIngressコントローラーを指定できます。
ネットスケーラー イングレス コントローラー と イングレス クラス
NetScaler Ingress Controllerは、
spec.ingressClassNameを持つ複数のIngressリソースを受け入れることをサポートしています。各Ingressリソースは1つのingress.classのみに関連付けることができます。ただし、Ingress Controllerは異なるクラスからの様々なIngressリソースを処理する必要がある場合があります。
YAMLファイルの
specセクションにある--ingress-classes引数を使用して、Ingress Controllerを複数のIngressクラスに関連付けることができます。
Ingress Controllerに対して
ingress-classesが指定されていない場合、IngressオブジェクトにingressClassNameが存在するかどうかにかかわらず、すべてのIngressリソースを受け入れます。
ingress-classesが指定されている場合、Ingress ControllerはingressClassNameに一致するIngressリソースのみを受け入れます。この場合、Ingressコントローラーはingress.classのないIngressリソースを処理しません。
注: Ingressクラス名は大文字と小文字を区別しません。
Ingressクラスを含むYAML設定の例
以下は、
ingress-classesをIngress Controllerに関連付けるためのサンプル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
以下は、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:
name: web-ingress
spec:
ingressClassName: my-custom-class
Ingress 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
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
NetScaler Ingress Controllerは、Ingressを照合するために以下のルールを使用します。
-
NetScaler Ingress Controllerが
--ingress-classes引数を指定せずに起動された場合:-
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に一致します。
-
-
-
NetScaler Ingress Controllerが
--ingress-classes引数を使用して1つ以上のIngressクラスを設定して起動された場合。-
Kubernetesのバージョンが1.19未満の場合(IngressClass V1リソースがサポートされています)
-
設定されたIngressクラスと一致するIngressクラスアノテーション
kubernetes.io/ingress.classを持つ任意のIngressに一致します。
-
-
Kubernetesのバージョンが1.19以上の場合(IngressClass V1リソースがサポートされています)。
-
設定されたイングレスクラスとイングレスクラスアノテーション
kubernetes.io/ingress.classが一致するすべてのイングレスに一致します。このアノテーションは非推奨ですが、下位互換性をサポートするためにspec.IngressClassNameフィールドよりも優先度が高くなります。 -
次の属性を持つ
v1.IngressClassリソースが存在する場合、任意のイングレスオブジェクトに一致します。-
リソースの名前が
--ingress-classes引数の値と一致します。 -
リソースの
spec.controllerフィールドがcitrix.com/ingress-controllerとして設定されています。 -
リソースの名前がIngressオブジェクトの
spec.ingressClassNameフィールドと一致します。
-
-
spec.ingressClassNameフィールドが設定されておらず、かつ次の属性を持つv1.IngressClassリソースが存在する場合、任意のイングレスオブジェクトに一致します。-
リソースの名前が
--ingress-classes引数の値と一致します。 -
リソースの
spec.controllerフィールドがcitrix.com/ingress-controllerとして設定されています。 -
リソースは
ingressclass.kubernetes.io/is-default-classアノテーションを使用してデフォルトクラスとして構成されます。詳細については、Kubernetes ドキュメント を参照してください。
-
-
-
注:
-
アノテーションと
spec.ingressClassNameの両方が定義されている場合、アノテーションはspec.ingressClassNameよりも前に照合されます。アノテーションが一致しない場合、spec.ingressClassNameフィールドの照合操作は実行されません。 -
Helm チャートを使用して NetScaler Ingress Controller をインストールする場合、
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 を指定します。
注:
Helmデプロイの場合、
update-ingress-status に対応するHelmチャートのパラメータは updateIngressStatus であり、true に設定する必要があります。
この機能は、スタンドアロンおよびサイドカーNSICデプロイメントの両方でサポートされています。サイドカーとしてデプロイされたNSICの場合、この機能はNSICバージョン2.2.10以降でサポートされます。
サイドカーデプロイメントのIngressステータス更新
Kubernetesでは、Ingressは複数のアプリケーションを外部に公開するための単一のエントリポイントとして使用できます。Ingressには、Ingressの作成が成功した後に更新される
Address (Status.LoadBalancer.IP) フィールドがあります。このフィールドは、Kubernetesアプリケーションに到達できるパブリックIPアドレスまたはホスト名で更新されます。クラウドデプロイメントでは、このフィールドはクラウドロードバランサーのIPアドレスまたはホスト名であることもあります。
クラウドデプロイメントでは、NetScaler CPXはIngressコントローラーとともに、
type LoadBalancer タイプのサービスを使用して公開され、これによりクラウドロードバランサーが作成されます。クラウドロードバランサーは、NetScaler CPXをIngressコントローラーとともに公開します。したがって、NetScaler CPXで公開されるIngressリソースは、クラウドロードバランサーのパブリックIPアドレスまたはホスト名を使用して更新する必要があります。
この更新はオンプレミスデプロイメントにも適用されます。
-
デュアルティアIngressデプロイメントにおいて、NetScaler CPXがタイプ
LoadBalancerのサービスを使用してティア1 NetScaler VPX Ingressに公開されている場合、NetScaler CPXによって操作されるIngressリソースのAddress(Status.LoadBalancer.IP) フィールドはVIPアドレスで更新されます。 -
デュアルティアIngressデプロイメントにおいて、NetScaler CPXがタイプ
ClusterIPまたはNodePortのサービスを使用して公開されている場合、NetScaler CPXによって操作されるIngressリソースのAddress(Status.LoadBalancer.IP) フィールドは、CPXサービスのクラスターIPアドレスで更新されます。
Ingressステータス更新後のIngress出力例
以下は、Ingressステータス更新後のIngress出力例です。
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
sample-ingress sample.citrix.com sample.abc.somexampledomain.com 80 1d