OCI Native Ingress Controllerの構成

OCIネイティブ・イングレス・コントローラを構成およびカスタマイズして、受信トラフィックをロード・バランシングし、Kubernetesクラスタ内のワーカー・ノードで実行されているサービス・ポッドにルーティングする方法をご紹介します。

OCIネイティブ・イングレス・コントローラ(スタンドアロン・プログラムまたはクラスタ・アドオンとして)をインストールし、それを使用するために必要なKubernetesイングレス関連リソースを作成した場合は、次の方法でOCIネイティブ・イングレス・コントローラを構成できます:

OCIネイティブ・イングレス・コントローラのルート・ルールの指定

OCIネイティブ・イングレス・コントローラ(スタンドアロン・プログラムまたはクラスタ・アドオンとしてインストール)によって作成されたOCIロード・バランサが受信リクエストをルーティングする方法を指定するには、Ingressマニフェストでルート・ルールを指定します。

ホストに基づくリクエストのルーティング

リクエストのホスト・ヘッダー(リクエストが最初に送信されたホスト)のドメイン名に基づいて受信リクエストをルーティングするように、OCIネイティブ・イングレス・コントローラを構成できます。

ホストに基づいて特定のバックエンド・サービスおよびポートにリクエストをルーティングするには、Ingressマニフェストにルート・ルールを作成します。ホストがルート・ルールと一致する場合、OCIネイティブ・イングレス・コントローラは、関連付けられたバックエンド・サービスおよびポートにリクエストをルーティングします。

たとえば、http://foo.bar.comに最初に送信されたリクエストを、ポート80のServiceAという名前のバックエンド・サービスにルーティングする次のルールを定義できます。最初にhttp://foo.bar.comに送信されたすべての受信トラフィックは、ポート80でServiceAにルーティングされます。

kind: Ingress
...
spec:
  rules:
  - host: "foo.bar.com"
    http:
      paths:
        - pathType: Prefix
          path: /
          backend:
            serviceName: ServiceA
            servicePort: 80

パスに基づいてリクエストを異なるバックエンド・サービスにルーティングします

リクエストが最初に送信されたパス内の要素に基づいて、受信リクエストを異なるバックエンド・サービスにルーティングするようにOCIネイティブ・イングレス・コントローラを構成できます。

パスに基づいて特定のバックエンド・サービスおよびポートにリクエストをルーティングするには、Ingressマニフェストにルート・ルールを作成します。パスがルート・ルールと一致する場合、OCIネイティブ・イングレス・コントローラは、関連付けられたバックエンド・サービスおよびポートにリクエストをルーティングします。同じルールに複数のパスを指定して、リクエストを異なるバックエンドにルーティングできます。

たとえば、リクエストの元の送信先パスに基づいてリクエストをルーティングする次のルールを定義できます。

  • パスが/app1で始まる場合、OCIネイティブ・イングレス・コントローラは、リクエストをポート80のServiceAという名前のバックエンド・サービスにルーティングします。
  • パスが/app2で始まる場合、OCIネイティブ・イングレス・コントローラは、リクエストをポート443のServiceBという名前のバックエンド・サービスにルーティングします。

ルールはホストを指定しないため、ルールはすべての受信トラフィックに適用されます。

kind: Ingress
...
spec:
  rules:
    - http:
      paths:
        - pathType: Prefix
          path: /app1
          backend:
            serviceName: ServiceA
            servicePort: 80
        - pathType: Prefix
          path: /app2
          backend:
            serviceName: ServiceB
            servicePort: 443

ホストおよびパスに基づくリクエストのルーティング

OCIネイティブ・イングレス・コントローラを構成して、リクエストのホスト・ヘッダーのドメイン名(リクエストが最初に送信されたホスト)と元のリクエストが送信されたパスの要素の両方に基づいて、受信リクエストをルーティングできます。

ホストおよびパスに基づいてリクエストを特定のバックエンド・サービスおよびポートにルーティングするには、Ingressマニフェストにルート・ルールを作成します。ホストとパスがルート・ルールと一致する場合、OCIネイティブ・イングレス・コントローラは、リクエストを関連するバックエンド・サービスおよびポートにルーティングします。

たとえば、http://foo.bar.com/app1に最初に送信されたリクエストを、ポート80のfooという名前のバックエンド・サービスにルーティングする次のルールを定義できます。

kind: Ingress
...
spec:
  rules:
  - host: "foo.bar.com"
    http:
      paths:
        - pathType: Prefix
          path: /app1
          backend:
            serviceName: foo
            servicePort: 80

デフォルト・バックエンドへのリクエストのルーティング

OCIネイティブ・イングレス・コントローラを構成して、受信リクエストをデフォルト・バックエンドにルーティングできます。どのルート・ルールにも一致しないリクエストを処理するようにデフォルト・バックエンドを構成できます。

たとえば、次のdefaultBackendを定義して、Ingressマニフェストの他のルールと一致しないリクエストを、ポート8080のServiceCという名前のバックエンド・サービスにルーティングできます。

Ingressマニフェストで他のルールを指定しない場合は、defaultBackendを指定する必要があります。

kind: Ingress
...
spec:
  rules:
    - http:
      paths:
        - pathType: Prefix
          path: /app1
          backend:
            serviceName: ServiceA
            servicePort: 80
        - pathType: Prefix
          path: /app2
          backend:
            serviceName: ServiceB
            servicePort: 443
  defaultBackend:
    service:
      name: ServiceC
      port:
        number: 8080

注釈を使用したOCIネイティブ・イングレス・コントローラの動作のカスタマイズ

IngressClassまたはIngressリソース・マニフェストに注釈を追加して、OCIネイティブ・イングレス・コントローラの動作をカスタマイズできます(スタンドアロン・プログラムまたはクラスタ・アドオンのいずれかとしてインストールされます)。

