入力方向 (Ingress)
NCP では、TLS 仕様の Ingress と、TLS 仕様でない Ingress 用に、レイヤー 7 のロード バランサが 1 つずつ作成されます。また、Ingress のスケーリングを処理するために、CRD (CustomResourceDefinitions) を作成することもできます。
次の点に注意してください。
- すべての Ingress が、単一の IP アドレスを取得します。
- Ingress リソースには、ncp.iniの[nsx_v3]セクションにあるexternal_ip_poolsオプションで指定された外部 IP アドレス プールから、IP アドレスが割り当てられます。ロード バランサは、この IP アドレスと HTTP および HTTPS ポート(80 と 443)上に公開されます。
- Ingress リソースには、ncp.iniの[nsx_v3]セクションにあるexternal_ip_pools_lbオプションで指定された外部 IP アドレス プールから、IP アドレスが割り当てられます。external_ip_pools_lbオプションがない場合は、external_ip_poolsで指定されたプールが使用されます。ロード バランサは、この IP アドレスと HTTP および HTTPS ポート(80 と 443)上に公開されます。
- 設定を変更して NCP を再起動することで、異なる IP アドレス プールに変更できます。
- TLS 用のデフォルト証明書を指定できます。証明書の生成および NCP ポッドへの証明書のマウントについては、以下を参照してください。
- TLS 仕様でない Ingress は、HTTP 仮想サーバ(ポート 80)上でホストされます。
- TLS 仕様の Ingress は、HTTPS 仮想サーバ(ポート 443)上でホストされます。ロード バランサは SSL サーバとして機能し、クライアントの SSL 接続を終了します。
- Ingress への TLS セクションの追加または削除はサポートされています。Ingress の仕様からtlsキーが削除されると、Ingress ルールは HTTPS 仮想サーバ(ポート 443)から HTTP 仮想サーバ(ポート 80)に転送されます。同様に、Ingress の仕様にtlsキーが追加されると、Ingress ルールは HTTP 仮想サーバ(ポート 80)から HTTPS 仮想サーバ(ポート 443)に転送されます。
- Ingress の定義で、単一クラスタに対するルールが重複している場合、最初のルールのみが適用されます。ルールが重複する他の Ingress にはエラーのアノテーションが追加されます。たとえば、同じhostとpathを使用して 2 つの Ingress を作成し、一方の Ingress が TLS でもう一方が TLS でなく、kubernetes.io/ingress.allow-httpがfalseの場合、2 つのルールが別々の仮想サーバ上に作成され、互いに競合することはありません。しかし、kubernetes.io/ingress.allow-httpがtrueの場合、後で適用される Ingress にはエラーのアノテーションが追加されます。詳細については、以下の「エラー」セクションを参照してください。
- 1 つのクラスタでサポートされるのは、デフォルトのバックエンドを持つ単一の Ingress のみです。どの Ingress ルールとも一致しないトラフィックは、デフォルトのバックエンドに転送されます。
- デフォルトのバックエンドを持つ Ingress が複数ある場合は、最初の 1 つのみが設定されます。その他の Ingress は、エラーと見なされます。詳細については、以下の「エラー」セクションを参照してください。
- (NCP 3.0.0 および 3.0.1)ルールは次の順序で適用されます。
- hostとpathの両方が指定され、正規表現に一致しないルール。
- hostとpathの両方が指定され、正規表現に一致するルール(最長の Ingresspathから順に)。
- hostまたはpathのいずれかが指定され、正規表現に一致しないルール。
- hostまたはpathのいずれかが指定され、正規表現に一致するルール(最長の Ingresspathから順に)。
- (NCP 3.0.2 以降)ルールは次の順序で適用されます。
- hostとpathの両方が指定されたルール。
- ExactpathTypeが指定されたルール。
- PrefixpathTypeが指定されたルール。
- RegexpathTypeが指定されたルール。
- hostまたはpathが指定されたルール。
- ExactpathTypeが指定されたルール。
- PrefixpathTypeが指定されたルール。
- RegexpathTypeが指定されたルール。
注: 複数のパスが要求と一致する場合、一致した最も長いパスが優先されます。pathTypeについて:- ImplementationSpecificは、Exactと同じように扱われます。
- pathTypeが異なる 2 つ一致パスが共存できます。
- Prefixタイプの場合、/fooは/foo/に一致しますが、/foo/barは/fooや /foobarに一致しません。/fooと一致させるには、入力方向ルールにExactパス/fooを追加します。
- これは、ポリシー モードを使用する場合に適用されます。TLS Ingress がデフォルトのバックエンドで作成されている場合は、次の理由から、HTTP と HTTPS の両方の要求に応答するようにデフォルトのバックエンドを設定することをおすすめします。
- TLS Ingress(Kubernetes/PKS の場合はクラスタ、Project Pacific の場合は同じネームスペース)に要求内のホストと一致するホストが指定されている場合、ロード バランサは TLS を終了し、デフォルトのバックエンド サーバに HTTP 要求を送信します。
- TLS Ingress(Kubernetes/PKS の場合はクラスタ、Project Pacific の場合は同じネームスペース)に要求内のホストと一致するホストが指定されていない場合、ロード バランサは再度暗号化を行い、バックエンド サーバに HTTPS 要求を送信します。
- (NCP 3.0.0 および 3.0.1)IngressClassリソースはサポートされません。
- (NCP 3.0.2 以降)IngressClassリソースがサポートされます。
- (NCP 3.0.0 および 3.0.1)pathType属性はサポートされません。
- (NCP 3.0.2 以降)pathType属性がサポートされます。
- (NCP 3.0.2 以降)JWT (JSON Web Token) クライアント認証がサポートされます。この機能を利用するには NSX-T Data Center 3.0.0 以降が必要です。
Kubernetes 1.18 以降では、
kubernetes.io/ingress.class
アノテーションが廃止され、IngressClass リソースに置き換えられています。IngressClass リソースで Ingress コントローラとして NSX-T を指定するには、コントローラのパラメータを k8s.io/nsx
に設定します。次はその例です。kind: IngressClass metadata: name: nsx-lb annotations: ingressclass.kubernetes.io/is-default-class: true spec: controller: k8s.io/nsx
サードパーティの Ingress コントローラを指定するには、コントローラのパラメータを
k8s.io/<controller name>
に設定します。次はその例です。kind: IngressClass metadata: name: nginx-lb annotations: ingressclass.kubernetes.io/is-default-class: false spec: controller: k8s.io/ingress-nginx
IngressClass をクラスタのデフォルトとして設定するには、
ingressclass.kubernetes.io/is-default-class
アノテーションを true
に設定します。上の例を参照してください。kubernetes.io/ingress.class
アノテーションと IngressClass リソースの両方は使用できません。機能のアノテーション
次の表に、NCP がサポートするアノテーションを示します。
アノテーション | 説明 | サポートされる値 | デフォルト値 | NCP バージョン |
---|---|---|---|---|
kubernetes.io/ingress.allow-http | HTTPS に加えて HTTP 要求を有効にします | true、false | true | 2.5 以降 |
ncp/use-regex | パス パターンの一致を有効にします | true、false | false | 2.5.1 以降 |
ingress.kubernetes.io/rewrite-target | 受信した要求のパスを書き換えます |
| デフォルト値はありません | [サポートされる値] 列を参照 |
ncp/http-redirect | HTTP 要求を HTTPS にリダイレクトします | true、false | false | 2.5.1 以降 |
kubernetes.io/ingress.class | この Ingress を担う入力方向コントローラを示します | nsx、nginx など | nsx | 2.5 以降 |
nsx/loadbalancer | 専用のロード バランサに Ingress を配置します | LoadBalancer CRD の名前 | デフォルト値はありません | 2.5.1 以降 |
ncp/whitelist-source-range | 要求の送信元 IP によって Ingress のアクセスを制限します。 | CIDR、IP アドレス、または IP 範囲のカンマ区切りのリスト。 | デフォルト値はありません | 3.0.0 以降 |
ncp/ssl-mode | Ingress のすべてのルールに SSL モードを選択します。 | offload、reencrypt、passthrough | offload | 3.0.1 以降 |
ncp/jwt-alg | JWT 署名の検証に使用されるアルゴリズムを決定します。ncp/jwt-secret を設定した場合、JWT クライアントの認証が有効になります。 | HS256、RS256 | デフォルト値はありません | 3.0.2 以降 |
ncp/jwt-secret | 署名の検証に使用する JWT シークレットまたはパブリック キーを含む Kubernetes シークレットの名前を指定します。ncp/jwt-alg を設定した場合、JWT クライアントの認証が有効になります。 | Kubernetes シークレットの名前 | デフォルト値はありません | 3.0.2 以降 |
ncp/jwt-token | HTTP 要求で JWT を検索する追加の場所。 | _arg_<param_name>、_cookie_<cookie_name> | デフォルト値はありません | 3.0.2 以降 |
ncp/jwt-realm | 認証に失敗した場合に 401 で返される Realm ヘッダーを指定します。 | レルムを表す文字列 | 入力方向ルールのホスト名 | 3.0.2 以降 |
ncp/jwt-preserve | JWT を保持し、認証の成功後にバックエンドに渡すオプション。 | true、false | true | 3.0.2 以降 |
アノテーションの詳細:
- パスの Regex(正規表現)一致
- NCP 2.5.0 以前の場合NCP 2.5.0 以前では、正規表現文字「.」および「*」を使用すると、すべてのサブパスの一致が自動的に有効になります。たとえば、パス/coffee/.*は、/coffee/、/coffee/a、および/coffee/bのように後に 0 または 1 文字以上の文字が続く/coffee/に一致しますが、/coffee、/coffeecup、または/coffeecup/aには一致しません。Ingress の仕様の例:kind: Ingress metadata: name: cafe-ingress spec: rules: - http: paths: - path: /coffee/.* #Matches /coffee/, /coffee/a but NOT /coffee, /coffeecup, etc. backend: serviceName: coffee-svc servicePort: 80
- NCP 2.5.1 以降の場合アノテーションncp/use-regexを使用して、Ingresspath(hostではない)パラメータの正規表現一致を有効または無効にできます。falseに設定されている場合は、equals一致を使用してパスの完全一致が実行されます。trueに設定した場合、文字列開始文字 (^) と文字列終了文字 ($) をパスに追加することによって、正規表現の一致が実行されます。これにより、要求 URI 全体がパターンに一致するようになります。OR演算子 (|) を使用する場合は、常に括弧で範囲を指定して、^ と $ がすべてのオペランドに適用されるようにします。例:path: /(tea|coffee|milk)Ingress の仕様の例:kind: Ingress metadata: name: cafe-ingress annotations: kubernetes.io/ingress.class: "nsx" ncp/use-regex: "true" spec: rules: - host: cafe.example.com http: paths: - path: /tea/.* backend: serviceName: tea-svc servicePort: 80
- NCP を 2.5.1 以降にアップグレードする前に Ingress を更新するこれは、Ingress が文字「.」および「*」を使用するすべてのサブパス一致を必要とする場合にのみ必要です。
- アノテーションncp/use-regex: trueを含めるように Ingress を更新します。
- すべてのサブパス一致では、/coffee/*や/*などのパスがある場合はそれらのパスを/coffee/.*および/.*に変更します。/coffee/.*は/coffee/、/coffee/a、/coffee/b、/coffee/a/bなどと一致します。/.*は/coffee、/tea、/coffee/aなどと一致します。パスを省略すると、path: /.*と同じ動作が生成されます。
- アノテーションingress.kubernetes.io/rewrite-targetの例:kind: Ingress metadata: name: cafe-ingress annotations: ingress.kubernetes.io/rewrite-target: / spec: rules: - host: cafe.example.com http: paths: - path: /tea backend: serviceName: tea-svc servicePort: 80 - path: /coffee backend: serviceName: coffee-svc servicePort: 80パス「/tea」および「/coffee」は、バックエンド サービスへの URL 送信前に「/」に書き換えられます。NCP 2.5.1 および NSX-T 2.5.1 以降では、正規表現を使用してpathが指定されている場合、キャプチャされたグループは、$1、$2 などの番号付きプレースホルダの形式で保存されます。これらのプレースホルダは、ingress.kubernetes.io/rewrite-targetアノテーションのパラメータとして使用できます。名前付きキャプチャ グループと名前付きプレースホルダはサポートされていません。次はその例です。kind: Ingress metadata: name: cafe-ingress annotations: kubernetes.io/ingress.class: "nsx" ncp/use-regex: "true" #/tea/cup will be rewritten to /cup before sending request to endpoint ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - host: cafe.example.com http: paths: - path: /tea/(.*) backend: serviceName: tea-svc servicePort: 80
- アノテーションkubernetes.io/ingress.allow-httpについて:
- アノテーションがfalseに設定されている場合は、HTTPS 仮想サーバのルールが作成されます。
- アノテーションがtrueに設定されているか、存在しない場合は、HTTP と HTTPS 仮想サーバの両方のルールが作成されます。Ingress の仕様に TLS セクションがある場合のみ、HTTPS ルールが作成されます。
- アノテーションncp/http-redirectについて:
- アノテーションがfalseに設定されている場合、HTTP 仮想サーバへの受信 HTTP トラフィック(ポート 80)は HTTPS 仮想サーバにリダイレクトされません。
- アノテーションがtrueに設定されている場合、HTTP 仮想サーバへの受信 HTTP トラフィック(ポート 80)は HTTPS 仮想サーバ(ポート 443)にリダイレクトされます。
この注釈は、TLS セクションが存在する場合にのみ有効です。このアノテーションはkubernetes.io/ingress.allow-httpよりも優先されます。trueに設定すると、kubernetes.io/ingress.allow-httpの設定に関係なく、一致する HTTP トラフィックが HTTPS に直接送信されます。 - アノテーションkubernetes.io/ingress.classについて:
- 値がnsxの場合、この Ingress は NCP によって処理されます。他の値が指定されている場合、Ingress は NCP によって無視されます。詳細については、サードパーティの入力方向コントローラを参照してください。
- アノテーションnsx/loadbalancerに関する詳細は、Ingress のスケーリングを処理する LoadBalancer CRDを参照してください。
- アノテーションncp/whitelist-source-rangeについて:
- 設定すると、送信元 IP アドレスがこの注釈に含まれている場合にのみ、受信要求が受け入れられます。それ以外の場合は、トラフィックがドロップされます。
- CIDR、IP アドレス、IP 範囲の組み合わせを指定できます。たとえば、1.1.1.1/24, 2.2.2.2, 3.3.3.3-4.4.4.4 と指定できます。
- YAML の例:kind: Ingress metadata: name: cafe-ingress annotations: kubernetes.io/ingress.class: "nsx" ncp/whitelist-source-range: "192.168.128.0/17, 192.168.64.0-192.168.64.255, 192.168.16.32" spec: tls: - hosts: - cafe.example.com rules: - host: cafe.example.com http: paths: - path: /tea backend: serviceName: tea-svc servicePort: 80
- アノテーションncp/ssl-modeについて:
- この注釈は、Ingress のすべてのルールに適用されます。ロード バランサは、これらのルールに対して選択された SSL モードで動作します。注:ncp/ssl-modeがreencryptまたはpassthroughに設定されている場合は、kubernetes.io/ingress.allow-httpをFalseに設定する必要があります。ingress.kubernetes.io/rewrite-target、ncp/use-regex、またはncp/whitelist-source-range注釈が設定されていない場合、この注釈にpassthroughを設定することはできません。
- JWT クライアント認証について:
- 入力方向のすべてのルールで JWT クライアント認証を有効にするには、ncp/jwt-algとncp/jwt-secretの両方に有効な値を設定する必要があります。有効にすると、有効な JSON Web Token がある場合にのみ、着信 HTTP トラフィックがバックエンドに渡されます。それ以外の場合は、401 ステータスでトラフィックが拒否されます。
- この機能は次の注釈と互換性がありません。
- kubernetes.io/ingress.allow-http: true
- ncp/http-redirect: true
- ncp/ssl-mode: passthrough
- ncp/jwt-alg:
- サポートされている対称アルゴリズム:HS256
- サポートされている非対称アルゴリズム:RS256
- ncp/jwt-secret:
- 入力方向と同じ名前空間で、この注釈に指定された名前の Kubernetes シークレットに対称キーまたはパブリック証明書を構成する必要があります。
- 対称アルゴリズムの場合、シークレットをjwt.keyフィールドに保存する必要があります。
- 非対称アルゴリズムの場合は、パブリック証明書をtls.crtフィールドに保存する必要があります。
- 対称シークレットまたはパブリック証明書が上記の場所に保存されていない場合、またはシークレットに保存されているデータが無効な場合、JWT クライアント認証は無効になります。
- ncp/jwt-token:
- この注釈では 1 つのアイテムのみを構成できます。
- _arg_<param_name>:JWT が URI パラメータとして渡された場合。JWT を含むパラメータ名を指定します。
- _cookie_<cookie_name>:JWT が Cookie として渡された場合。JWT を含む Cookie 名を指定します。
エラー
Ingress リソースにエラーのアノテーションが追加されます。エラー キーは
ncp/error.loadbalancer
で、警告キーは ncp/warning.loadbalancer
です。想定されるエラーおよび警告は次のとおりです。 - ncp/error.loadbalancer:DEFAULT_BACKEND_IN_USEこのエラーは、デフォルトのバックエンドがある Ingress があることを示しています。Ingress は非アクティブになります。このエラーは、(1) この Ingress が HTTP 用であり、デフォルトのバックエンドが使用されている HTTP の別の Ingress が存在する場合、(2) この Ingress が HTTPS 用で、デフォルトのバックエンドが使用されている HTTPS の別の Ingress が存在する場合、または (3) この Ingress が HTTP および HTTPS 用で、デフォルトのバックエンドが使用されている HTTP および HTTPS の別の Ingress が存在する場合に発生します。エラーを修正するには、Ingress を削除して適切な仕様で再作成します。
- ncp/warning.loadbalancer:SECRET_NOT_FOUNDこのエラーは、入力方向に指定されたシークレットが存在しないことを表します。また、ncp/jwt-algとncp/jwt-secretに注釈が付いている場合は、そのシークレットが入力方向と同じ名前空間に存在しないことを表します。Ingress は、部分的にアクティブになります。エラーを修正するには、不足している Secret を作成します。アノテーションに警告がある場合、Ingress リソースのライフ サイクルでは消去されません。
- ncp/warning.loadbalancer:INVALID_INGRESSこのエラーは、次の条件のいずれかが True であることを示します。Ingress は非アクティブになります。エラーを修正するには、Ingress を削除して適切な仕様で再作成します。
- Ingress ルールが、同じ Kubernetes クラスタ内の別の Ingress ルールと競合します。競合が決定されるのは、一致戦略が同じ、つまりncp/use-regexアノテーション値が同じ Ingress の場合のみです。
- kubernetes.io/ingress.allow-httpアノテーションはfalseに設定され、Ingress には TLS セクションが設定されません。
- ncp/http-redirectアノテーションはtrueに設定され、Ingress には TLS セクションが設定されません。
- Ingress ルールにはhostおよびpathが指定されていません。このような Ingress ルールには Ingress のデフォルトのバックエンドと同じ機能があります。代わりに Ingress のデフォルトのバックエンドを使用します。
- 入力方向の JWL 注釈が正しく処理できません。次はその例です。
- ncp/jwt-algまたはncp/jwt-secretのいずれかが見つかりません。
- ncp/jwt-algが、サポートされていないアルゴリズムで構成されています。
- ncp/jwt-algとncp/jwt-secretに HTTP を有効にする他の注釈が構成されているか、SSL パススルーが構成されています。