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が削除された場合にロード・バランサを保持するかどうか。
「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リクエストを受信できるかどうか。
|
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リスナーを作成することを指定するには:
- .yamlファイルに新しいイングレス・リソースを定義します。イングレス・リソースの作成を参照してください。
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: ...
Ingress
リソース・マニフェストのrules:
セクションで、TCPトラフィックを受信するリスナーごとにルールを追加します。- (推奨)
paths.pathType
をImplementationSpecific
に設定します。 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
- (推奨)
-
kubectl create -f <filename>.yaml
を入力してリソースを作成します
HTTPS/TLSリクエストのサポートの追加
OCIネイティブ・イングレス・コントローラ(スタンドアロン・プログラムまたはクラスタ・アドオンとして)を使用して、セキュアなHTTPS通信をサポートできます。OCIネイティブ・イングレス・コントローラを使用して、TLS (旧SSL)を使用して暗号化されたトラフィックを処理するようにOCIロード・バランサ・リスナーおよびバックエンド・セットを設定できます。
OCIネイティブ・イングレス・コントローラを使用してHTTPS通信をサポートする場合、次の2つのオプションがあります。
- オプション1: OCI Native Ingress Controllerは、Kubernetesシークレットを使用して証明書サービスから証明書を取得します: Kubernetesシークレットを作成し、
Ingress
リソース・マニフェストでシークレットの名前を指定します。OCIネイティブ・イングレス・コントローラは、Kubernetesシークレットを使用して、証明書およびCAバンドル(認証局バンドル)をOCI証明書サービスから取得します。OCIネイティブ・イングレス・コントローラは、証明書およびCAバンドルをリスナーおよびバックエンド・セットに関連付けます。 - オプション2: 証明書サービスから証明書を取得する: OCI証明書サービスで証明書を自分で作成します。次に、証明書のOCIDを
Ingress
リソース・マニフェストに注釈として指定します。OCIネイティブ・イングレス・コントローラは、証明書をリスナーおよびバックエンド・セットに関連付けます。
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ネイティブ・イングレス・コントローラを構成するには:
- TLSの公開キーと秘密キーのペア、および証明書を取得します。
本番環境では、証明書署名リクエストを送信することで、選択した認証局からTLS証明書を取得します。証明書リクエスト・プロセス中に、公開キーおよび対応する秘密キーが生成されます。
開発およびテスト環境では、自己署名証明書を作成し、OpenSSLなどのツールを使用して秘密キーを自分で生成できます。たとえば(OpenSSL 3.0以降を使用):
-
次のコマンドを入力して、公開キーと秘密キーのペアを生成します。
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
-
次のコマンドを入力して証明書を生成します。
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
には、生成されたサーバー証明書が含まれます。
-
- 次のいずれかの方法で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
リソース・マニフェスト・ファイルの使用:-
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
-
kubectl create -f <filename>.yaml
を入力してシークレット・リソースを作成します
-
-
- Kubernetesシークレットを
Ingress
リソース・マニフェストに追加します:- .yamlファイルに新しいイングレス・リソースを定義します。イングレス・リソースの作成を参照してください。
- マニフェストの
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
- マニフェストの
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
-
kubectl create -f <filename>.yaml
を入力してリソースを作成します
イングレス・リソースを作成すると、OCIネイティブ・イングレス・コントローラは、Kubernetesシークレットを使用してインポート済タイプの証明書と、OCI証明書サービスからCAバンドル(認証局バンドル)を取得します。OCIネイティブ・イングレス・コントローラは、証明書をリスナーに関連付け、CAバンドルをバックエンド・セットに関連付けます。
ポート443でリスニングしているリスナーが、指定されたホストへのHTTPSリクエストを受信すると、リスナーはTLS終了の証明書を使用します。次に、リスナーはルーティング・ルールを使用して、リクエストをバックエンド・セットに転送します。バックエンド・セットは、クラスタで実行されているバックエンドとの新しいTLS接続を作成します(CAバンドルを新しい接続の信頼権限として使用します)。
オプション2: 証明書サービスから証明書を取得します
OCI証明書サービスから取得した証明書を使用するようにOCIネイティブ・イングレス・コントローラを構成するには:
- 次のいずれかの方法で、OCI証明書サービスに証明書を作成します:
- サード・パーティCAによって発行された証明書をインポートする(証明書のタイプは「インポート済」)
- 証明書サービスのCAから内部的に証明書を発行することによって(証明書のタイプは Issued by internal CAになります)
外部で管理する証明書を作成しないでください(タイプ「内部CAによって発行され、外部で管理されます」)。詳細は、証明書の作成を参照してください。
- 証明書のOCIDを書き留めます。
- 証明書のOCIDを
Ingress
リソース・マニフェストに追加します:- .yamlファイルに新しいイングレス・リソースを定義します。イングレス・リソースの作成を参照してください。
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: ...
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
-
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リスナーは作成しません。
- 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
注釈を使用して、かわりにタグのデフォルトを定義済タグとして指定します。