注釈を使用した一般的な動作のカスタマイズ

IngressClassまたはIngressリソース・マニフェストに注釈を追加して、OCIネイティブ・イングレス・コントローラの一般的な動作をカスタマイズできます。

Annotation 説明 このリソース・マニフェストへの注釈の追加
oci-native-ingress.oraclecloud.com/id 新しいOCIロード・バランサを作成するのではなく、使用する既存のOCIロード・バランサのOCID。

既存のロード・バランサを指定した場合、OCIネイティブ・イングレス・コントローラはロード・バランサを管理し、必要に応じてそのプロパティを更新して、IngressClassParameters、IngressClassおよびイングレス・リソース・マニフェストの値と一致させます。

IngressClass oci-native-ingress.oraclecloud.com/id: ocid1.loadbalancer.oc1.iad.aaaaaaaan___u7a
oci-native-ingress.oraclecloud.com/defined-tags ロード・バランサに適用する1つ以上の定義済タグ(JSON形式)。

定義済タグのロード・バランサへの適用を参照してください。

IngressClass oci-native-ingress.oraclecloud.com/defined-tags: '{"tag-namespace-1": {"key1": "value1", "key2": "value2"}, "tag-namespace-2": {"key1": "value1"}}'
oci-native-ingress.oraclecloud.com/freeform-tags ロード・バランサに適用する1つ以上のフリーフォーム・タグ(JSON形式)。

「ロード・バランサへのフリーフォーム・タグの適用」を参照してください。

IngressClass oci-native-ingress.oraclecloud.com/freeform-tags: '{"key1": "value1", "key2": "value2"}'
oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true" IngressClassが削除された場合にロード・バランサを保持するかどうか。

trueに設定すると、ロード・バランサは保持されます。指定しない場合、falseがデフォルトであり、IngressClassが削除されるとロード・バランサが削除されます。

「IngressClass削除後のロード・バランサの保存」を参照してください。

IngressClass oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true"
oci-native-ingress.oraclecloud.com/network-security-group-ids ロード・バランサを追加するネットワーク・セキュリティ・グループ(NSG)の1つ以上のOCIDsをカンマ区切りリストで指定します。指定しない場合、ロード・バランサはNSGに追加されません。 IngressClass oci-native-ingress.oraclecloud.com/network-security-group-ids: 'ocid1.networksecuritygroup.oc1.iad.agx___kby, ocid1.networksecuritygroup.oc1.iad.ahr___mlo'
oci-native-ingress.oraclecloud.com/waf-policy-ocid 既存のWebアプリケーション・ファイアウォール(WAF)ポリシーのOCID。Web Application Firewallポリシーを参照してください。 IngressClass oci-native-ingress.oraclecloud.com/waf-policy-ocid: ocid1.webappfirewallpolicy.oc1.iad.ama___aqq
oci-native-ingress.oraclecloud.com/protocol ロード・バランサのリスナーに使用するプロトコル。HTTP2またはTCPのいずれか。

(プロトコルとしてHTTP2を指定する場合は、TLS構成リスナーが必要です。)

Ingress oci-native-ingress.oraclecloud.com/protocol: "HTTP2"
oci-native-ingress.oraclecloud.com/backend-tls-enabled バックエンド・サービス・ポッドがTLSリクエストを受信できるかどうか。

falseに設定すると、TLSリクエストはロード・バランサ・リスナーで終了し、バックエンド・セットとバックエンド間のリクエストはプレーン・テキストで交換されます。

Ingress oci-native-ingress.oraclecloud.com/backend-tls-enabled: "false"
oci-native-ingress.oraclecloud.com/http-listener-port

サービス・ポートごとにリスナー・ポートを作成するのではなく、このイングレス内のすべてのHTTPパスに対して単一のリスナー・ポートを作成します。ルーティング・ポリシーはそれに応じて構成されます。

Ingress oci-native-ingress.oraclecloud.com/http-listener-port: "100"
oci-native-ingress.oraclecloud.com/https-listener-port サービス・ポートごとにリスナー・ポートを作成するのではなく、このイングレス下のすべてのHTTPSパスに対して単一のリスナー・ポートを作成します。ルーティング・ポリシーはそれに応じて構成されます。 Ingress oci-native-ingress.oraclecloud.com/https-listener-port: "500"
oci-native-ingress.oraclecloud.com/policy トラフィック分散のロード・バランサ・バックエンド・セットで使用されるポリシー。 Ingress oci-native-ingress.oraclecloud.com/policy: "ROUND_ROBIN"

注釈を使用したヘルス・チェック動作のカスタマイズ

Ingressリソース・マニフェストに注釈を追加して、OCIネイティブ・イングレス・コントローラによって作成されたロード・バランサによって実行されるヘルス・チェックをカスタマイズできます。ロード・バランサのヘルス・チェックの詳細は、ロード・バランサのヘルス・チェックを参照してください。

Annotation 説明 このリソース・マニフェストへの注釈の追加
oci-native-ingress.oraclecloud.com/healthcheck-protocol ロード・バランサ・バックエンド・セットのヘルス・チェックに使用するプロトコル。 Ingress oci-native-ingress.oraclecloud.com/healthcheck-protocol: "HTTP"
oci-native-ingress.oraclecloud.com/healthcheck-port ロード・バランサのバックエンド・セットのヘルス・チェックに使用するポート。 Ingress oci-native-ingress.oraclecloud.com/healthcheck-port: "80"
oci-native-ingress.oraclecloud.com/healthcheck-path ロード・バランサのバックエンド・セットのヘルス・チェックに使用するパス。 Ingress oci-native-ingress.oraclecloud.com/healthcheck-path: "/test"
oci-native-ingress.oraclecloud.com/healthcheck-interval-milliseconds ロード・バランサ・バックエンド・セットのヘルス・チェック間の間隔。 Ingress oci-native-ingress.oraclecloud.com/healthcheck-interval-milliseconds: "1000"
oci-native-ingress.oraclecloud.com/healthcheck-timeout-milliseconds ロード・バランサのバックエンド・セットのヘルス・チェックが失敗したとみなされる期間。 Ingress oci-native-ingress.oraclecloud.com/healthcheck-timeout-milliseconds: "750"
oci-native-ingress.oraclecloud.com/healthcheck-retries ロード・バランサのバックエンド・セットのヘルス・チェックが失敗したとみなされる再試行回数。 Ingress oci-native-ingress.oraclecloud.com/healthcheck-retries: "5"
oci-native-ingress.oraclecloud.com/healthcheck-return-code ヘルス・チェックに応答してロード・バランサ・バックエンド・セットが返す必要があるステータス・コードが正常とみなされます。 Ingress oci-native-ingress.oraclecloud.com/healthcheck-return-code: "200"
oci-native-ingress.oraclecloud.com/healthcheck-response-regex ロード・バランサ・バックエンド・セットからレスポンス本文を解析するための正規表現。正規表現の値(*、/など)または空の値を指定できます。 Ingress oci-native-ingress.oraclecloud.com/healthcheck-response-regex: "*"
oci-native-ingress.oraclecloud.com/healthcheck-force-plaintext SSLを使用せずにロード・バランサ・バックエンドにヘルス・チェックを送信するかどうか(HTTPのみ)。指定しない場合、falseがデフォルトです。 Ingress oci-native-ingress.oraclecloud.com/healthcheck-force-plaintext: "true"

ポッド準備ゲートの設定

ポッド準備ゲートは、ポッドがトラフィックを受信する準備ができていることを示す追加の条件です。ポッド・レディネス・ゲートを使用すると、複雑なカスタム・レディネス・チェックを実装でき、ローリング・デプロイメント中にゼロ・ダウンタイムを実現できます。詳細は、Kubernetesドキュメントのポッド・レディネス詳細を参照してください。

OCIネイティブ・イングレス・コントローラを(スタンドアロン・プログラムとして、またはクラスタ・アドオンとして)ネットワーク・タイプとしてVCNネイティブ・ポッド・ネットワーキングを持つクラスタで使用する場合、OCIネイティブ・イングレス・コントローラが、特定のネームスペースで作成されたすべてのポッドのポッド仕様にポッド・レディネス・ゲートを注入することを指定することができます。クラスタにネットワーク・タイプとしてFlannel overayがある場合、OCIネイティブ・イングレス・コントローラを使用してポッド準備ゲートをポッド仕様に注入することはできません。

次のように入力して、OCIネイティブ・イングレス・コントローラが、特定のネームスペースで作成されたすべてのポッドのポッド仕様にポッド準備ゲートを注入することを指定します:

kubectl label ns <namespace> podreadiness.ingress.oraclecloud.com/pod-readiness-gate-inject=enabled

OCIネイティブ・イングレス・コントローラは、ネームスペースで作成されたすべてのポッドのポッド仕様に条件を注入します。例:


kind: Pod
...
    spec:
      readinessGates:
      - conditionType: podreadiness.ingress.oraclecloud.com/k8s_6b5b1b3a38
次のように入力して、ポッド準備ゲートのステータスを確認できます。
kubectl get pods -o wide -w
出力例:
NAME                                             READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
testecho-7cdcfff87f-b6xt4                        1/1     Running   0          35s   10.0.10.242   10.0.10.135   <none>           0/1
testecho-7cdcfff87f-b6xt4                        1/1     Running   0          72s   10.0.10.242   10.0.10.135   <none>           1/1

TCPリスナーの設定

OCIネイティブ・イングレス・コントローラ(スタンドアロン・プログラムまたはクラスタ・アドオンとして)を使用して、ロード・バランサ・リスナーをTCPリスナーとして設定できます。各TCPリスナーは、トランスポート層7のルーティングを実行せずに、特定のポートで受信したTCPトラフィックを、Ingressリソース・マニフェストのそのポートに指定されたバックエンド・サービスに転送するだけです。

oci-native-ingress.oraclecloud.com/protocol注釈を設定して、OCIネイティブ・イングレス・コントローラが、Ingressリソース・マニフェストのルーティング・ルールに含まれる一意のポートごとにTCPリスナーを作成することを指定します。

OCIネイティブ・イングレス・コントローラがTCPリスナーを作成することを指定するには:

  1. .yamlファイルに新しいイングレス・リソースを定義します。イングレス・リソースの作成を参照してください。
  2. metadata:セクションで、annotations:要素を追加し、oci-native-ingress.oraclecloud.com/protocol注釈を次の形式でTCPに設定します。
    kind: Ingress
    metadata:
      name: <i-name>
      annotations:
        oci-native-ingress.oraclecloud.com/protocol: TCP
    spec:
    ...

    ここで、name: <i-name>はイングレス・リソースの名前を選択します。

    例:

    kind: Ingress
    metadata:
      name: ingress-pass-through
      annotations:
        oci-native-ingress.oraclecloud.com/protocol: TCP
    spec:
    ...
  3. Ingressリソース・マニフェストのrules:セクションで、TCPトラフィックを受信するリスナーごとにルールを追加します。
    • (推奨) paths.pathTypeImplementationSpecificに設定します。
    • paths.backend.service.nameをバックエンド・サービスの名前に設定します。
    • paths.backend.service.port.numberを、TCPトラフィックをリスニングするポート、およびTCPトラフィックを転送するポートに設定します。

    たとえば、ポート8080でリスニングしているTCPリスナーがTCPトラフィックをmy-first-svc:8080に転送し、ポート8081でリスニングしているTCPリスナーがTCPトラフィックをmy-second-svc:8081に転送する場合、次のようにIngressリソース・マニフェストを設定できます。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-pass-through
      annotations:
        oci-native-ingress.oraclecloud.com/protocol: TCP
    spec:
      rules:
        - http:
            paths:
              - pathType: ImplementationSpecific
                backend:
                  service:
                    name: my-first-svc
                    port:
                      number: 8080
        - http:
            paths:
              - pathType: ImplementationSpecific
                backend:
                  service:
                    name: my-second-svc
                    port:
                      number: 8081 
    
  4. kubectl create -f <filename>.yamlを入力してリソースを作成します

HTTPS/TLSリクエストのサポートの追加

OCIネイティブ・イングレス・コントローラ(スタンドアロン・プログラムまたはクラスタ・アドオンとして)を使用して、セキュアなHTTPS通信をサポートできます。OCIネイティブ・イングレス・コントローラを使用して、TLS (旧SSL)を使用して暗号化されたトラフィックを処理するようにOCIロード・バランサ・リスナーおよびバックエンド・セットを設定できます。

OCIネイティブ・イングレス・コントローラを使用してHTTPS通信をサポートする場合、次の2つのオプションがあります。

HTTPSトラフィックを処理する場合、OCIネイティブ・イングレス・コントローラによって作成されたOCIロード・バランサは、デフォルトでエンドツーエンドTLSを実装します。ロード・バランサは、証明書を使用してクライアントからTLSで暗号化されたリクエストを受け入れ、ルーティング・ルールを使用してリクエストを適切なバックエンド・セットに転送します。バックエンド・セットは、クラスタで実行されているバックエンドを使用して新しいTLS接続を作成します(CAバンドルを新しい接続の信頼権限として使用します)。

次の点に注意してください:

  • IngressClassリソースを削除すると、OCIネイティブ・イングレス・コントローラは、作成したロード・バランサを削除するか、oci-native-ingress.oraclecloud.com/id注釈で指定された既存のロード・バランサを削除します(oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true"を設定していない場合)。ただし、イングレス・コントローラでは、OCI証明書サービスで作成されたリソースは削除されません。そのような証明書サービス・リソースを削除する責任があります。特に、Ingressリソース・マニフェストでKubernetesシークレットを指定した場合は、OCIネイティブ・イングレス・コントローラが作成した証明書サービス・リソースを削除する必要があります。
  • タイプが「インポート済」のOCI証明書サービスから取得した証明書は、自動的にローテーションできません。証明書を自動的にローテーションする場合は、証明書サービスの内部CAによって証明書を発行するように指定することで、OCI証明書サービスで証明書を手動で取得します(証明書のタイプは内部CAによって発行されます)。内部CAによって発行されるタイプの証明書を自動的にローテーションするように構成できます。
  • Ingressリソース・マニフェストでKubernetesシークレットを指定する場合、OCIネイティブ・イングレス・コントローラが証明書サービスから取得する証明書のタイプはインポート済であるため、自動的にローテーションされないことに注意してください。このような証明書サービス証明書を手動でローテーションするには、まず新しいTLS公開キーと秘密キー・ペアと新しい証明書を使用して新しいKubernetesシークレットを作成します。次に、Ingressリソースを新しいシークレットの名前で更新します。OCIネイティブ・イングレス・コントローラは、証明書サービスから新しい証明書およびCAバンドルを取得し、リスナーおよびバックエンド・セットに関連付けます(以前の証明書およびCAバンドルを置き換えます)。
  • 1つのリスナーは1つの証明書にのみ関連付けることができます。したがって、各イングレス・リソースに同じバックエンド・サービス/ポートの組合せを指定するルールがあるが、イングレス・リソースで異なる証明書が使用されている複数のイングレス・リソースを作成しないでください。
  • デフォルトでは、OCIネイティブ・イングレス・コントローラによって作成されたOCIロード・バランサは、エンドツーエンドTLSを実装します。ロード・バランサはリスナーでTLSリクエストを終了し、バックエンド・セットとバックエンドの間に新しいTLS接続が確立されます。ただし、バックエンドがHTTPSサーバーを実行していないため、バックエンド・セットとバックエンド間の接続をプレーン・テキストにする場合は、oci-native-ingress.oraclecloud.com/backend-tls-enabled注釈を"false"に設定します。oci-native-ingress.oraclecloud.com/backend-tls-enabled注釈が"false"に設定されている場合、ロード・バランサはクライアントからの暗号化されたトラフィックを受け入れることができますが、ロード・バランサとバックエンド間のトラフィックは暗号化されません。

オプション1: OCIネイティブ・イングレス・コントローラは、Kubernetesシークレットを使用して証明書サービスから証明書を取得します

OCI証明書サービスから証明書を取得するようにOCIネイティブ・イングレス・コントローラを構成するには:

  1. TLSの公開キーと秘密キーのペア、および証明書を取得します。

    本番環境では、証明書署名リクエストを送信することで、選択した認証局からTLS証明書を取得します。証明書リクエスト・プロセス中に、公開キーおよび対応する秘密キーが生成されます。

    開発およびテスト環境では、自己署名証明書を作成し、OpenSSLなどのツールを使用して秘密キーを自分で生成できます。たとえば(OpenSSL 3.0以降を使用):

    1. 次のコマンドを入力して、公開キーと秘密キーのペアを生成します。

      openssl genrsa -out rootCA.key 4096
      openssl req -x509 -addext basicConstraints=critical,CA:TRUE -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt -subj /CN=RootCA
    2. 次のコマンドを入力して証明書を生成します。

      openssl genrsa -out server.key 4096
      openssl req -new -sha256 -key server.key -subj /C=US/ST=CA/O=MyOrg,Inc./CN=my.example.com -out server.csr
      openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256

    この例では:

    • rootCA.keyには、ルートCAのキー・ペアが含まれます。
    • rootCA.crtには、ルートCA証明書が含まれます。
    • server.keyには、サーバー証明書を生成するためのキー・ペアが含まれます。
    • server.csrには、サーバー証明書の証明書署名リクエストが含まれます。
    • server.crtには、生成されたサーバー証明書が含まれます。
  2. 次のいずれかの方法でKubernetesシークレット・リソースを作成します:
    • kubectl create secret genericコマンドを使用して、次のように入力します。

      kubectl create secret generic <k8s-secret-name> --type=kubernetes.io/tls --from-file=ca.crt=<path-and-filename>.crt --from-file=tls.crt=<path-and-filename>.crt --from-file=tls.key=<path-and-filename>.key

      ここでは:

      • <k8s-secret-name>は、Kubernetesシークレットの名前を選択します
      • --from-file=ca.crt=<path-and-filename>.crtは、ルートCA証明書を含むファイルへのパスを指定します。たとえば、--from-file=ca.crt=rootCA.crtです。
      • --from-file=tls.crt=<path-and-filename>.crtは、生成されたサーバー証明書を含むファイルへのパスを指定します。たとえば、--from-file=tls.crt=server.crtです。
      • --from-file=tls.key=<path-and-filename>.keyは、生成された秘密キーを含むファイルへのパスを指定します。たとえば、--from-file=tls.key=server.keyです。

      例:

      kubectl create secret generic example-tls-secret --type=kubernetes.io/tls --from-file=ca.crt=rootCA.crt --from-file=tls.crt=server.crt --from-file=tls.key=server.key
    • Secretリソース・マニフェスト・ファイルの使用:
      1. Kubernetesシークレットを.yamlファイルで次の形式で定義します:

        apiVersion: v1
        kind: Secret
        metadata:
          name: <k8s-secret-name>
        type: kubernetes.io/tls
        data:
          ca.crt: <base64-encoded-certificate-chain>
          tls.crt: <base64-encoded-server-certificate>
          tls.key: <base64-encoded-private-key>

        ここでは:

        • name: <k8s-secret-name>は、Kubernetesシークレット・リソースの名前を選択します。
        • ca.crt: <base64-encoded-certificate-chain>は、リーフ証明書から認証局に戻る証明書チェーンを形成する中間証明書を含むファイル(またはファイル)の内容です。ca.certは省略できます。ただし、証明書チェーン全体をtls.certの値として含める場合(この場合、生成されたサーバー証明書を含むファイルの内容で証明書チェーンを起動し、残りの証明書が続きます)。
        • tls.crt: <base64-encoded-server-certificate>は、生成されたサーバー証明書を含むファイルの内容です。
        • tls.key: <base64-encoded-private-key>は、生成された秘密キーを含むファイルの内容です。

        例:

        apiVersion: v1
        kind: Secret
        metadata:
          name: example-tls-secret
        type: kubernetes.io/tls
        data:
          ca.crt : MIIFGERTegcDFRTuSDGfghREdE______Jre
          tls.crt: MIIC2DCCAcCgAwIBAgIBATANBg______kqh
          tls.key: MIIEpgIBAAKCAQEA7yn3bRHQ5F______HMQ
      2. kubectl create -f <filename>.yamlを入力してシークレット・リソースを作成します

  3. KubernetesシークレットをIngressリソース・マニフェストに追加します:
    1. .yamlファイルに新しいイングレス・リソースを定義します。イングレス・リソースの作成を参照してください。
    2. マニフェストのspec:セクションで、HTTPSトラフィックを受信するホストとKubernetesシークレットの名前の両方を次の形式で指定するtls:要素を追加します:
      kind: Ingress
      ...
      spec:
        tls:
        - hosts:
            - <host-name>
          secretName: <k8s-secret-name>

      例:

      kind: Ingress
      ...
      spec:
        tls:
        - hosts:
            - my.example.com
          secretName: example-tls-secret
    3. マニフェストの rules:セクションで、HTTPSトラフィックを受信するホストのルールを追加し、HTTPSトラフィックを待機するポートとして443を指定します。

      例:

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: acme-tls-secret-ingress
      spec:
        tls:
        - hosts:
            - my.example.com
          secretName: example-tls-secret
        rules:
        - host: "my.example.com"
          http:
            paths:
            - pathType: Prefix
              path: "/TLSPath"
              backend:
                service:
                  name: tls-test
                  port:
                    number: 443
    4. kubectl create -f <filename>.yamlを入力してリソースを作成します

イングレス・リソースを作成すると、OCIネイティブ・イングレス・コントローラは、Kubernetesシークレットを使用してインポート済タイプの証明書と、OCI証明書サービスからCAバンドル(認証局バンドル)を取得します。OCIネイティブ・イングレス・コントローラは、証明書をリスナーに関連付け、CAバンドルをバックエンド・セットに関連付けます。

ポート443でリスニングしているリスナーが、指定されたホストへのHTTPSリクエストを受信すると、リスナーはTLS終了の証明書を使用します。次に、リスナーはルーティング・ルールを使用して、リクエストをバックエンド・セットに転送します。バックエンド・セットは、クラスタで実行されているバックエンドとの新しいTLS接続を作成します(CAバンドルを新しい接続の信頼権限として使用します)。

オプション2: 証明書サービスから証明書を取得します

OCI証明書サービスから取得した証明書を使用するようにOCIネイティブ・イングレス・コントローラを構成するには:

  1. 次のいずれかの方法で、OCI証明書サービスに証明書を作成します:
    • サード・パーティCAによって発行された証明書をインポートする(証明書のタイプは「インポート済」)
    • 証明書サービスのCAから内部的に証明書を発行することによって(証明書のタイプは Issued by internal CAになります)

    外部で管理する証明書を作成しないでください(タイプ「内部CAによって発行され、外部で管理されます」)。詳細は、証明書の作成を参照してください。

  2. 証明書のOCIDを書き留めます。
  3. 証明書のOCIDをIngressリソース・マニフェストに追加します:
    1. .yamlファイルに新しいイングレス・リソースを定義します。イングレス・リソースの作成を参照してください。
    2. metadata:セクションで、OCI証明書サービスで作成した証明書のOCIDを次の形式で指定するannotations:要素を追加します:
      kind: Ingress
      metadata:
        name: <i-name>
        annotations:
          oci-native-ingress.oraclecloud.com/certificate-ocid: <certificate-ocid>
      spec:
      ...

      ここでは:

      • name: <i-name>は、イングレス・リソースの名前を選択します。
      • oci-native-ingress.oraclecloud.com/certificate-ocid: <certificate-ocid>は、OCI証明書サービスで作成した証明書のOCIDです

      例:

      kind: Ingress
      metadata:
        name: acme-tls-certificate-ingress
        annotations:
          oci-native-ingress.oraclecloud.com/certificate-ocid: ocid1.certificate.oc1.iad.amaaaaaa______gabc
      spec:
      ...
    3. Ingressリソース・マニフェストのrules:セクションで、HTTPSトラフィックを受信するホストのルールを追加し、HTTPSトラフィックをリスニングするポートとして443を指定します。

      例:

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: acme-tls-certificate-ingress
        annotations:
          oci-native-ingress.oraclecloud.com/certificate-ocid: ocid1.certificate.oc1.iad.amaaaaaa______gabc
      spec:
        rules:
        - host: "my.example.com"
          http:
            paths:
            - pathType: Prefix
              path: "/TLSPath"
              backend:
                service:
                  name: tls-test
                  port:
                    number: 443
    4. kubectl create -f <filename>.yamlを入力してリソースを作成します

イングレス・リソースを作成するとどうなるかは、OCI証明書サービスで証明書を作成した方法によって異なります:

  • サード・パーティのCAによって発行された証明書をインポートして証明書を作成した場合、証明書のタイプは「インポート済」です。OCIネイティブ・イングレス・コントローラは、証明書をリスナーに関連付け、証明書チェーンからCAバンドルを作成し、CAバンドルをバックエンド・セットに関連付けます。「インポート済」タイプの証明書を自動的にローテーションするように構成することはできません。
  • 証明書サービスCAから証明書を内部的に発行して証明書を作成した場合、その証明書のタイプは Issued by internal CAです。OCIネイティブ・イングレス・コントローラは、証明書をリスナーに関連付け、CAのOCIDを取得し、そのOCIDをバックエンド・セットに関連付けます。「内部CAによって発行」タイプの証明書を自動的にローテーションするように構成できます。

ポート443でリスニングしているリスナーが、指定されたホストへのHTTPSリクエストを受信すると、リスナーはTLS終了の証明書を使用します。次に、リスナーはルーティング・ルールを使用して、リクエストをバックエンド・セットに転送します。バックエンド・セットは、クラスタで実行されているバックエンド(CAバンドルまたはそのOCIDで識別されるCAを新しい接続の信頼権限として使用)を使用して、新しいTLS接続を作成します。

HTTP/HTTPSリスナー・ポートの集計

OCIネイティブ・イングレス・コントローラ(スタンドアロン・プログラムまたはクラスタ・アドオンとして)を使用する場合、すべてのHTTPトラフィックを単一のリスナー・ポートに集約できます。同様に、すべてのHTTPSトラフィックを単一のポートに集約できます。

デフォルトでは、OCIネイティブ・イングレス・コントローラは、Ingressマニフェストで定義されているバックエンド・サービス・ポートごとにOCIロード・バランサ・リスナーを作成します。OCIネイティブ・イングレス・コントローラでは、リスナー・ポートごとにルーティング・ポリシーも作成されます。ただし、oci-native-ingress.oraclecloud.com/http-listener-port注釈またはoci-native-ingress.oraclecloud.com/https-listener-port注釈(あるいはその両方)を使用して、すべてのHTTPリクエストに対して単一のリスナーおよびルーティング・ポリシーを作成したり、すべてのHTTPSリクエストに対して単一のリスナーおよびルーティング・ポリシーを作成したりできます。

たとえば、次のように、4つのバックエンド・サービス(各サービスが異なるポートでリスニング)のルールを使用してイングレスを定義できます。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sample-ingress
spec:
  tls:
    - hosts:
        - "foo.bar.com3"
        - "foo.bar.com4"
      secretName: secret_name
  rules:
    - host: "foo.bar.com1"
      http:
        paths:
          - pathType: Prefix
            path: "/testecho1"
            backend:
              service:
                name: testecho1
                port:
                  number: 80
    - host: "foo.bar.com2"
      http:
        paths:
          - pathType: Prefix
            path: "/testecho2"
            backend:
              service:
                name: testecho2
                port:
                  number: 81
    - host: "foo.bar.com3"
      http:
        paths:
          - pathType: Prefix
            path: "/testecho3"
            backend:
              service:
                name: testecho3
                port:
                  number: 443
    - host: "foo.bar.com4"
      http:
        paths:
          - pathType: Prefix
            path: "/testecho4"
            backend:
              service:
                name: testecho4
                port:
                  number: 444 

この例では、Ingressマニフェストは4つのサービスを定義します。

  • testecho1、HTTPトラフィックのポート80でリスニング
  • testecho2、HTTPトラフィックのポート81でリスニング
  • testecho3、HTTPSトラフィックのポート443でリスニング
  • testecho4、HTTPSトラフィックのポート444でリスニング

デフォルトでは、OCIネイティブ・イングレス・コントローラによって次のものが作成されます。

  • ロード・バランサに4つのリスナー(ポート80および81でHTTPトラフィックをリスニングする2つのリスナーと、ポート443および444でHTTPSトラフィックをリスニングする2つのリスナー)。
  • 4つのルーティング・ポリシー(リスナー・ポートごとに1つ)。

管理を簡略化するために、次のように注釈を設定することで、HTTPトラフィックをリスニングする単一のリスナーと、HTTPSトラフィックをリスニングする単一のリスナーを持つことを決定できます。

oci-native-ingress.oraclecloud.com/http-listener-port: "100"
oci-native-ingress.oraclecloud.com/https-listener-port: "500"

注釈を次のように設定すると、OCIネイティブ・イングレス・コントローラによって次のものが作成されます。

  • ポート100でHTTPトラフィックをリスニングする単一のリスナー、およびポートtestecho1:80およびtestecho2:81でバックエンドのパスを持つポート100の単一のルーティング・ポリシー
  • ポート500でHTTPSトラフィックをリスニングする単一のリスナー、およびポートtestecho3:443およびtestecho4:444のバックエンドのパスを持つポート500の単一のルーティング・ポリシー

次の点に注意してください:

  • oci-native-ingress.oraclecloud.com/http-listener-port注釈とoci-native-ingress.oraclecloud.com/https-listener-port注釈は互いに独立して設定できるため、両方の注釈を設定する必要はありません。

  • Ingressリソース・マニフェストにoci-native-ingress.oraclecloud.com/certificate-ocidアノテーションが含まれている場合、OCIネイティブ・イングレス・コントローラでは、すべてのホストがTLS用に構成されているとみなされます。この場合、OCIネイティブ・イングレス・コントローラは次のようになります。

    • oci-native-ingress.oraclecloud.com/http-listener-port注釈を無視します(Ingressリソース・マニフェストに存在する場合)。
    • oci-native-ingress.oraclecloud.com/https-listener-port注釈(Ingressリソース・マニフェストに存在する場合)を適用して、すべてのトラフィックに対して単一のリスナーを作成します。
  • oci-native-ingress.oraclecloud.com/http-listener-portおよびoci-native-ingress.oraclecloud.com/https-listener-portアノテーションに関係なく、OCIネイティブ・イングレス・コントローラは、イングレス・リソース・マニフェストで定義されているバックエンド・サービスに必要な場合にのみ、HTTPリスナーまたはHTTPSリスナー(および対応するルーティング・ポリシー)を作成します。例:
    • HTTPバックエンドを定義しないIngressリソース・マニフェストにoci-native-ingress.oraclecloud.com/http-listener-port注釈を含めると、OCIネイティブ・イングレス・コントローラではHTTPリスナーは作成されません。
    • HTTPSバックエンドを定義しないIngressリソース・マニフェストにoci-native-ingress.oraclecloud.com/https-listener-port注釈を含めると、OCIネイティブ・イングレス・コントローラではHTTPSリスナーは作成されません。
    • HTTPバックエンドのみを定義するIngressリソース・マニフェストにoci-native-ingress.oraclecloud.com/http-listener-portアノテーションとoci-native-ingress.oraclecloud.com/https-listener-portアノテーションの両方を含めると、OCIネイティブ・イングレス・コントローラはoci-native-ingress.oraclecloud.com/https-listener-portアノテーションを無視し、HTTPSリスナーは作成しません。
    • HTTPSバックエンドのみを定義するIngressリソース・マニフェストにoci-native-ingress.oraclecloud.com/http-listener-portアノテーションとoci-native-ingress.oraclecloud.com/https-listener-portアノテーションの両方を含めると、OCIネイティブ・イングレス・コントローラはoci-native-ingress.oraclecloud.com/http-listener-portアノテーションを無視し、HTTPリスナーは作成しません。

IngressClass削除後のロード・バランサの保持

IngressClass自体を削除した場合、OCIネイティブ・イングレス・コントローラでIngressClassリソースのロード・バランサを保持するように指定できます。

IngressClassマニフェストでoci-native-ingress.oraclecloud.com/delete-protection-enabled注釈を使用して、ロード・バランサを削除するかどうかを指定します。IngressClassを削除した場合にロード・バランサを保持するには、注釈をtrueに設定します。IngressClassを削除した場合にロード・バランサを削除するには、注釈をfalseに設定します(または、マニフェストに注釈を含めないでください)。例:

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: <ic-name>
  annotations:
    oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true"
spec:
  ...

IngressClassリソースを削除し、その注釈を使用してロード・バランサを保持する場合、OCIネイティブ・イングレス・コントローラはロード・バランサ自体を保持しますが、他のサポート・リソース(ネットワーク・セキュリティ・グループ、タグ、Webアプリケーション・ファイアウォールなど)との関連付けはクリアされます。OCIネイティブ・イングレス・コントローラでは、作成したdefault_ingress BackendSetバックエンド・セットも削除されます。

ただし、OCIネイティブ・イングレス・コントローラは、削除されたIngressClassを現在参照しているIngressリソース用に作成したOCIロード・バランサ・リソース(リスナー、バックエンド・セット)を削除しません。したがって、IngressClassリソースを削除する前に、まずそのマニフェスト内のIngressClassを参照するIngressリソースを削除します。このようなIngressリソースを最初に削除しない場合、それらのリソース用に作成されたOCIリソースは引き続きロード・バランサに存在します。

ロード・バランサへのタグの適用

OCIネイティブ・イングレス・コントローラで、作成(IngressClassリソースの場合)または管理(oci-native-ingress.oraclecloud.com/id注釈で指定されている場合)に、定義済タグおよびフリーフォーム・タグをロード・バランサに適用するように指定できます。タグ付けを使用すると、コンパートメント間で異なるリソースをグループ化でき、独自のメタデータでリソースに注釈を付けることもできます。タグの詳細は、Kubernetesクラスタ関連リソースのタグ付けを参照してください。

定義済タグのロード・バランサへの適用

定義済タグは、タグ管理者によって設定および管理されます。定義されたタグは、タグ・ネームスペース、キーおよび値で構成されます。タグ・ネームスペースとタグ・キー定義は、定義されたタグをリソースに適用する前に、テナンシで設定する必要があります。

OCIネイティブ・イングレス・コントローラが定義済タグをロード・バランサに適用することを指定するには、IngressClassマニフェストのoci-native-ingress.oraclecloud.com/defined-tags注釈を次の形式で使用します:

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: <ic-name>
  annotations:
    oci-native-ingress.oraclecloud.com/defined-tags: '{"<tag-namespace>": {"<tag-key>": "<tag-value>"}}'
spec:
  ...

ここでは:

  • <tag-namespace>は、タグが属するタグ・ネームスペースです。
  • <tag-key>は、ロード・バランサに適用する定義済タグの名前です。
  • <tag-value>は、事前定義された値リストからのタグの値、または新しい値、または空白(定義されたタグの設定方法によって異なります)のいずれかです。

oci-native-ingress.oraclecloud.com/defined-tags注釈の値はJSON文字列で、JSON形式で複数のタグ・ネームスペース、タグ・キーおよびタグ値を指定できます。

例:

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: my-ingress-class
  annotations:
    oci-native-ingress.oraclecloud.com/defined-tags: '{"Operations": {"CostCenter": "42", "Department": "001"}, "Sales": {"Region": "US"}}'
spec:
  ...

IngressClassマニフェストのoci-native-ingress.oraclecloud.com/defined-tags注釈のいずれかのタグを変更すると、OCIネイティブ・イングレス・コントローラは、注釈で指定されたすべての定義済タグをロード・バランサに再適用します。ただし、定義済タグにタグ変数が含まれている場合、OCIネイティブ・イングレス・コントローラは、タグがまだ存在しない場合のみ、定義済タグをロード・バランサに再適用します。

OCIネイティブ・イングレス・コントローラが定義済タグをロード・バランサに適用できるようにするには、OCIネイティブ・イングレス・コントローラで適切なタグ・ネームスペースを使用できるように、適切なIAMポリシーが存在する必要があります。詳細は、次を参照してください:

ロード・バランサへのフリーフォーム・タグの適用

フリーフォーム・タグは、タグ管理者によって管理されません。フリーフォーム・タグは、キーと値で構成されます。定義済タグとは異なり、フリーフォーム・タグはタグ・ネームスペースに属していません。

OCIネイティブ・イングレス・コントローラがフリーフォーム・タグをロード・バランサに適用することを指定するには、IngressClassマニフェストのoci-native-ingress.oraclecloud.com/freeform-tags注釈を次の形式で使用します。

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: <ic-name>
  annotations:
    oci-native-ingress.oraclecloud.com/freeform-tags: '{"<tag-key>": "<tag-value>"}'
spec:
  ...

ここでは:

  • <tag-key>は、ロード・バランサに適用するフリーフォーム・タグの名前です。
  • <tag-value>は、ロード・バランサに適用するフリーフォーム・タグの値です。

oci-native-ingress.oraclecloud.com/freeform-tags注釈の値はJSON文字列で、複数のタグ・キーおよびタグ値をJSON形式で指定できます。

例:

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: my-ingress-class
  annotations:
    oci-native-ingress.oraclecloud.com/freeform-tags: '{"Project": "Red", "Version": "Alpha"}'
spec:
  ...

IngressClassマニフェストのoci-native-ingress.oraclecloud.com/freeform-tags注釈のいずれかのタグを変更すると、OCIネイティブ・イングレス・コントローラは、注釈で指定されたすべてのフリーフォーム・タグをロード・バランサに再適用します。

ロード・バランサへのタグのデフォルトの適用

タグのデフォルトは、特定のコンパートメントに対して設定されます。タグのデフォルトは、コンパートメント固有です。タグのデフォルトでは、作成時に特定のコンパートメントに作成されたすべてのリソースに自動的に適用される定義済タグを指定します。

OCIネイティブ・イングレス・コントローラ・バージョン1.4.0 (以降)を使用する場合、OCIネイティブ・イングレス・コントローラが作成するロード・バランサにタグのデフォルトが自動的に適用されます。その後、OCIネイティブ・イングレス・コントローラは、次のいずれかの条件が満たされないかぎり、ロード・バランサに適用されるタグのデフォルトを保持します。

  • ロード・バランサに自動的に適用されたタグのデフォルトを手動で削除します。
  • oci-native-ingress.oraclecloud.com/defined-tags注釈を使用して、タグのデフォルトを定義済タグとして指定します(その場合、OCIネイティブ・イングレス・コントローラはタグのデフォルトを他の定義済タグとして扱います)。

ユーザーが適用した値を持つタグのデフォルトはサポートされていません。OCIネイティブ・イングレス・コントローラがロード・バランサを作成または管理するコンパートメントに、ユーザーが適用した値を持つタグのデフォルトが設定されている場合は、oci-native-ingress.oraclecloud.com/defined-tags注釈を使用して、定義済タグとしてタグのデフォルトを指定する必要があります。

バージョン1.4.0より前のOCIネイティブ・イングレス・コントローラ・バージョンを使用して作成されたロード・バランサの場合、またはoci-native-ingress.oraclecloud.com/id注釈を使用して、OCIネイティブ・イングレス・コントローラが既存のロード・バランサを管理することを指定する場合、タグのデフォルトはサポートされていないことに注意してください。どちらの場合も、タグのデフォルトを適用または保持するには、oci-native-ingress.oraclecloud.com/defined-tags注釈を使用して、かわりにタグのデフォルトを定義済タグとして指定します。