Ingress と負荷分散
OpenShift Container Platform でサービスを公開し、外部トラフィックを管理する
概要
第1章 ルート リンクのコピーリンクがクリップボードにコピーされました!
1.1. 基本ルートの作成 リンクのコピーリンクがクリップボードにコピーされました!
暗号化されていない HTTP がある場合は、ルートオブジェクトを使用して基本ルートを作成できます。
1.1.1. HTTP ベースのルートの作成 リンクのコピーリンクがクリップボードにコピーされました!
hello-openshift アプリケーションを例として、以下の手順で Web アプリケーションへの単純な HTTP ベースのルートを作成できます。
公開 URL でアプリケーションをホストするルートを作成できます。ルートは、アプリケーションのネットワークセキュリティー設定に応じて、セキュリティーで保護される場合と保護されない場合があります。HTTP ベースのルートとは、セキュアではないルートで、基本的な HTTP ルーティングプロトコルを使用してセキュリティー保護されていないアプリケーションポートでサービスを公開します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - 管理者としてログインしている。
- あるポートを公開する Web アプリケーションと、そのポートでトラフィックをリッスンする TCP エンドポイントがあります。
手順
次のコマンドを実行して、
hello-openshiftというプロジェクトを作成します。$ oc new-project hello-openshift以下のコマンドを実行してプロジェクトに Pod を作成します。
$ oc create -f https://raw.githubusercontent.com/openshift/origin/master/examples/hello-openshift/hello-pod.json以下のコマンドを実行して、
hello-openshiftというサービスを作成します。$ oc expose pod/hello-openshift次のコマンドを実行して、
hello-openshiftアプリケーションに対して、セキュアではないルートを作成します。$ oc expose svc hello-openshift
検証
作成した
routeリソースを確認するには、次のコマンドを実行します。$ oc get routes -o yaml hello-openshift作成したセキュアでないルートの YAML 定義例
apiVersion: route.openshift.io/v1 kind: Route metadata: name: hello-openshift spec: host: www.example.com port: targetPort: 8080 to: kind: Service name: hello-openshiftここでは、以下のようになります。
host-
サービスを指すエイリアス DNS レコードを指定します。このフィールドには、
www.example.comなどの有効な DNS 名を指定できます。DNS 名は DNS952 サブドメイン規則に従う必要があります。指定しない場合は、ルート名が自動的に生成されます。 targetPortこのルートが指すサービスによって選択される Pod のターゲットポートを指定します。
注記デフォルトの Ingress ドメインを表示するには、以下のコマンドを実行します。
$ oc get ingresses.config/cluster -o jsonpath={.spec.domain}
1.1.2. パスベースのルート リンクのコピーリンクがクリップボードにコピーされました!
単一のホスト名を使用して複数のアプリケーションにサービスを提供するには、パスベースのルーティングを設定します。この HTTP ベースの設定では、URL パスコンポーネントを比較することでトラフィックを特定のサービスに振り分け、リクエストが定義された最も具体的なルートと一致するようにします。
以下の表は、ルートのサンプルおよびそれらのアクセシビリティーを示しています。
| ルート | 比較すると | アクセス可能 |
|---|---|---|
| www.example.com/test | www.example.com/test | はい |
| www.example.com | いいえ | |
| www.example.com/test および www.example.com | www.example.com/test | はい |
| www.example.com | はい | |
| www.example.com | www.example.com/text | Yes (ルートではなく、ホストで一致) |
| www.example.com | はい |
パスを持つ保護されていないルートの例
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: route-unsecured
spec:
host: www.example.com
path: "/test"
to:
kind: Service
name: service-name
-
spec.host: パスベースのルートのパス属性を指定します。
ルーターは TLS を終了させず、要求のコンテンツを読み込みことができないので、パスベースのルーティングは、passthrough TLS を使用する場合には利用できません。
1.1.3. Ingress Controller シャーディングのルート作成 リンクのコピーリンクがクリップボードにコピーされました!
ルートを使用すると、アプリケーションを URL でホストできます。Ingress Controller のシャーディングは、一連の Ingress Controller 間での着信トラフィック負荷のバランスをとるのに役立ちます。Ingress Controller のシャーディング機能を使用すると、トラフィックを特定の Ingress Controller に分離することもできます。たとえば、Company A のトラフィックをある Ingress Controller に指定し、Company B を別の Ingress Controller に指定できます。
以下の手順では、例として hello-openshift アプリケーションを使用して、Ingress Controller シャーディングのルートを作成する方法を説明します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - プロジェクト管理者としてログインしている。
- ポートを公開する Web アプリケーションと、そのポート上のトラフィックをリッスンする HTTP または TLS エンドポイントがある。
- シャーディング用に Ingress Controller を設定している。
手順
次のコマンドを実行して、
hello-openshiftというプロジェクトを作成します。$ oc new-project hello-openshift以下のコマンドを実行してプロジェクトに Pod を作成します。
$ oc create -f https://raw.githubusercontent.com/openshift/origin/master/examples/hello-openshift/hello-pod.json以下のコマンドを実行して、
hello-openshiftというサービスを作成します。$ oc expose pod/hello-openshifthello-openshift-route.yamlというルート定義を作成します。シャーディング用に作成したルートの YAML 定義
apiVersion: route.openshift.io/v1 kind: Route metadata: labels: type: sharded name: hello-openshift-edge namespace: hello-openshift spec: subdomain: hello-openshift tls: termination: edge to: kind: Service name: hello-openshiftここでは、以下のようになります。
type-
ラベルキーとその対応するラベル値は、Ingress Controller で指定されたものと一致する必要があることを指定します。この例では、Ingress Controller にはラベルキーと値
type: shardedがあります。 subdomain-
サブドメインフィールドの値を使用して公開されるルートを指定します。subdomainフィールドを指定するときは、ホスト名を未設定のままにしておく必要があります。ホストフィールドとサブドメインフィールドの両方を指定した場合、ルートはホストフィールドの値を使用し、サブドメインフィールドは無視します。
次のコマンドを実行し、
hello-openshift-route.yamlを使用してhello-openshiftアプリケーションへのルートを作成します。$ oc -n hello-openshift create -f hello-openshift-route.yaml
検証
次のコマンドを使用して、ルートのステータスを取得します。
$ oc -n hello-openshift get routes/hello-openshift-edge -o yaml結果の
Routeリソースは次のようになります。出力例
apiVersion: route.openshift.io/v1 kind: Route metadata: labels: type: sharded name: hello-openshift-edge namespace: hello-openshift spec: subdomain: hello-openshift tls: termination: edge to: kind: Service name: hello-openshift status: ingress: - host: hello-openshift.<apps-sharded.basedomain.example.net> routerCanonicalHostname: router-sharded.<apps-sharded.basedomain.example.net> routerName: shardedここでは、以下のようになります。
host-
イングレスコントローラー (ルーター) がルートを公開するために使用するホスト名を指定します。
hostフィールドの値は、Ingress Controller によって自動的に決定され、そのドメインを使用します。この例では、Ingress Controller のドメインは<apps-sharded.basedomain.example.net>です。 <apps-sharded.basedomain.example.net>- Ingress コントローラーのホスト名を指定します。ホスト名が設定されていない場合、ルートは代わりにサブドメインを使用できます。サブドメインを指定すると、ルートを公開する Ingress Controller のドメインが自動的に使用されます。ルートが複数の Ingress Controller によって公開される場合、ルートは複数の URL でホストされます。
routerName-
Ingress コントローラーの名前を指定します。この例では、Ingress Controller の名前は
shardedです。
1.1.4. Ingress オブジェクトを使用したルートの作成 リンクのコピーリンクがクリップボードにコピーされました!
Ingress リソースを必要とするエコシステムコンポーネントを統合するには、Ingress オブジェクトを設定します。OpenShift Container Platform は、対応するルートオブジェクトのライフサイクルを自動的に管理し、シームレスな接続を確保するためにルートオブジェクトを作成および削除します。
手順
OpenShift Container Platform コンソールで Ingress オブジェクトを定義するか、
oc createコマンドを実行します。Ingress の YAML 定義
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: frontend annotations: route.openshift.io/termination: "reencrypt" route.openshift.io/destination-ca-certificate-secret: secret-ca-cert spec: rules: - host: www.example.com http: paths: - backend: service: name: frontend port: number: 443 path: / pathType: Prefix tls: - hosts: - www.example.com secretName: example-com-tls-certificate # ...ここでは、以下のようになります。
route.openshift.io/termination-
route.openshift.io/terminationアノテーションを指定します。Ingress にはこのパラメーターがないため、Routeのspec.tls.terminationパラメーターを設定できます。受け入れられる値は、edge、passthrough、reencryptです。その他のすべての値は警告なしに無視されます。アノテーション値が設定されていない場合は、edgeがデフォルトルートになります。デフォルトの edge ルートを実装するには、TLS 証明書の詳細をテンプレートファイルで定義する必要があります。 ルールホスト-
Ingressオブジェクトのホスト名を明示的に指定します。必須パラメーター。<host_name>.<cluster_ingress_domain>構文 (apps.openshiftdemos.comなど) を使用して、*.<cluster_ingress_domain>ワイルドカード DNS レコードとクラスターのサービング証明書を利用できます。それ以外の場合は、選択したホスト名の DNS レコードがあることを確認する必要があります。 宛先 CA 証明書シークレットroute.openshift.io/destination-ca-certificate-secretアノテーションを指定します。このアノテーションは、Ingress オブジェクトで使用して、カスタム宛先証明書 (CA) を使用したルートを定義するために使用できます。アノテーションは、生成されたルートに挿入される kubernetes シークレットsecret-ca-certを参照します。route.openshift.io/terminationアノテーションでpassthroughの値を指定する場合は、仕様でpathを''に設定し、pathTypeをImplementationSpecificに設定します。apiVersion: networking.k8s.io/v1 kind: Ingress # ... spec: rules: - host: www.example.com http: paths: - path: '' pathType: ImplementationSpecific backend: service: name: frontend port: number: 443 # ...$ oc apply -f ingress.yaml-
Ingress オブジェクトから宛先 CA を使用してルートオブジェクトを指定するには、シークレットの
data.tls.crt指定子に PEM エンコード形式の証明書を使用してkubernetes.io/tlsまたはOpaqueタイプのシークレットを作成する必要があります。
ルートを一覧表示します。
$ oc get routes結果には、
frontend-で始まる名前の自動生成ルートが含まれます。NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD frontend-gnztq www.example.com frontend 443 reencrypt/Redirect None自動生成されたルートの YAML 定義例
apiVersion: route.openshift.io/v1 kind: Route metadata: name: frontend-gnztq ownerReferences: - apiVersion: networking.k8s.io/v1 controller: true kind: Ingress name: frontend uid: 4e6c59cc-704d-4f44-b390-617d879033b6 spec: host: www.example.com path: / port: targetPort: https tls: certificate: | -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- insecureEdgeTerminationPolicy: Redirect key: | -----BEGIN RSA PRIVATE KEY----- [...] -----END RSA PRIVATE KEY----- termination: reencrypt destinationCACertificate: | -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- to: kind: Service name: frontend
1.2. ルートの保護 リンクのコピーリンクがクリップボードにコピーされました!
HTTP Strict Transport Security (HSTS) を使用してルートを保護できます。
1.2.1. HTTP Strict Transport Security リンクのコピーリンクがクリップボードにコピーされました!
セキュリティーを強化し、ウェブサイトのパフォーマンスを最適化するには、HTTP Strict Transport Security (HSTS) ポリシーを使用してください。この仕組みにより、ブラウザーはルートホスト上で HTTPS トラフィックのみを使用するように指示され、HTTP リダイレクトの必要性がなくなり、ユーザー操作が高速化されます。
HSTS ポリシーが適用されると、HSTS はサイトから Strict Transport Security ヘッダーを HTTP および HTTPS 応答に追加します。HTTP を HTTPS にリダイレクトするルートで insecureEdgeTerminationPolicy 値を使用できます。HSTS を強制している場合は、要求の送信前にクライアントがすべての要求を HTTP URL から HTTPS に変更するため、リダイレクトの必要がなくなります。
クラスター管理者は、以下を実行するために HSTS を設定できます。
- ルートごとに HSTS を有効にします。
- ルートごとに HSTS を無効にします。
- ドメインごとに HSTS を適用するか、ドメインと組み合わせた namespace ラベルを使用します。
HSTS はセキュアなルート (edge-terminated または re-encrypt) でのみ機能します。この設定は、HTTP または passthrough ルートには適していません。
1.2.1.1. ルートごとの HTTP Strict Transport Security の有効化 リンクのコピーリンクがクリップボードにコピーされました!
特定のアプリケーションに対して安全な HTTPS 接続を強制するには、ルートごとに HTTP Strict Transport Security (HSTS) を有効にします。haproxy.router.openshift.io/hsts_header アノテーションをエッジに適用してルートを再暗号化することで、ブラウザーが暗号化されていないトラフィックを拒否することが保証されます。
前提条件
- プロジェクトの管理者権限があるユーザーで、クラスターにログインしている。
-
OpenShift CLI (
oc) がインストールされている。
手順
ルートで HSTS を有効にするには、
haproxy.router.openshift.io/hsts_header値を edge-terminated または re-encrypt ルートに追加します。次のコマンドを実行すると、oc annotateツールを使用してこれを実行できます。コマンドを適切に実行するには、haproxy.router.openshift.io/hsts_header ルートアノテーション内のセミコロン (;) も二重引用符 ("") で囲まれていることを確認してください。最大経過時間を
31536000ミリ秒 (約 8.5 時間) に設定するアノテーションコマンドの例$ oc annotate route <route_name> -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header=max-age=31536000;\ includeSubDomains;preload"アノテーションで設定されたルートの例
apiVersion: route.openshift.io/v1 kind: Route metadata: annotations: haproxy.router.openshift.io/hsts_header: max-age=31536000;includeSubDomains;preload # ... spec: host: def.abc.com tls: termination: "reencrypt" ... wildcardPolicy: "Subdomain" # ...ここでは、以下のようになります。
max-age-
HSTS ポリシーの有効期間 (秒単位) を指定します。
0に設定すると、これはポリシーを無効にします。 サブドメインを含める- ホストのすべてのサブドメインは、ホストと同じ HSTS ポリシーを持つ必要があることを指定します。オプションのパラメーター。
プリロード-
max-ageが0より大きい場合に、サイトが HSTS プリロードリストに含まれることを指定します。たとえば、Google などのサイトはpreloadが設定されているサイトの一覧を作成します。ブラウザーはこれらのリストを使用し、サイトと対話する前でも HTTPS 経由で通信できるサイトを判別できます。preloadを設定していない場合、ブラウザーはヘッダーを取得するために、HTTPS を介してサイトと少なくとも 1 回対話している必要があります。オプションのパラメーター。
1.2.1.2. ルートごとの HTTP Strict Transport Security の無効化 リンクのコピーリンクがクリップボードにコピーされました!
暗号化されていない接続を許可したり、アクセスに関する問題をトラブルシューティングしたりするには、特定のルートに対して HTTP Strict Transport Security (HSTS) を無効にします。max-age ルートアノテーションを 0 に設定すると、ブラウザーはルートホスト上で HTTPS 要件の適用を停止します。
前提条件
- プロジェクトの管理者権限があるユーザーで、クラスターにログインしている。
-
OpenShift CLI (
oc) がインストールされている。
手順
HSTS を無効にするには、ルートアノテーションの
max-age値を0に設定するために、次のように入力します。$ oc annotate route <route_name> -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=0"ヒント代わりに、以下の YAML を適用して、ルートごとに HSTS を無効にするための config map を作成することもできます。
kind: Route apiVersion: route.openshift.io/v1 metadata: annotations: haproxy.router.openshift.io/hsts_header: max-age=0namespace のすべてのルートで HSTS を無効にするには、following コマンドを入力します。
$ oc annotate route --all -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=0"
検証
すべてのルートのアノテーションをクエリーするには、以下のコマンドを入力します。
$ oc get route --all-namespaces -o go-template='{{range .items}}{{if .metadata.annotations}}{{$a := index .metadata.annotations "haproxy.router.openshift.io/hsts_header"}}{{$n := .metadata.name}}{{with $a}}Name: {{$n}} HSTS: {{$a}}{{"\n"}}{{else}}{{""}}{{end}}{{end}}{{end}}'出力例
Name: routename HSTS: max-age=0
1.2.1.3. ドメインごとの HTTP Strict Transport Security の適用 リンクのコピーリンクがクリップボードにコピーされました!
セキュアなルートに対してドメインごとに HTTP Strict Transport Security (HSTS) を適用するには、Ingress 仕様に requiredHSTSPolicies レコードを追加して、HSTS ポリシーの設定を取得します。
requiredHSTSPolicy を設定して HSTS を適用する場合は、新規に作成されたルートは準拠された HSTS ポリシーアノテーションで設定する必要があります。
準拠しない HSTS ルートを持つアップグレードされたクラスターを処理するには、ソースでマニフェストを更新し、更新を適用できます。
oc expose route コマンドまたは oc create route コマンドを使用して、HSTS を強制するドメインにルートを追加することはできません。このコマンドの API はアノテーションを受け入れないためです。
HSTS がすべてのルートに対してグローバルに要求されている場合でも、セキュアではないルートや非 TLS ルートに適用することはできません。
前提条件
- プロジェクトの管理者権限があるユーザーで、クラスターにログインしている。
-
OpenShift CLI (
oc) がインストールされている。
手順
次のコマンドを実行し、必要に応じてフィールドを更新して、Ingress 設定 YAML を編集します。
$ oc edit ingresses.config.openshift.io/clusterHSTS ポリシーの例
apiVersion: config.openshift.io/v1 kind: Ingress metadata: name: cluster spec: domain: 'hello-openshift-default.apps.username.devcluster.openshift.com' requiredHSTSPolicies:1 - domainPatterns:2 - '*hello-openshift-default.apps.username.devcluster.openshift.com' - '*hello-openshift-default2.apps.username.devcluster.openshift.com' namespaceSelector:3 matchLabels: myPolicy: strict maxAge:4 smallestMaxAge: 1 largestMaxAge: 31536000 preloadPolicy: RequirePreload5 includeSubDomainsPolicy: RequireIncludeSubDomains6 - domainPatterns: - 'abc.example.com' - '*xyz.example.com' namespaceSelector: matchLabels: {} maxAge: {} preloadPolicy: NoOpinion includeSubDomainsPolicy: RequireNoIncludeSubDomains- 1
- 必須。
requiredHSTSPoliciesは順番に検証され、最初に一致するdomainPatternsが適用されます。 - 2
- 必須。1 つ以上の
domainPatternsホスト名を指定する必要があります。任意の数のドメインをリスト表示できます。さまざまなdomainPatternsについて、Enforcing オプションの複数のセクションを含めることができます。 - 3
- オプション:
namespaceSelectorを含める場合、ルートを配置するプロジェクトのラベルと一致する必要があります。これにより、ルートに設定された HSTS ポリシーを適用する必要があります。domainPatternsではなくnamespaceSelectorのみに一致するルートは検証されません。 - 4
- 必須。
max-ageは、HSTS ポリシーが有効な期間 (秒単位) を測定します。このポリシー設定により、最小および最大のmax-ageを適用することができます。-
largestMaxAgeの値は0から2147483647の範囲内で指定する必要があります。これを指定しないと、上限が強制されないことを意味します。 -
smallestMaxAgeの値は0から2147483647の範囲内で指定する必要があります。トラブルシューティングのために HSTS を無効にするには、0を入力します。HSTS を無効にする必要がない場合は1を入力します。これを指定しないと、下限が強制されません。
-
- 5
- オプション:
haproxy.router.openshift.io/hsts_headerにpreloadを含めることで、外部サービスがこのサイトをそれぞれの HSTS プリロードリストに含めることができます。ブラウザーはこれらの一覧を使用し、サイトと対話する前でも HTTPS 経由で通信できるサイトを判別できます。preload設定がない場合、ブラウザーは少なくともサイトと通信してヘッダーを取得する必要があります。preloadは、以下のいずれかで設定できます。-
RequirePreload:preloadはRequiredHSTSPolicyで必要になります。 -
RequireNoPreload:preloadはRequiredHSTSPolicyによって禁止されます。 -
NoOpinion:preloadはRequiredHSTSPolicyに重要ではありません。
-
- 6
- オプション:
includeSubDomainsPolicyは、以下のいずれかで設定できます。-
RequireIncludeSubDomains:includeSubDomainsはRequiredHSTSPolicyで必要です。 -
RequireNoIncludeSubDomains:includeSubDomainsはRequiredHSTSPolicyによって禁止されています。 -
NoOpinion:includeSubDomainsはRequiredHSTSPolicyに重要ではありません。
-
oc annotate commandを入力して、HSTS をクラスターのすべてのルートまたは特定の namespace に適用することができます。HSTS をクラスターのすべてのルートに適用するには、
oc annotate commandを実行します。以下に例を示します。$ oc annotate route --all --all-namespaces --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000"特定の namespace のすべてのルートに HSTS を適用するには、
oc annotate commandを実行します。以下に例を示します。$ oc annotate route --all -n my-namespace --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000"
検証
設定した HSTS ポリシーを確認できます。以下に例を示します。
必要な HSTS ポリシーの
maxAgeセットを確認するには、以下のコマンドを入力します。$ oc get clusteroperator/ingress -n openshift-ingress-operator -o jsonpath='{range .spec.requiredHSTSPolicies[*]}{.spec.requiredHSTSPolicies.maxAgePolicy.largestMaxAge}{"\n"}{end}'すべてのルートで HSTS アノテーションを確認するには、以下のコマンドを入力します。
$ oc get route --all-namespaces -o go-template='{{range .items}}{{if .metadata.annotations}}{{$a := index .metadata.annotations "haproxy.router.openshift.io/hsts_header"}}{{$n := .metadata.name}}{{with $a}}Name: {{$n}} HSTS: {{$a}}{{"\n"}}{{else}}{{""}}{{end}}{{end}}{{end}}'出力例
Name: <_routename_> HSTS: max-age=31536000;preload;includeSubDomains
1.3. ルートの設定 リンクのコピーリンクがクリップボードにコピーされました!
特定のトラフィック動作に合わせてルート設定をカスタマイズするには、アノテーション、ヘッダー、および Cookie を適用します。これらの仕組みを利用することで、きめ細かなルーティングルールを定義し、標準機能を拡張して複雑なアプリケーション要件に対応できます。
1.3.1. ルートのタイムアウトの設定 リンクのコピーリンクがクリップボードにコピーされました!
Service Level Availability (SLA) で必要とされる、低タイムアウトが必要なサービスや、バックエンドでの処理速度が遅いケースで高タイムアウトが必要なサービスがある場合は、既存のルートに対してデフォルトのタイムアウトを設定することができます。
OpenShift Container Platform クラスターの前にユーザー管理の外部ロードバランサーを設定した場合は、ユーザー管理の外部ロードバランサーのタイムアウト値がルートのタイムアウト値よりも高いことを確認してください。この設定により、クラスターが使用するネットワーク上でのネットワーク輻輳の問題を防ぐことができます。
前提条件
- 稼働中のクラスターに Ingress コントローラーをデプロイしました。
手順
oc annotateコマンドを使用して、ルートにタイムアウトを追加します。$ oc annotate route <route_name> \ --overwrite haproxy.router.openshift.io/timeout=<timeout><time_unit>< タイムアウト >: サポートされている時間単位は、マイクロ秒 (us)、ミリ秒 (ms)、秒 (s)、分 (m)、時間 (h)、または日 (d) です。以下の例では、2 秒のタイムアウトを
myrouteという名前のルートに設定します。$ oc annotate route myroute --overwrite haproxy.router.openshift.io/timeout=2s
1.3.2. HTTP ヘッダーの設定 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションのリクエストヘッダーとレスポンスヘッダーをカスタマイズするには、Ingress Controller を設定するか、特定のルートアノテーションを適用します。これらの設定方法間の相互作用を理解することで、グローバルヘッダーポリシーとルート固有のヘッダーポリシーを効果的に管理できます。
ルートアノテーションを使用して特定のヘッダーを設定することもできます。ヘッダーを設定するさまざまな方法は、連携時に課題となる可能性があります。
IngressController または Route CR 内のヘッダーは設定または削除のみ可能で、追加はできません。HTTP ヘッダーに値が設定されている場合、その値は完全である必要があるため、今後追加する必要はありません。X-Forwarded-For ヘッダーなどのヘッダーを追加することが適切な状況では、spec.httpHeaders.actions の代わりに spec.httpHeaders.forwardedHeaderPolicy フィールドを使用します。
- 優先順位
同じ HTTP ヘッダーを Ingress Controller とルートの両方で変更すると、HAProxy は、それがリクエストヘッダーであるか応答ヘッダーであるかに応じて、特定の方法でアクションの優先順位を付けます。
- HTTP 応答ヘッダーの場合、Ingress Controller で指定されたアクションは、ルートで指定されたアクションの後に実行されます。これは、Ingress Controller で指定されたアクションが優先されることを意味します。
- HTTP リクエストヘッダーの場合、ルートで指定されたアクションは、Ingress Controller で指定されたアクションの後に実行されます。これは、ルートで指定されたアクションが優先されることを意味します。
たとえば、クラスター管理者は、次の設定を使用して、Ingress Controller で X-Frame-Options 応答ヘッダーに値 DENY を設定します。
IngressController 仕様の例
apiVersion: operator.openshift.io/v1
kind: IngressController
# ...
spec:
httpHeaders:
actions:
response:
- name: X-Frame-Options
action:
type: Set
set:
value: DENY
ルート所有者は、クラスター管理者が Ingress Controller に設定したものと同じ応答ヘッダーを設定しますが、次の設定を使用して値 SAMEORIGIN を設定します。
Route 仕様の例
apiVersion: route.openshift.io/v1
kind: Route
# ...
spec:
httpHeaders:
actions:
response:
- name: X-Frame-Options
action:
type: Set
set:
value: SAMEORIGIN
IngressController 仕様と Route 仕様の両方で X-Frame-Options 応答ヘッダーが設定されている場合、特定のルートでフレームが許可されている場合でも、Ingress Controller のグローバルレベルでこのヘッダーに設定された値が優先されます。リクエストヘッダーの場合、Route 仕様の値が IngressController 仕様の値をオーバーライドします。
この優先順位付けは、haproxy.config ファイルで次のロジックが使用されるため発生します。このロジックでは、Ingress Controller がフロントエンドと見なされ、個々のルートがバックエンドと見なされます。フロントエンド設定に適用されるヘッダー値 DENY は、バックエンドで設定されている値 SAMEORIGIN で同じヘッダーをオーバーライドします。
frontend public
http-response set-header X-Frame-Options 'DENY'
frontend fe_sni
http-response set-header X-Frame-Options 'DENY'
frontend fe_no_sni
http-response set-header X-Frame-Options 'DENY'
backend be_secure:openshift-monitoring:alertmanager-main
http-response set-header X-Frame-Options 'SAMEORIGIN'
さらに、Ingress Controller またはルートのいずれかで定義されたアクションは、ルートアノテーションを使用して設定された値をオーバーライドします。
- 特殊なケースのヘッダー
- 次のヘッダーは、設定または削除が完全に禁止されているか、特定の状況下で許可されています。
| ヘッダー名 | IngressController 仕様を使用して設定可能かどうか | Route 仕様を使用して設定可能かどうか | 不許可の理由 | 別の方法で設定可能かどうか |
|---|---|---|---|---|
|
| いいえ | いいえ |
| いいえ |
|
| いいえ | はい |
| いいえ |
|
| いいえ | いいえ |
|
はい: |
|
| いいえ | いいえ | HAProxy が設定する Cookie は、クライアント接続を特定のバックエンドサーバーにマップするセッション追跡に使用されます。これらのヘッダーの設定を許可すると、HAProxy のセッションアフィニティーが妨げられ、HAProxy の Cookie の所有権が制限される可能性があります。 | はい:
|
1.3.3. ルート内の HTTP リクエストおよびレスポンスヘッダーの設定または削除 リンクのコピーリンクがクリップボードにコピーされました!
コンプライアンス目的またはその他の理由で、特定の HTTP 要求および応答ヘッダーを設定または削除できます。これらのヘッダーは、Ingress Controller によって提供されるすべてのルート、または特定のルートに対して設定または削除できます。
たとえば、ルートを提供する Ingress Controller によってデフォルトのグローバルな場所が指定されている場合でも、コンテンツが複数の言語で記述されていると、Web アプリケーションが特定のルートの別の場所でコンテンツを提供するように指定できます。
以下の手順では Content-Location HTTP リクエストヘッダーを設定するルートを作成し、アプリケーション (https://app.example.com) に URL が関連付けられ、https://app.example.com/lang/en-us のロケーションにダイレクトされるようにします。アプリケーショントラフィックをこの場所にダイレクトすると、特定のルートを使用する場合はすべて、アメリカ英語で記載された Web コンテンツにアクセスすることになります。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - プロジェクト管理者として OpenShift Container Platform クラスターにログインしている。
- ポートを公開する Web アプリケーションと、そのポート上のトラフィックをリッスンする HTTP または TLS エンドポイントがある。
手順
ルート定義を作成し、
app-example-route.yamlというファイルに保存します。HTTP ヘッダーディレクティブを使用して作成されたルートの YAML 定義
apiVersion: route.openshift.io/v1 kind: Route # ... spec: host: app.example.com tls: termination: edge to: kind: Service name: app-example httpHeaders: actions: response: - name: Content-Location action: type: Set set: value: /lang/en-us # ...ここでは、以下のようになります。
actions- HTTP ヘッダーに対して実行するアクションのリストを指定します。
response- 変更したいヘッダーの種類を指定します。この場合は、応答ヘッダーです。
レスポンス名- 変更したいヘッダーの名前を指定します。設定または削除できる使用可能なヘッダーのリストは、HTTP ヘッダーの設定 を参照してください。
アクション.タイプ-
ヘッダーに対して実行されるアクションの種類を指定します。このフィールドには、
SetまたはDeleteの値を指定できます。 設定値-
HTTP ヘッダーの設定時は、
値を指定する必要があります。値は、そのヘッダーで使用可能なディレクティブのリストからの文字列 (例:DENY)にすることも、HAProxy の動的値構文を使用して解釈される動的値にすることもできます。この場合、値はコンテンツの相対位置に設定されます。
新しく作成したルート定義を使用して、既存の Web アプリケーションへのルートを作成します。
$ oc -n app-example create -f app-example-route.yamlHTTP リクエストヘッダーの場合、ルート定義で指定されたアクションは、Ingress Controller の HTTP リクエストヘッダーに対して実行されたアクションの後に実行されます。これは、ルート内のこれらのリクエストヘッダーに設定された値が、Ingress Controller に設定された値よりも優先されることを意味します。HTTP ヘッダーの処理順序の詳細は、HTTP ヘッダーの設定 を参照してください。
1.3.4. Cookie の使用によるルートのステートフル性の維持 リンクのコピーリンクがクリップボードにコピーされました!
Pod の再起動やスケーリングイベント中にステートフルなアプリケーショントラフィックを維持するには、Cookie を使用してスティッキーセッションを設定します。この方法を用いることで、すべての受信トラフィックが同じエンドポイントに到達することが保証され、特定のエンドポイント Pod が変更された場合でも状態の損失を防ぐことができます。
OpenShift Container Platform は Cookie を使用してセッションの永続化を設定できます。Ingress コントローラーは、ユーザーからのリクエストを処理するエンドポイントを選択し、セッション用の Cookie を作成します。Cookie は要求の応答として戻され、ユーザーは Cookie をセッションの次の要求と共に送り返します。Cookie は Ingress Controller に対し、セッションを処理しているエンドポイントを示し、クライアント要求が Cookie を使用して同じ Pod にルーティングされるようにします。
Cookie は、HTTP トラフィックを表示できないので、passthrough ルートで設定できません。代わりに、送信元 IP アドレスをベースに数が計算され、バックエンドを判断します。
バックエンドが変わると、トラフィックが間違ったサーバーに転送されてしまい、スティッキーではなくなります。送信元 IP を非表示にするロードバランサーを使用している場合は、すべての接続に同じ番号が設定され、トラフィックは同じ Pod に送られます。
1.3.4.1. Cookie を使用したルートのアノテーション リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションがセッションの永続性と負荷分散を管理できるようにするには、ルートにカスタムの Cookie 名をアノテーションとして追加します。デフォルトの Cookie を上書きすることで、バックエンドアプリケーションは特定の Cookie を識別して削除できるようになり、必要に応じてエンドポイントの再選択を強制できます。
サーバーが過負荷状態になると、サーバーはクライアントからのリクエストを削除し、他のエンドポイントにリクエストを再分配しようとします。
手順
指定される cookie 名でルートにアノテーションを付けます。
$ oc annotate route <route_name> router.openshift.io/cookie_name="<cookie_name>"ここでは、以下のようになります。
<route_name>- ルートの名前を指定します。
<cookie_name>cookie の名前を指定します。
たとえば、ルート
my_routeに cookie 名my_cookieでアノテーションを付けるには、以下を実行します。$ oc annotate route my_route router.openshift.io/cookie_name="my_cookie"
変数でルートのホスト名を取得します。
$ ROUTE_NAME=$(oc get route <route_name> -o jsonpath='{.spec.host}')ここでは、以下のようになります。
<route_name>- ルートの名前を指定します。
cookie を保存してからルートにアクセスします。
$ curl $ROUTE_NAME -k -c /tmp/cookie_jarルートに接続する際に、直前のコマンドによって保存される cookie を使用します。
$ curl $ROUTE_NAME -k -b /tmp/cookie_jar
1.3.5. ルート固有のアノテーション リンクのコピーリンクがクリップボードにコピーされました!
Ingress Controller は、公開するすべてのルートのデフォルトオプションを設定できます。個別のルートは、アノテーションに個別の設定を指定して、デフォルトの一部を上書きできます。Red Hat では、ルートアノテーションの Operator 管理ルートへの追加はサポートしません。
複数の送信元 IP またはサブネットを含む許可リストを作成するには、スペースで区切られたリストを使用します。他の区切りタイプを使用すると、リストが警告やエラーメッセージなしに無視されます。
| 変数 | 説明 |
|---|---|
|
|
ロードバランシングアルゴリズムを設定します。使用できるオプションは、 |
|
|
関連の接続を追跡する cookie の使用を無効にします。 |
|
| このルートに使用するオプションの cookie を指定します。名前は、大文字、小文字、数字、"_" または "-" を任意に組み合わせて指定する必要があります。デフォルトは、ルートのハッシュ化された内部キー名です。 |
|
|
ルーターからバッキングされる Pod に対して許容される接続最大数を設定します。 |
|
|
|
|
|
同じ送信元 IP アドレスで行われる同時 TCP 接続の数を制限します。数値を受け入れます。 |
|
|
同じ送信元 IP アドレスを持つクライアントが HTTP 要求を実行できるレートを制限します。数値を受け入れます。 |
|
|
同じ送信元 IP アドレスを持つクライアントが TCP 接続を確立するレートを制限します。数値を受け入れます。 |
|
| バックエンドのヘルスチェックの間隔を設定します。(TimeUnits) |
|
| ルートの許可リストを設定します。許可リストは、承認したソースアドレスの IP アドレスおよび CIDR 範囲のリストをスペース区切りにしたリストです。許可リストに含まれていない IP アドレスからの要求は破棄されます。
|
|
| edge terminated または re-encrypt ルートの Strict-Transport-Security ヘッダーを設定します。 |
|
| バックエンドの要求の書き換えパスを設定します。 |
|
| Cookie を制限するために値を設定します。値は以下のようになります。
この値は、re-encrypt および edge ルートにのみ適用されます。詳細は、SameSite cookie のドキュメント を参照してください。 |
|
|
ルートごとに
|
-
デフォルトでは、ルーターは 5 秒ごとにリロードされ、最初から Pod 間の接続のバランスがリセットされます。その結果、
roundrobin状態はリロード間で保持されません。このアルゴリズムは、Pod のコンピューティング能力とストレージ容量がほぼ同じである場合に最適に機能します。たとえば、CI/CD パイプラインの使用により、アプリケーションまたはサービスのエンドポイントが継続的に変更される場合、結果的にバランスが不均一になる可能性があります。その場合は別のアルゴリズムを使用します。 許可リストの IP アドレスと CIDR 範囲の数が 61 を超えると、それらは別のファイルに書き込まれます。これは
haproxy.configファイルから参照されます。このファイルは、/var/lib/haproxy/router/allowlistsフォルダーに保存されます。注記アドレスが許可リストに書き込まれることを確認するには、CIDR 範囲の完全なリストが Ingress Controller 設定ファイルに記載されていることを確認します。etcd オブジェクトサイズ制限は、ルートアノテーションのサイズを制限します。このため、許可リストに追加できる IP アドレスと CIDR 範囲の最大数のしきい値が作成されます。
特定の IP アドレスを 1 つだけ許可するルート
metadata:
annotations:
haproxy.router.openshift.io/ip_allowlist: 192.168.1.10
ロードバランシングアルゴリズムを leastconn に設定するルート
metadata:
annotations:
haproxy.router.openshift.io/balance: leastconn
-
デフォルトの負荷分散アルゴリズムは
ランダムです。
複数の IP アドレスを許可するルート
metadata:
annotations:
haproxy.router.openshift.io/ip_allowlist: 192.168.1.10 192.168.1.11 192.168.1.12
IP アドレスの CIDR ネットワークを許可するルート
metadata:
annotations:
haproxy.router.openshift.io/ip_allowlist: 192.168.1.0/24
IP アドレスと IP アドレスの CIDR ネットワークの両方を許可するルート
metadata:
annotations:
haproxy.router.openshift.io/ip_allowlist: 180.5.61.153 192.168.1.0/24 10.0.0.0/8
書き換えターゲットを指定するルート
apiVersion: route.openshift.io/v1
kind: Route
metadata:
annotations:
haproxy.router.openshift.io/rewrite-target: /
...
- 1
- バックエンドの要求の書き換えパスとして
/を設定します。
ルートに haproxy.router.openshift.io/rewrite-target アノテーションを設定すると、要求をバックエンドアプリケーションに転送する前に Ingress Controller がこのルートを使用して HTTP 要求のパスを書き換える必要があることを指定します。spec.path で指定されたパスに一致する要求パスの一部は、アノテーションで指定された書き換えターゲットに置き換えられます。
以下の表は、spec.path、要求パス、および書き換えターゲットの各種の組み合わせに関するパスの書き換え動作の例を示しています。
| Route.spec.path | 要求パス | 書き換えターゲット | 転送された要求パス |
|---|---|---|---|
| /foo | /foo | / | / |
| /foo | /foo/ | / | / |
| /foo | /foo/bar | / | /bar |
| /foo | /foo/bar/ | / | /bar/ |
| /foo | /foo | /bar | /bar |
| /foo | /foo/ | /bar | /bar/ |
| /foo | /foo/bar | /baz | /baz/bar |
| /foo | /foo/bar/ | /baz | /baz/bar/ |
| /foo/ | /foo | / | 該当なし (要求パスがルートパスに一致しない) |
| /foo/ | /foo/ | / | / |
| /foo/ | /foo/bar | / | /bar |
haproxy.router.openshift.io/rewrite-target 内の特定の特殊文字は、適切にエスケープする必要があるため、特別な処理が必要です。これらの文字がどのように処理されるかは、次の表を参照してください。
| 以下の文字の場合 | 以下の文字を使用 | 注記 |
|---|---|---|
| # | \# | # は書き換え式を終了させるので使用しないでください。 |
| % | % または %% | %%% のような変則的なシーケンスは避けてください。 |
| ‘ | \’ | ‘ は無視されるので避けてください。 |
その他の有効な URL 文字はすべてエスケープせずに使用できます。
1.3.6. スループットの問題のトラブルシューティング方法 リンクのコピーリンクがクリップボードにコピーされました!
特定のサービス間のレイテンシーが異常に高いなど、ネットワークスループットの問題を診断および解決するには、トラブルシューティング手法を適用します。接続のボトルネックを特定することで、OpenShift Container Platform 内でのアプリケーションの安定したパフォーマンスを確保できます。
Pod のログが問題の原因を指摘しない場合は、以下の方法を使用してパフォーマンスの問題を分析します。
pingまたはtcpdumpなどのパケットアナライザーを使用して Pod とそのノード間のトラフィックを分析します。たとえば、問題を生じさせる動作を再現している間に各ノードで
tcpdumpツールを実行 します。両サイトでキャプチャーしたデータを確認し、送信および受信タイムスタンプを比較して Pod への/からのトラフィックの待ち時間を分析します。待ち時間は、ノードのインターフェイスが他の Pod やストレージデバイス、またはデータプレーンからのトラフィックでオーバーロードする場合に OpenShift Container Platform で発生する可能性があります。$ tcpdump -s 0 -i any -w /tmp/dump.pcap host <podip 1> && host <podip 2>1 ここでは、以下のようになります。
ポディップPod の IP アドレスを指定します。
oc get pod <pod_name> -o wideコマンドを実行して Pod の IP アドレスを取得します。tcpdumpは、これらの 2 つの Pod 間のすべてのトラフィックが含まれる/tmp/dump.pcapのファイルを生成します。ファイルサイズを最小限に抑えるために問題を再現するすぐ前と問題を再現したすぐ後ににアナライザーを実行することが良いでしょう。次のコマンドを使用して、ノード間でパケットアナライザーを実行 することもできます。$ tcpdump -s 0 -i any -w /tmp/dump.pcap port 4789
ストリーミングのスループットおよび UDP スループットを測定するために
iperfなどの帯域幅測定ツールを使用します。最初に Pod からツールを実行し、次にノードから実行して、ボトルネックを特定します。-
iperfのインストールおよび使用に関する詳細は、こちらの Red Hat ソリューション を参照してください。
-
- 場合によっては、レイテンシーの問題が原因で、クラスターがルーター Pod を含むノードを異常としてマークすることがあります。ワーカーレイテンシープロファイルを使用して、アクションを実行する前にクラスターがノードからステータスの最新情報を受け取る頻度を調節します。
-
クラスターでレイテンシーの低いノードとレイテンシーの高いノードが指定されている場合は、Ingress Controller の
spec.nodePlacementフィールドを設定して、ルーター Pod の配置を制御します。
1.3.7. ルートの受付ポリシーの設定 リンクのコピーリンクがクリップボードにコピーされました!
管理者およびアプリケーション開発者は、同じドメイン名を持つ複数の namespace でアプリケーションを実行できます。これは、複数のチームが同じホスト名で公開されるマイクロサービスを開発する組織を対象としています。
複数の namespace での要求の許可は、namespace 間の信頼のあるクラスターに対してのみ有効にする必要があります。有効にしないと、悪意のあるユーザーがホスト名を乗っ取る可能性があります。このため、デフォルトの受付ポリシーは複数の namespace 間でのホスト名の要求を許可しません。
前提条件
- クラスター管理者の権限。
手順
以下のコマンドを使用して、
ingresscontrollerリソース変数の.spec.routeAdmissionフィールドを編集します。$ oc -n openshift-ingress-operator patch ingresscontroller/default --patch '{"spec":{"routeAdmission":{"namespaceOwnership":"InterNamespaceAllowed"}}}' --type=mergeイメージコントローラー設定例
spec: routeAdmission: namespaceOwnership: InterNamespaceAllowed ...ヒントまたは、以下の YAML を適用してルートの受付ポリシーを設定できます。
apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: routeAdmission: namespaceOwnership: InterNamespaceAllowed
1.3.8. デュアルスタックネットワーク用の OpenShift Container Platform Ingress Controller の設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform クラスターが IPv4 および IPv6 デュアルスタックネットワーク用に設定されている場合、クラスターは OpenShift Container Platform ルートによって外部からアクセス可能です。
Ingress Controller は、IPv4 エンドポイントと IPv6 エンドポイントの両方を持つサービスを自動的に提供しますが、シングルスタックまたはデュアルスタックサービス用に Ingress Controller を設定できます。
前提条件
- ベアメタルに OpenShift Container Platform クラスターをデプロイしていること。
-
OpenShift CLI (
oc) がインストールされている。
手順
Ingress Controller が、IPv4 / IPv6 を介してトラフィックをワークロードに提供するようにするには、
ipFamiliesフィールドおよびipFamilyPolicyフィールドを設定して、サービス YAML ファイルを作成するか、既存のサービス YAML ファイルを変更します。以下に例を示します。サービス YAML ファイルの例
apiVersion: v1 kind: Service metadata: creationTimestamp: yyyy-mm-ddT00:00:00Z labels: name: <service_name> manager: kubectl-create operation: Update time: yyyy-mm-ddT00:00:00Z name: <service_name> namespace: <namespace_name> resourceVersion: "<resource_version_number>" selfLink: "/api/v1/namespaces/<namespace_name>/services/<service_name>" uid: <uid_number> spec: clusterIP: 172.30.0.0/16 clusterIPs:1 - 172.30.0.0/16 - <second_IP_address> ipFamilies:2 - IPv4 - IPv6 ipFamilyPolicy: RequireDualStack3 ports: - port: 8080 protocol: TCP targetport: 8080 selector: name: <namespace_name> sessionAffinity: None type: ClusterIP status: loadbalancer: {}endpointsを表示するには、以下のコマンドを入力します。$ oc get endpointsendpointslicesを表示するには、以下のコマンドを入力します。$ oc get endpointslices
1.4. 高度なルートの作成 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションのトラフィックを保護し、クライアントにカスタム証明書を提供するには、エッジ、パススルー、または再暗号化 TLS 終端を使用してルートを設定します。これらの方法を用いることで、きめ細かな暗号化ルールを定義し、特定のセキュリティー要件に従ってトラフィックが復号化および再暗号化されるようにすることができます。
1.4.1. カスタム証明書を使用した edge ルートの作成 リンクのコピーリンクがクリップボードにコピーされました!
カスタム証明書を使用してトラフィックを保護するには、oc create route コマンドを実行して、エッジ TLS 終端を含むルートを設定します。この設定では、Ingress Controller で暗号化を終了させてから、宛先 Pod にトラフィックを転送します。
ルートは、Ingress Controller がルートに使用する TLS 証明書およびキーを指定します。
この手順では、カスタム証明書とエッジ TLS 終端を備えた ルート リソースを作成します。この手順では、証明書と秘密鍵のペアが現在の作業ディレクトリー内の tls.crt ファイルと tls.key ファイルに格納されていることを前提としています。必要な場合には、証明書チェーンを完了するために CA 証明書を指定することもできます。tls.crt、tls.key、および (オプションで) ca.crt を実際のパス名に置き換えます。frontend を、公開する必要のあるサービスの名前に置き換えます。www.example.com を適切な名前に置き換えます。
前提条件
- PEM エンコードされたファイルに証明書/キーのペアが必要です。ここで、証明書はルートホストに対して有効となっています。
- 証明書チェーンを完成させるために、PEM エンコードされたファイル内に別の CA 証明書が存在する場合があります。
- 公開する必要のあるサービスが必要です。
パスワードで保護されるキーファイルはサポートされません。キーファイルからパスフレーズを削除するには、以下のコマンドを使用します。
$ openssl rsa -in password_protected_tls.key -out tls.key
手順
edge TLS termination およびカスタム証明書を使用して、セキュアな
Routeリソースを作成します。$ oc create route edge --service=frontend --cert=tls.crt --key=tls.key --ca-cert=ca.crt --hostname=www.example.com生成された
Routeリソースを調べると、そのリソースには次の例のような設定が含まれているはずです。セキュアなルートの YAML 定義
apiVersion: route.openshift.io/v1 kind: Route metadata: name: frontend spec: host: www.example.com to: kind: Service name: frontend tls: termination: edge key: |- -----BEGIN PRIVATE KEY----- [...] -----END PRIVATE KEY----- certificate: |- -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- caCertificate: |- -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- # ...他のオプションは、
oc create route edge --helpを参照してください。
1.4.2. カスタム証明書を使用した re-encrypt ルートの作成 リンクのコピーリンクがクリップボードにコピーされました!
カスタム証明書を使用してトラフィックを保護するには、oc create route コマンドを実行して、TLS 終端を再暗号化するルートを設定します。この設定により、イングレスコントローラーはトラフィックを復号化し、宛先 Pod に転送する前にトラフィックを再暗号化することができます。
この手順では、カスタム証明書を使用して ルート リソースを作成し、TLS 終端を再暗号化します。この手順では、証明書と秘密鍵のペアが現在の作業ディレクトリー内の tls.crt ファイルと tls.key ファイルに格納されていることを前提としています。また、Ingress Controller がサービスの証明書を信頼できるように宛先 CA 証明書を指定する必要もあります。必要な場合には、証明書チェーンを完了するために CA 証明書を指定することもできます。tls.crt、tls.key、cacert.crt、および (オプションで) ca.crt を実際のパス名に置き換えます。frontend を、公開する必要のある Service リソースに置き換えます。www.example.com を適切な名前に置き換えます。
前提条件
- PEM エンコードされたファイルに証明書/キーのペアが必要です。ここで、証明書はルートホストに対して有効となっています。
- 証明書チェーンを完了する PEM エンコードされたファイルの別の CA 証明書が必要です。
- PEM エンコードされたファイルの別の宛先 CA 証明書が必要です。
- 公開する必要のあるサービスが必要です。
パスワードで保護されるキーファイルはサポートされません。キーファイルからパスフレーズを削除するには、以下のコマンドを使用します。
$ openssl rsa -in password_protected_tls.key -out tls.key
手順
reencrypt TLS 終端およびカスタム証明書を使用してセキュアな
Routeリソースを作成します。$ oc create route reencrypt --service=frontend --cert=tls.crt --key=tls.key --dest-ca-cert=destca.crt --ca-cert=ca.crt --hostname=www.example.com生成された
Routeリソースを調べると、そのリソースには次の例のような設定が含まれているはずです。セキュアなルートの YAML 定義
apiVersion: route.openshift.io/v1 kind: Route metadata: name: frontend spec: host: www.example.com to: kind: Service name: frontend tls: termination: reencrypt key: |- -----BEGIN PRIVATE KEY----- [...] -----END PRIVATE KEY----- certificate: |- -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- caCertificate: |- -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- destinationCACertificate: |- -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- # ...他のオプションは、
oc create route reencrypt --helpを参照してください。
1.4.3. passthrough ルートの作成 リンクのコピーリンクがクリップボードにコピーされました!
ルーターで復号化せずに暗号化されたトラフィックを宛先に直接送信するには、oc create route コマンドを実行して、パススルー終端を含むルートを設定します。この設定では、宛先 Pod が TLS 終端を処理するため、ルート上にキーや証明書は必要ありません。
前提条件
- 公開する必要のあるサービスが必要です。
手順
Routeリソースを作成します。$ oc create route passthrough route-passthrough-secured --service=frontend --port=8080結果として生成される
Routeリソースを検査すると、以下のようになります。passthrough 終端を使用したセキュアなルート
apiVersion: route.openshift.io/v1 kind: Route metadata: name: route-passthrough-secured spec: host: www.example.com port: targetPort: 8080 tls: termination: passthrough insecureEdgeTerminationPolicy: None to: kind: Service name: frontendここでは、以下のようになります。
metadata.name- オブジェクトの名前を指定します。文字数は 63 文字までです。
tls.termination-
終端フィールドがパススルーに設定されていることを示します。これは、必要な唯一のtlsフィールドです。 tls.insecureEdgeTerminationPolicyエッジ終端ポリシーの種類を指定します。オプションのパラメーター。唯一有効な値は
None、Redirect、または空の値です (無効にする場合)。宛先 Pod は、エンドポイントでトラフィックに証明書を提供します。これは、必須となるクライアント証明書をサポートするための唯一の方法です (相互認証とも呼ばれる)。
1.4.4. Ingress アノテーションでの宛先 CA 証明書を使用したルート作成 リンクのコピーリンクがクリップボードにコピーされました!
カスタム宛先 CA 証明書を使用してルートを定義するには、Ingress オブジェクトに route.openshift.io/destination-ca-certificate-secret アノテーションを適用します。この設定により、イングレスコントローラーは指定されたシークレットを使用して、宛先サービスのアイデンティティーを検証することが保証されます。
前提条件
- 証明書と秘密鍵のペアが PEM エンコードされたファイルに格納されており、その証明書はルートホストに対して有効です。
- 証明書チェーンを完成させるための、PEM エンコードされたファイル形式の別の CA 証明書があります。
- 宛先 CA 証明書は、PEM エンコードされたファイルで別途用意されています。
- 公開したいサービスがあります。
手順
次のコマンドを入力して、宛先 CA 証明書のシークレットを作成します。
$ oc create secret generic dest-ca-cert --from-file=tls.crt=<file_path>以下に例を示します。
$ oc -n test-ns create secret generic dest-ca-cert --from-file=tls.crt=tls.crt出力例
secret/dest-ca-cert createdroute.openshift.io/destination-ca-certificate-secretを Ingress アノテーションに追加します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: frontend annotations: route.openshift.io/termination: "reencrypt" route.openshift.io/destination-ca-certificate-secret: secret-ca-cert ...ここでは、以下のようになります。
宛先 CA 証明書シークレットroute.openshift.io/destination-ca-certificate-secretアノテーションを指定します。このアノテーションは Kubernetes のシークレットを参照しています。Ingress コントローラーは、アノテーションで参照されているシークレットを生成されたルートに挿入します。
出力例
apiVersion: route.openshift.io/v1 kind: Route metadata: name: frontend annotations: route.openshift.io/termination: reencrypt route.openshift.io/destination-ca-certificate-secret: secret-ca-cert spec: ... tls: insecureEdgeTerminationPolicy: Redirect termination: reencrypt destinationCACertificate: | -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- ...
1.4.5. 外部管理証明書を使用したルートの作成 リンクのコピーリンクがクリップボードにコピーされました!
ルート API の .spec.tls.externalCertificate フィールドを使用して、サードパーティーの証明書管理ソリューションで OpenShift Container Platform ルートを設定できます。シークレットを介して外部で管理されている TLS 証明書を参照できるため、手動での証明書管理が不要になります。
外部で管理される証明書を使用することでエラーが減り、証明書の更新がよりスムーズにロールアウトされます。これにより、OpenShift ルーターは更新された証明書を迅速に提供できます。外部で管理された証明書は、edge ルートと re-encrypt ルートの両方で使用できます。
前提条件
-
tls.keyキーとtls.crtキーの両方を含む、kubernetes.io/tlsタイプの PEM エンコード形式の有効な証明書またはキーペアを含むシークレットが必要です。サンプルコマンド:$ oc create secret tls myapp-tls --cert=server.crt --key=server.key。
手順
次のコマンドを実行して、シークレットと同じ namespace に
roleオブジェクトを作成し、ルーターサービスアカウントに読み取りアクセスを許可します。$ oc create role secret-reader --verb=get,list,watch --resource=secrets --resource-name=<secret-name> \ --namespace=<current-namespace>-
<secret-name>: シークレットの実際の名前を指定します。 -
<current-namespace>: シークレットとルートの両方が存在する namespace を指定します。
-
次のコマンドを実行して、シークレットと同じ namespace に
rolebindingオブジェクトを作成し、ルーターサービスアカウントを新しく作成されたロールにバインドします。$ oc create rolebinding secret-reader-binding --role=secret-reader --serviceaccount=openshift-ingress:router --namespace=<current-namespace>-
<current-namespace>: シークレットとルートの両方が存在する namespace を指定します。
-
次の例を使用して、
routeを定義し、証明書を含むシークレットを指定する YAML ファイルを作成します。セキュアなルートの YAML 定義
apiVersion: route.openshift.io/v1 kind: Route metadata: name: myedge namespace: test spec: host: myedge-test.apps.example.com tls: externalCertificate: name: <secret-name> termination: edge [...] [...]-
<secret-name>: シークレットの実際の名前を指定します。
-
次のコマンドを実行して
routeリソースを作成します。$ oc apply -f <route.yaml><route.yaml>: 生成された YAML ファイル名を指定します。シークレットが存在し、証明書/キーペアがある場合、すべての前提条件が満たされていれば、ルーターは生成された証明書を提供します。
注記.spec.tls.externalCertificateが指定されていないと、ルーターはデフォルトで生成された証明書を使用します。.spec.tls.externalCertificateフィールドを使用する場合は、.spec.tls.certificateフィールドまたは.spec.tls.keyフィールドを指定することはできません。
1.4.6. Ingress オブジェクトを介してデフォルトの証明書を使用してルートを作成する リンクのコピーリンクがクリップボードにコピーされました!
デフォルトのイングレス証明書を使用する、安全なエッジ終端ルートを生成するには、Ingress オブジェクトに空の TLS 設定を指定します。この設定はデフォルトの動作を上書きし、安全でないルートの作成を防ぎます。
前提条件
- 公開したいサービスがあります。
-
OpenShift CLI (
oc) にアクセスできる。
手順
Ingress オブジェクトの YAML ファイルを作成します。次の例では、ファイル名は
example-ingress.yamlです。Ingress オブジェクトの YAML 定義
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: frontend ... spec: rules: ... tls: - {}ここでは、以下のようになります。
spec.tls- TLS 設定を指定します。カスタム証明書を指定せずに TLS を指定するには、示されている構文を正確に使用してください。
次のコマンドを実行して、Ingress オブジェクトを作成します。
$ oc create -f example-ingress.yaml
検証
以下のコマンドを実行して、OpenShift Container Platform が Ingress オブジェクトの予期されるルートを作成したことを確認します。
$ oc get routes -o yaml出力例
apiVersion: v1 items: - apiVersion: route.openshift.io/v1 kind: Route metadata: name: frontend-j9sdd # ... spec: ... tls: insecureEdgeTerminationPolicy: Redirect termination: edge # ...ここでは、以下のようになります。
metadata.name- ルート名を指定します。ルート名には、Ingress オブジェクトの名前の後にランダムな接尾辞が付加されます。
spec.tls-
デフォルトの証明書を使用するには、ルートで
spec.certificateを指定してはいけません。 tls.termination-
ルートの終了ポリシーを指定します。ルートは、
edgeの終了ポリシーを指定する必要があります。
第2章 Ingress クラスタートラフィックの設定 リンクのコピーリンクがクリップボードにコピーされました!
2.1. Ingress クラスタートラフィックの設定の概要 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform 内の外部ネットワークとサービス間の通信を有効にするには、Ingress クラスタートラフィックを設定します。
2.1.1. クラスター外部からの通信方法 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform 内の外部ネットワークとサービス間の通信を有効にするには、適切なイングレス方式を設定します。
OpenShift Container Platform は、クラスター内で実行されるサービスを使用してクラスター外からの通信を可能にする以下の方法を提供します。なお、これらの方法は優先順位の高い順に記載されています。
- HTTP/HTTPS を使用する場合は Ingress Controller を使用する。
- HTTPS 以外の TLS で暗号化されたプロトコルを使用する場合、たとえば、SNI ヘッダーを使用する TLS の場合は、Ingress Controller を使用します。
-
それ以外の場合は、ロードバランサー、外部 IP、または
NodePortを使用します。
| 方法 | 目的 |
|---|---|
| Ingress Controller の使用 | HTTP/HTTPS トラフィックおよび HTTPS 以外の TLS で暗号化されたプロトコル (TLS と SNI ヘッダーの使用など) へのアクセスを許可します。 |
| ロードバランサーサービスを使用した外部 IP の自動割り当て | プールから割り当てられた IP アドレスを使用した非標準ポートへのトラフィックを許可します。ほとんどのクラウドプラットフォームは、ロードバランサーの IP アドレスでサービスを開始する方法を提供します。 |
| MetalLB および MetalLB Operator について | マシンネットワーク上のプールから特定の IP アドレスまたはアドレスへのトラフィックを許可します。ベアメタルインストールまたはベアメタルのようなプラットフォームの場合、MetalLB は、ロードバランサーの IP アドレスを使用してサービスを開始する方法を提供します。 |
| 外部 IP のサービスへの手動割り当て | 特定の IP アドレスを使用した非標準ポートへのトラフィックを許可します。 |
|
| クラスターのすべてのノードでサービスを公開します。 |
2.1.3. 比較: 外部 IP アドレスへのフォールトトレラントアクセス リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform において、サービスの継続的な可用性を確保し、外部 IP アクセスを維持するために、耐障害性のあるネットワーク機能を設定してください。
外部 IP アドレスへのアクセスを提供する通信メソッドの場合、IP アドレスへのフォールトトレランスアクセスは別の考慮事項となります。以下の機能は、外部 IP アドレスへのフォールトトレランスアクセスを提供します。
- IP フェイルオーバー
- IP フェイルオーバーは、一連のノードに対して仮想 IP アドレスのプールを管理します。IP フェイルオーバーは、Keepalived と Virtual Router Redundancy Protocol (VRRP) によって実装されます。IP フェイルオーバーはレイヤー 2 のメカニズムのみで、マルチキャストに依存します。マルチキャストには、一部のネットワークに欠点がある場合があります。
- MetalLB
- MetalLB にはレイヤー 2 モードがありますが、マルチキャストは使用されません。レイヤー 2 モードには、1 つのノードで外部 IP アドレスのトラフィックをすべて転送する欠点があります。
- 外部 IP アドレスの手動割り当て
- クラスターを、外部 IP アドレスをサービスに割り当てるために使用される IP アドレスブロックで設定できます。デフォルトでは、この機能は無効にされています。この機能は柔軟性がありますが、クラスターまたはネットワーク管理者に最大の負担をかけます。クラスターは外部 IP アドレス宛のトラフィックを受信する準備ができていますが、トラフィックをノードにルーティングする方法はユーザーが決定する必要があります。
2.2. サービスの ExternalIP の設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者として、クラスター外部の IP アドレスブロックを選択し、クラスター内のサービスにトラフィックを送信することができます。この機能は通常、ベアメタルハードウェアにインストールされているクラスターに最も役立ちます。
サービスに外部 IP アドレスを設定する前に、ネットワークインフラストラクチャーが外部 IP アドレス宛のトラフィックをクラスターにルーティングする必要があります。
2.2.1. ExternalIP について リンクのコピーリンクがクリップボードにコピーされました!
クラウド以外の環境でトラフィックの負荷分散を行うには、ExternalIP 機能を使用して、Service オブジェクトの spec.externalIPs[] パラメーターに外部 IP アドレスを指定します。この設定では、トラフィックをローカルノードにルーティングし、type=NodePort サービスと同様の機能を提供します。
クラウド環境の場合、クラウドの自動デプロイメントのためにロードバランサーサービスを使用し、サービスのエンドポイントをターゲットに設定します。
パラメーターの値を指定すると、OpenShift Container Platform はサービスに追加の仮想 IP アドレスを割り当てます。IP アドレスは、クラスターに定義したサービスネットワークの外部に存在することができます。
ExternalIP はデフォルトで無効になっているため、ExternalIP 機能を有効にすると、外部 IP アドレスへのクラスター内トラフィックがそのサービスに送信されるため、サービスにセキュリティーリスクが生じる可能性があります。この設定は、クラスターユーザーが外部リソース宛ての機密トラフィックをインターセプトできることを意味します。
MetalLB 実装または IP フェイルオーバーデプロイメントのいずれかを使用して、次の方法で ExternalIP リソースをサービスに接続できます。
- 外部 IP の自動割り当て
-
OpenShift Container Platform は、
spec.type=LoadBalancerを設定してServiceオブジェクトを作成する際に、IP アドレスをautoAssignCIDRsCIDR ブロックからspec.externalIPs[]配列に自動的に割り当てます。この設定では、OpenShift Container Platform はロードバランサーサービスタイプのクラウドバージョンを実装し、サービスに IP アドレスを割り当てます。自動割り当てはデフォルトでは無効になっており、クラスター管理者が「ExternalIP の設定」セクションの説明に従い設定する必要があります。 - 外部 IP の手動割り当て
-
OpenShift Container Platform は
Serviceオブジェクトの作成時にspec.externalIPs[]配列に割り当てられた IP アドレスを使用します。別のサービスによってすでに使用されている IP アドレスを指定することはできません。
MetalLB 実装または IP フェイルオーバーデプロイメントのいずれかを使用して外部 IP アドレスブロックをホストした後、外部 IP アドレスブロックがクラスターにルーティングされるようにネットワークインフラストラクチャーを設定する必要があります。この設定は、ノードからのネットワークインターフェイスに IP アドレスが設定されていないことを意味します。トラフィックを処理するには、静的な Address Resolution Protocol (ARP) エントリーなどの方法を使用して、ルーティングと外部 IP へのアクセスを設定する必要があります。
OpenShift Container Platform は以下の機能を追加して Kubernetes の ExternalIP 機能を拡張します。
- 設定可能なポリシーでの、ユーザーによる外部 IP アドレスの使用の制限
- 要求時の外部 IP アドレスのサービスへの自動割り当て
2.2.2. ExternalIP の設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform における外部 IP アドレスの使用を制御するには、Network.config.openshift.io カスタムリソース (CR) でパラメーターを設定できます。
以下のリストは、これらのパラメーターの詳細を示しています。
-
spec.externalIP.autoAssignCIDRsは、サービスの外部 IP アドレスを選択する際にロードバランサーによって使用される IP アドレスブロックを定義します。OpenShift Container Platform は、自動割り当て用の単一 IP アドレスブロックのみをサポートします。手動で ExternalIP をサービスに割り当てる場合は、数に限りのある共有 IP アドレスのポートスペースを管理する必要があるため、この設定はそ手動で設定するよりも少ない手順で行えます。自動割り当てを有効にすると、Cloud Controller Manager Operator は、設定でspec.type=LoadBalancerが定義されているServiceオブジェクトに外部 IP アドレスを割り当てます。 -
spec.externalIP.policyは、IP アドレスを手動で指定する際に許容される IP アドレスブロックを定義します。OpenShift Container Platform は、spec.externalIP.autoAssignCIDRsパラメーターで定義した IP アドレスブロックにポリシールールを適用しません。
ルーティングが正しく行われると、設定された外部 IP アドレスブロックからの外部トラフィックは、サービスが公開する TCP ポートまたは UDP ポートを介してサービスのエンドポイントに到達できます。
クラスター管理者は、ExternalIP へのルーティングを設定する必要があります。割り当てる IP アドレスブロックがクラスター内の 1 つ以上のノードで終了することを確認する必要もあります。詳細は、Kubernetes External IPs を参照してください。
OpenShift Container Platform は、自動と手動の両方の IP アドレス割り当てをサポートしています。このサポートにより、各アドレスが最大 1 つのサービスに割り当てられ、他のサービスによって公開されているポートに関係なく、各サービスが選択したポートを公開できることが保証されます。
OpenShift Container Platform の autoAssignCIDRs で定義された IP アドレスブロックを使用するには、ホストのネットワークに必要な IP アドレスの割り当ておよびルーティングを設定する必要があります。
以下の YAML は、外部 IP アドレスが設定されたサービスを説明しています。
spec.externalIPs[] が設定された Service オブジェクトの例
apiVersion: v1
kind: Service
metadata:
name: http-service
spec:
clusterIP: 172.30.163.110
externalIPs:
- 192.168.132.253
externalTrafficPolicy: Cluster
ports:
- name: highport
nodePort: 31903
port: 30102
protocol: TCP
targetPort: 30102
selector:
app: web
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 192.168.132.253
# ...
クラウドプロバイダープラットフォームでプライベートクラスターを実行する場合は、次の patch コマンドを実行して、Ingress Controller のロードバランサーの公開スコープを internal に変更できます。
$ oc -n openshift-ingress-operator patch ingresscontrollers/ingress-controller-with-nlb --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"loadBalancer":{"scope":"Internal"}}}}'
このコマンドを実行すると、Ingress Controller は OpenShift Container Platform アプリケーションのルートへのアクセスを内部ネットワークのみに制限します。
2.2.3. 外部 IP アドレスの割り当てに制限を適用する リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、IP アドレスブロックを指定してサービスの IP アドレスを許可または拒否できます。制限は、cluster-admin 権限を持たないユーザーにのみ適用されます。クラスター管理者は、サービスの spec.externalIPs[] フィールドを任意の IP アドレスに常に設定できます。
ポリシーの制限を設定する際に、以下のルールが適用されます。
-
policyが{}に設定されている場合、spec.ExternalIPs[]を使用してServiceオブジェクトを作成すると、サービスが失敗します。これは、OpenShift Container Platform のデフォルト設定です。policy: nullの場合も同じ動作になります。 policyが設定され、policy.allowedCIDRs[]またはpolicy.rejectedCIDRs[]のいずれかが設定される場合、以下のルールが適用されます。-
allowedCIDRs[]とrejectedCIDRs[]の両方が設定される場合、rejectedCIDRs[]がallowedCIDRs[]よりも優先されます。 -
allowedCIDRs[]が設定される場合、spec.ExternalIPs[]が設定されているServiceオブジェクトの作成は、指定された IP アドレスが許可される場合にのみ正常に実行されます。 -
rejectedCIDRs[]が設定される場合、spec.ExternalIPs[]が設定されているServiceオブジェクトの作成は、指定された IP アドレスが拒否されていない場合にのみ正常に実行されます。
-
手順
ポリシーオブジェクトのspec.ExternalIP.policyパラメーターに Classless Inter-Domain Routing (CIDR) アドレスブロックを指定することで、IP アドレスポリシーを設定します。policyオブジェクトとその CIDR パラメーターの JSON 形式の例{ "policy": { "allowedCIDRs": [], "rejectedCIDRs": [] } }
2.2.4. ポリシーオブジェクトの例 リンクのコピーリンクがクリップボードにコピーされました!
さまざまな spec.externalIP.policy 設定を理解するには、ポリシーオブジェクトの例 セクションの例を参照してください。
以下の例のポリシーは、外部 IP アドレスが指定されたサービスを OpenShift Container Platform が作成できないようにします。
Service オブジェクトの spec.externalIPs[] に指定された値を拒否するポリシーの例
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
externalIP:
policy: {}
# ...
以下の例では、allowedCIDRs および rejectedCIDRs フィールドの両方が設定されます。
許可される、および拒否される CIDR ブロックの両方を含むポリシーの例
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
externalIP:
policy:
allowedCIDRs:
- 172.16.66.10/23
rejectedCIDRs:
- 172.16.66.10/24
# ...
以下の例では、policy は {} に設定されます。これが設定されている場合、oc get networks.config.openshift.io -o yaml コマンドを使用して設定を表示しても policy パラメーターはコマンド出力に表示されません。policy: null の場合も同じ動作になります。
Service オブジェクトの spec.externalIPs[] に指定された値を許可するポリシーの例
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
clusterNetwork:
- cidr: 10.128.0.0/14
hostPrefix: 23
externalIP:
policy: {}
# ...
2.2.5. ExternalIP アドレスブロックの設定 リンクのコピーリンクがクリップボードにコピーされました!
ExternalIP アドレスブロックをよりよく理解するには、cluster という名前のネットワークカスタムリソース (CR) によって定義されている ExternalIP アドレスブロックの設定例を参照してください。ネットワーク CR は config.openshift.io API グループに含まれます。
クラスターのインストール時に、Cluster Version Operator (CVO) は cluster という名前のネットワーク CR を自動的に作成します。このタイプのその他の CR オブジェクトの作成はサポートされていません。
以下の YAML は、Network.config.openshift.io CR の cluster という名前の環境における ExternalIP 設定を記述しています。
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
externalIP:
autoAssignCIDRs: []
policy:
...
-
autoAssignCIDRs: サービスへの外部 IP アドレスの自動割り当てに使用できる CIDR 形式の IP アドレスブロックを定義します。1 つの IP アドレス範囲のみが許可されます。 -
ポリシー: サービスへの IP アドレスの手動割り当てに関する制限を定義します。制限が定義されていない場合は、Serviceオブジェクトにspec.externalIPフィールドを指定しても許可されません。デフォルトで、制限は定義されません。
以下の YAML は、Network.config.openshift.io CR の ポリシー スタンザのフィールドを記述しています。
policy:
allowedCIDRs: []
rejectedCIDRs: []
-
allowedCIDRs:CIDR 形式で指定された、許可された IP アドレス範囲のリスト。 -
rejectedCIDRs: 拒否された IP アドレス範囲のリスト (CIDR 形式)。
次の設定例では、外部 IP アドレスプールの設定を示します。
以下の YAML は、外部 IP アドレスの自動割り当てを有効にする spec.externalIP.autoAssignCIDRs の 設定例を示しています。
spec.externalIP.autoAssignCIDRs が設定された設定例
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
...
externalIP:
autoAssignCIDRs:
- 192.168.132.254/29
以下の YAML 設定には、許可および拒否される CIDR 範囲のポリシールールを設定する spec.externalIP.policy 設定が含まれています。
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
...
externalIP:
policy:
allowedCIDRs:
- 192.168.132.0/29
- 192.168.132.8/29
rejectedCIDRs:
- 192.168.132.7/32
2.2.6. クラスターの外部 IP アドレスブロックの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者として、外部 IP 設定を設定することで、外部トラフィックがクラスターに到達するための予測可能なエントリーポイントを提供できます。
以下のリストは、これらの外部 IP 設定の詳細を示しています。
-
Serviceオブジェクトのspec.clusterIPフィールドを自動的に設定するために OpenShift Container Platform によって使用される ExternalIP アドレスブロック。 -
IP アドレスを制限するポリシーオブジェクトは
Serviceオブジェクトのspec.clusterIP配列に手動で割り当てられます。
前提条件
-
OpenShift CLI (
oc) をインストールします。 -
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。
手順
オプション: 現在の外部 IP 設定を表示するには、以下のコマンドを入力します。
$ oc describe networks.config cluster設定を編集するには、以下のコマンドを入力します。
$ oc edit networks.config cluster以下の例のように ExternalIP 設定を変更します。
apiVersion: config.openshift.io/v1 kind: Network metadata: name: cluster spec: ... externalIP: ...-
externalIP:externalIPスタンザの設定を指定します。
-
更新された ExternalIP 設定を確認するには、以下のコマンドを入力します。
$ oc get networks.config cluster -o go-template='{{.spec.externalIP}}{{"\n"}}'
2.2.8. 次のステップ リンクのコピーリンクがクリップボードにコピーされました!
2.3. Ingress Controller を使用してイングレスクラスターのトラフィックを設定する リンクのコピーリンクがクリップボードにコピーされました!
Ingress Controller を使用すると、外部ユーザーがクラスター内で実行されているサービスとどのように通信するかを制御できます。
イングレスコントローラーを使用したイングレスクラスタートラフィックの設定ドキュメントに記載されている手順を開始する前に、以下の前提条件を満たしていることを確認してください。クラスター管理者は、以下の前提条件を実行します。
- 要求がクラスターに到達できるように、クラスターネットワーク環境に対して外部ポートをセットアップします。
クラスター管理者ロールを持つユーザーが 1 名以上いることを確認します。このロールをユーザーに追加するには、以下のコマンドを実行します。
$ oc adm policy add-cluster-role-to-user cluster-admin username- 1 つ以上のマスターと 1 つ以上のノードを持つ OpenShift Container Platform クラスターと、クラスターへのネットワークアクセス権を持つクラスター外部のシステムを用意します。この手順では、外部システムがクラスターと同じサブセットにあることを前提とします。別のサブセットの外部システムに必要な追加のネットワーク設定は、このトピックでは扱いません。
2.3.1. Ingress Controller およびルートの使用 リンクのコピーリンクがクリップボードにコピーされました!
Ingress Controller を使用すると、OpenShift Container Platform クラスターへの外部アクセスを許可できます。Ingress Operator は Ingress Controller およびワイルドカード DNS を管理します。
Ingress Controller は外部要求を許可し、設定されたルートに基づいてそれらをプロキシー送信するよう設定されます。これは、HTTP、SNI を使用する HTTPS、SNI を使用する TLS に限定されており、SNI を使用する TLS で機能する Web アプリケーションやサービスには十分な設定です。
管理者と連携して Ingress Controller を設定します。外部要求を許可し、設定されたルートに基づいてそれらをプロキシー送信するように Ingress Controller を設定します。
管理者はワイルドカード DNS エントリーを作成してから Ingress Controller を設定できます。その後は管理者に問い合わせることなく edge Ingress Controller と連携できます。
デフォルトで、クラスター内のすべての Ingress Controller はクラスター内の任意のプロジェクトで作成されたすべてのルートを許可します。Ingress コントローラーには、以下の特徴があります。
- デフォルトでは 2 つのレプリカを持つため、2 つのコンピュートノードで実行する必要があります。
- 追加のノードにレプリカを組み込むためにスケールアップすることができます。
2.3.2. プロジェクトおよびサービスの作成 リンクのコピーリンクがクリップボードにコピーされました!
公開するプロジェクトとサービスが存在しない場合は、プロジェクトを作成してからサービスを作成します。
プロジェクトとサービスがすでに存在する場合は、サービスを公開してルートを作成する手順に進みます。
前提条件
-
OpenShift CLI (
oc) をインストールし、クラスター管理者としてログインしている。
手順
oc new-projectコマンドを実行して、サービス用の新しいプロジェクトを作成します。$ oc new-project <project_name>oc new-appコマンドを使用してサービスを作成します。$ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.gitサービスが作成されたことを確認するには、以下のコマンドを実行します。
$ oc get svc -n <project_name>出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-ex ClusterIP 172.30.197.157 <none> 8080/TCP 70s注記デフォルトで、新規サービスには外部 IP アドレスがありません。
2.3.3. ルートの作成によるサービスの公開 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform 上で動作するアプリケーションへの外部アクセスを有効にするには、oc expose コマンドを使用してサービスをルートとして公開します。
前提条件
- OpenShift Container Platform にログインしている。
手順
公開するサービスが置かれているプロジェクトにログインします。
$ oc project <project_name>oc expose serviceコマンドを実行して、ルートを公開します。$ oc expose service nodejs-ex出力例
route.route.openshift.io/nodejs-ex exposedサービスが公開されていることを確認するには、
curlなどのツールを使用して、クラスター外からサービスにアクセスできることを確認します。ルートのホスト名を見つけるには、次のコマンドを入力します。
$ oc get route出力例
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD nodejs-ex nodejs-ex-myproject.example.com nodejs-ex 8080-tcp Noneホストが GET 要求に応答することを確認するには、次のコマンドを入力します。
curlコマンドの例$ curl --head nodejs-ex-myproject.example.com出力例
HTTP/1.1 200 OK ...
2.3.4. OpenShift Container Platform での Ingress シャーディング リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でルーティングのパフォーマンスを最適化するには、シャードを作成して、複数の Ingress Controller 間で受信トラフィックの負荷分散を行います。
OpenShift Container Platform では、Ingress Controller はすべてのルートを提供することも、ルートのサブセットを提供することもできます。デフォルトでは、イングレスコントローラーはクラスター内のどの名前空間で作成されたルートでも処理します。クラスターに Ingress コントローラーを追加することで、選択した特性に基づいてルートのサブセットであるシャードを作成し、ルーティングを最適化できます。ルートをシャードのメンバーとしてマークするには、ルートまたは namespace の メタデータ フィールドでラベルを使用します。Ingress Controller は、選択式 とも呼ばれる セレクター を使用して、ルートのプール全体からルートのサブセットを選択し、サービスを提供します。
トラフィックを分離して特定のイングレスコントローラーにルーティングしたい場合は、イングレスシャーディングを使用することもできます。
デフォルトでは、各ルートはクラスターのデフォルトドメインを使用します。ただし、代わりにルーターのドメインを使用するようにルートを設定できます。
2.3.5. Ingress Controller のシャーディング リンクのコピーリンクがクリップボードにコピーされました!
Ingress シャーディング (ルーターシャーディング とも呼ばれる) を使用すると、ルート、名前空間、またはその両方にラベルを追加することで、一連のルートを複数のルーターに分散させることができます。
Ingress Controller は、対応する一連のセレクターを使用して、指定されたラベルが含まれるルートのみを許可します。各 Ingress シャードは、特定の選択式を使用してフィルタリングされたルートで構成されます。
トラフィックがクラスターに送信される主要なメカニズムとして、Ingress Controller への要求が大きくなる可能性があります。クラスター管理者として、以下のコンポーネントにルートをシャーディングできます。
- Ingress Controller またはルーターを複数のルートに分散し、変更に対する応答を高速化する。
- 特定のルートに、他のルートとは異なる信頼性保証を割り当てる。
- 特定の Ingress Controller に異なるポリシーを定義することを許可します。
- 特定のルートのみが追加機能を使用することを許可します。
- たとえば、異なるアドレスで異なるルートを公開し、内部ユーザーおよび外部ユーザーが異なるルートを認識できるようにします。
- Blue-Green デプロイ時に、あるバージョンのアプリケーションから別のバージョンにトラフィックを転送する。
Ingress Controller がシャーディングされると、特定のルートがグループ内の 0 個以上の Ingress Controller に受け入れられます。ルートのステータスから、Ingress Controller がルートを許可したかどうかがわかります。Ingress Controller は、ルートがシャードに固有のものである場合にのみルートを許可します。
シャーディングを使用すると、ルートのサブセットを複数の Ingress Controller に分散できます。ルートのサブセットは、重複なし (従来 のシャーディング) にすることも、重複あり (オーバーラップ シャーディング) にすることもできます。
次の表に、3 つのシャーディング方法の概要を示します。
| シャーディング方法 | 説明 |
|---|---|
| namespace セレクター | Ingress Controller に namespace セレクターを追加すると、namespace セレクターに一致するラベルを持つ namespace 内のすべてのルートが Ingress シャードに追加されます。namespace 内に作成されたすべてのルートを Ingress Controller で提供する場合は、この方法を検討してください。 |
| ルートセレクター | Ingress Controller にルートセレクターを追加すると、ルートセレクターに一致するラベルを持つすべてのルートが Ingress シャードに追加されます。ルートのサブセットのみ、または namespace 内の特定のルートのみを Ingress Controller で提供する場合は、この方法を検討してください。 |
| namespace およびルートセレクター | namespace セレクターとルートセレクター両方の方法で Ingress Controller のスコープを指定します。namespace セレクターとルートセレクター両方の方法の柔軟性が必要な場合は、この方法を検討してください。 |
2.3.5.1. 従来のシャーディングの例 リンクのコピーリンクがクリップボードにコピーされました!
従来のシャーディングを理解するには、キーの値が finance と ops に設定されたラベルセレクター spec.namespaceSelector.matchExpressions を持つ設定済みの Ingress Controller finops-router の例を参照してください。
finops-router の YAML 定義の例
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: finops-router
namespace: openshift-ingress-operator
spec:
namespaceSelector:
matchExpressions:
- key: name
operator: In
values:
- finance
- ops
キー値が dev に設定されたラベルセレクター spec.namespaceSelector.matchLabels.name を持つ、設定済みの Ingress Controller dev-router の例:
dev-router の YAML 定義の例
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: dev-router
namespace: openshift-ingress-operator
spec:
namespaceSelector:
matchLabels:
name: dev
すべてのアプリケーションルートが、それぞれ name:finance、name:ops、name:dev などのラベルが付けられた別々の namespace にある場合は、設定によって 2 つの Ingress Controller 間でルートが効果的に分散されます。コンソール、認証、およびその他の目的の OpenShift Container Platform ルートは処理しないでください。
前のシナリオでは、シャーディングは重複するサブセットを持たないパーティション設定の特別なケースとなります。ルートは複数のルーターシャード間で分割されます。
デフォルト の Ingress Controller は、namespaceSelector または routeSelector フィールドに除外対象のルートが含まれていない限り、引き続きすべてのルートを提供します。デフォルトの Ingress Controller からルートを除外する方法の詳細は、この Red Hat ナレッジベースのソリューション と「デフォルトの Ingress Controller のシャーディング」のセクションを参照してください。
2.3.5.2. 重複シャーディングの例 リンクのコピーリンクがクリップボードにコピーされました!
キー値が dev と ops に設定されたラベルセレクター spec.namespaceSelector.matchExpressions を持つ、設定済みの Ingress Controller devops-router の例:
devops-router の YAML 定義の例
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: devops-router
namespace: openshift-ingress-operator
spec:
namespaceSelector:
matchExpressions:
- key: name
operator: In
values:
- dev
- ops
name:dev および name:ops という 名前の namespace のルートは、2 つの異なる Ingress Controller によって処理されるようになりました。この設定では、ルートのサブセットが重複しています。
重複するルートのサブセットを使用すると、より複雑なルーティングルールを作成できます。たとえば、優先度の低いトラフィックを devops-router に送信しながら、優先度の高いトラフィックを専用の finops-router に迂回させることができます。
2.3.5.3. デフォルトの Ingress Controller のシャーディング リンクのコピーリンクがクリップボードにコピーされました!
名前空間セレクターまたはルートセレクターを使用することで、特定のラベルを持つルートを Ingress コントローラーが処理しないように制限できます。
新しい Ingress シャードを作成した後に、デフォルトの Ingress Controller と、新しい Ingress シャードの両方により許可されるルートが存在する場合があります。これは、デフォルトの Ingress Controller にセレクターがなく、デフォルトですべてのルートを許可するためです。
以下の手順では、名前空間セレクターを使用することで、デフォルトの Ingress コントローラーが新しくシャーディングされた finance、ops、dev ルートを処理しないように制限します。これにより、Ingress シャードがさらに分離されます。
OpenShift Container Platform のすべての管理ルートを同じ Ingress Controller で保持する必要があります。したがって、これらの重要なルートを除外するセレクターをデフォルトの Ingress Controller に追加することは避けてください。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - プロジェクト管理者としてログインしている。
手順
次のコマンドを実行して、デフォルトの Ingress Controller を変更します。
$ oc edit ingresscontroller -n openshift-ingress-operator defaultIngress Controller を編集して、
finance、ops、およびdevラベルのいずれかを持つルートを除外するnamespaceSelectorを含めます。apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: namespaceSelector: matchExpressions: - key: name operator: NotIn values: - finance - ops - devデフォルトの Ingress コントローラーは
、name:finance、name:ops、name:devというラベルが付いた名前空間を処理できなくなりました。
2.3.5.4. Ingress シャーディングと DNS リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者として、プロジェクト内の各ルーターに対して個別の DNS エントリーを追加するようにしてください。ルーターは不明なルートを別のルーターに転送することはありません。
以下の例を考慮してください。
-
Router A はホスト 192.168.0.5 にあり、
*.foo.comのルートを持つ。 -
Router B はホスト 192.168.1.9 にあり、
*.example.comのルートを持つ。
個別の DNS エントリーは、*.foo.com をルーター A をホストするノードに解決し、*.example.com をルーター B をホストするノードに解決する必要があります。
-
*.foo.com A IN 192.168.0.5 -
*.example.com A IN 192.168.1.9
2.3.5.5. ルートラベルを使用した Ingress Controller のシャーディングの設定 リンクのコピーリンクがクリップボードにコピーされました!
ルートラベルを使用すると、Ingress Controller のシャーディングを設定して、ルートセレクターによって選択された任意の名前空間内の任意のルートを Ingress Controller が処理するようにすることができます。
図2.1 ルートラベルを使用したイングレスのシャーディング
Ingress Controller のシャーディングは、一連の Ingress Controller 間で着信トラフィックの負荷を分散し、トラフィックを特定の Ingress Controller に分離する際に役立ちます。たとえば、Company A のトラフィックをある Ingress Controller に指定し、Company B を別の Ingress Controller に指定できます。
手順
router-internal.yamlファイルを編集します。apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: sharded namespace: openshift-ingress-operator spec: domain: <apps-sharded.basedomain.example.net> nodePlacement: nodeSelector: matchLabels: node-role.kubernetes.io/worker: "" routeSelector: matchLabels: type: sharded-
<apps-sharded.basedomain.example.net>: Ingress Controller で使用するドメインを指定します。このドメインは、デフォルトの Ingress Controller ドメインとは異なる必要があります。
-
Ingress Controller の
router-internal.yamlファイルを適用します。# oc apply -f router-internal.yamlIngress Controller は、
type: shardedというラベルのある namespace のルートを選択します。router-internal.yamlで設定されたドメインを使用して、新しいルートを作成します。$ oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net
2.3.5.6. namespace ラベルを使用した Ingress Controller のシャーディングの設定 リンクのコピーリンクがクリップボードにコピーされました!
名前空間ラベルを使用すると、Ingress Controller のシャーディングを設定して、名前空間セレクターによって選択された任意の名前空間内の任意のルートを Ingress Controller が処理するようにすることができます。
図2.2 名前空間ラベルを使用したイングレスのシャーディング
Ingress Controller のシャーディングは、一連の Ingress Controller 間で着信トラフィックの負荷を分散し、トラフィックを特定の Ingress Controller に分離する際に役立ちます。たとえば、Company A のトラフィックをある Ingress Controller に指定し、Company B を別の Ingress Controller に指定できます。
手順
router-internal.yamlファイルを編集します。$ cat router-internal.yaml出力例
apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: sharded namespace: openshift-ingress-operator spec: domain: <apps-sharded.basedomain.example.net> nodePlacement: nodeSelector: matchLabels: node-role.kubernetes.io/worker: "" namespaceSelector: matchLabels: type: sharded-
<apps-sharded.basedomain.example.net>: Ingress Controller で使用するドメインを指定します。このドメインは、デフォルトの Ingress Controller ドメインとは異なる必要があります。
-
Ingress Controller の
router-internal.yamlファイルを適用します。$ oc apply -f router-internal.yamlIngress Controller は、
type: shardedというラベルのある namespace セレクターによって選択される namespace のルートを選択します。router-internal.yamlで設定されたドメインを使用して、新しいルートを作成します。$ oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net
2.3.5.7. Ingress Controller シャーディングのルート作成 リンクのコピーリンクがクリップボードにコピーされました!
ルートを使用すると、アプリケーションを URL でホストできます。Ingress Controller のシャーディングは、一連の Ingress Controller 間での着信トラフィック負荷のバランスをとるのに役立ちます。Ingress Controller のシャーディング機能を使用すると、トラフィックを特定の Ingress Controller に分離することもできます。たとえば、Company A のトラフィックをある Ingress Controller に指定し、Company B を別の Ingress Controller に指定できます。
以下の手順では、例として hello-openshift アプリケーションを使用して、Ingress Controller シャーディングのルートを作成する方法を説明します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - プロジェクト管理者としてログインしている。
- ポートを公開する Web アプリケーションと、そのポート上のトラフィックをリッスンする HTTP または TLS エンドポイントがある。
- シャーディング用に Ingress Controller を設定している。
手順
次のコマンドを実行して、
hello-openshiftというプロジェクトを作成します。$ oc new-project hello-openshift以下のコマンドを実行してプロジェクトに Pod を作成します。
$ oc create -f https://raw.githubusercontent.com/openshift/origin/master/examples/hello-openshift/hello-pod.json以下のコマンドを実行して、
hello-openshiftというサービスを作成します。$ oc expose pod/hello-openshifthello-openshift-route.yamlというルート定義を作成します。シャーディング用に作成したルートの YAML 定義
apiVersion: route.openshift.io/v1 kind: Route metadata: labels: type: sharded name: hello-openshift-edge namespace: hello-openshift spec: subdomain: hello-openshift tls: termination: edge to: kind: Service name: hello-openshiftここでは、以下のようになります。
type-
ラベルキーとその対応するラベル値は、Ingress Controller で指定されたものと一致する必要があることを指定します。この例では、Ingress Controller にはラベルキーと値
type: shardedがあります。 subdomain-
サブドメインフィールドの値を使用して公開されるルートを指定します。subdomainフィールドを指定するときは、ホスト名を未設定のままにしておく必要があります。ホストフィールドとサブドメインフィールドの両方を指定した場合、ルートはホストフィールドの値を使用し、サブドメインフィールドは無視します。
次のコマンドを実行し、
hello-openshift-route.yamlを使用してhello-openshiftアプリケーションへのルートを作成します。$ oc -n hello-openshift create -f hello-openshift-route.yaml
検証
次のコマンドを使用して、ルートのステータスを取得します。
$ oc -n hello-openshift get routes/hello-openshift-edge -o yaml結果の
Routeリソースは次のようになります。出力例
apiVersion: route.openshift.io/v1 kind: Route metadata: labels: type: sharded name: hello-openshift-edge namespace: hello-openshift spec: subdomain: hello-openshift tls: termination: edge to: kind: Service name: hello-openshift status: ingress: - host: hello-openshift.<apps-sharded.basedomain.example.net> routerCanonicalHostname: router-sharded.<apps-sharded.basedomain.example.net> routerName: shardedここでは、以下のようになります。
host-
イングレスコントローラー (ルーター) がルートを公開するために使用するホスト名を指定します。
hostフィールドの値は、Ingress Controller によって自動的に決定され、そのドメインを使用します。この例では、Ingress Controller のドメインは<apps-sharded.basedomain.example.net>です。 <apps-sharded.basedomain.example.net>- Ingress コントローラーのホスト名を指定します。ホスト名が設定されていない場合、ルートは代わりにサブドメインを使用できます。サブドメインを指定すると、ルートを公開する Ingress Controller のドメインが自動的に使用されます。ルートが複数の Ingress Controller によって公開される場合、ルートは複数の URL でホストされます。
routerName-
Ingress コントローラーの名前を指定します。この例では、Ingress Controller の名前は
shardedです。
2.3.5.8. 関連情報 リンクのコピーリンクがクリップボードにコピーされました!
2.4. Ingress Controller エンドポイント公開戦略の設定 リンクのコピーリンクがクリップボードにコピーされました!
Ingress Controller のエンドポイントを外部システムに公開し、OpenShift Container Platform でロードバランサーとの統合を有効にするには、endpointPublishingStrategy パラメーターを設定します。
Red Hat OpenStack Platform (RHOSP) では、クラウドプロバイダーがヘルスモニターを作成するように設定されている場合にのみ、LoadBalancerService エンドポイントの公開ストラテジーがサポートされます。RHOSP 16.2 の場合、このストラテジーは Amphora Octavia プロバイダーを使用する場合にのみ可能です。
詳細は、RHOSP インストールドキュメントの「RHOSP Cloud Controller Manager オプションの設定」セクションを参照してください。
2.4.1. Ingress Controller エンドポイントの公開ストラテジー リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で Ingress Controller エンドポイントを外部ネットワークに公開するには、NodePortService エンドポイント公開ストラテジーまたは HostNetwork エンドポイント公開ストラテジーのいずれかを設定します。
NodePortServiceエンドポイント公開ストラテジー-
NodePortServiceエンドポイント公開ストラテジーは、Kubernetes NodePort サービスを使用して Ingress Controller を公開します。
この設定では、Ingress Controller のデプロイメントはコンテナーのネットワークを使用します。NodePortService はデプロイメントを公開するために作成されます。特定のノードポートは OpenShift Container Platform によって動的に割り当てられますが、静的ポートの割り当てをサポートするために、管理対象の NodePortService のノードポートフィールドへの変更が保持されます。
図2.3 NodePortService の図
前述の図では、OpenShift Container Platform Ingress NodePort エンドポイントの公開戦略に関する以下のような概念を示しています。
- クラスターで利用可能なノードにはすべて、外部からアクセス可能な独自の IP アドレスが割り当てられています。クラスター内で動作するサービスは、全ノードに固有の NodePort にバインドされます。
-
たとえば、クライアントが図に示す IP アドレス
10.0.128.4に接続してダウンしているノードに接続した場合に、ノードポートは、サービスを実行中で利用可能なノードにクライアントを直接接続します。このシナリオでは、ロードバランシングは必要ありません。イメージが示すように、10.0.128.4アドレスがダウンしており、代わりに別の IP アドレスを使用する必要があります。
Ingress Operator は、サービスの .spec.ports[].nodePort フィールドへの更新を無視します。
デフォルトで、ポートは自動的に割り当てられ、各種の統合用のポート割り当てにアクセスできます。ただし、既存のインフラストラクチャーと統合するために静的ポートの割り当てが必要になることがありますが、これは動的ポートに対応して簡単に再設定できない場合があります。静的ノードポートとの統合を実行するには、マネージドのサービスリソースを直接更新できます。
詳細は、NodePort に関する Kubernetes サービスのドキュメント を参照してください。
ホストネットワークエンドポイント公開ストラテジー*-
HostNetworkエンドポイント公開ストラテジーは、Ingress Controller がデプロイされるノードポートで Ingress Controller を公開します。
HostNetwork エンドポイント公開ストラテジーを持つ Ingress Controller には、ノードごとに 1 つの Pod レプリカのみを設定できます。n のレプリカを使用する場合、それらのレプリカをスケジュールできる n 以上のノードを使用する必要があります。各 Pod はスケジュールされるノードホストでポート 80 および 443 を要求するので、同じノードで別の Pod がそれらのポートを使用している場合、レプリカをノードにスケジュールすることはできません。
HostNetwork オブジェクトには、オプションのバインディングポートのデフォルト値が httpPort:80、httpsPort:443、statsPort:1936 の hostNetwork フィールドがあります。ネットワークに異なるバインディングポートを指定することで、HostNetwork ストラテジーに対して、同じノードに複数の Ingress Controller をデプロイできます。
例
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: internal
namespace: openshift-ingress-operator
spec:
domain: example.com
endpointPublishingStrategy:
type: HostNetwork
hostNetwork:
httpPort: 80
httpsPort: 443
statsPort: 1936
2.4.1.1. Ingress Controller エンドポイント公開スコープの内部への設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者として、クラスターがプライベートであることを指定せずに新しいクラスターをインストールすると、デフォルトの Ingress コントローラーが 外部スコープ に設定された状態で作成されます。外部 スコープのイングレスコントローラーを 内部スコープ に変更できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。
手順
外部スコープのイングレスコントローラーを内部スコープに変更するには、次のコマンドを入力します。$ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"Internal"}}}}'
検証
Ingress Controller のステータスを確認するには、次のコマンドを入力します。
$ oc -n openshift-ingress-operator get ingresscontrollers/default -o yamlステータス状態が
Progressingの場合は、さらにアクションを実行する必要があるかどうかを示します。たとえば、ステータスの状態によっては、次のコマンドを入力して、サービスを削除する必要があることを示している可能性があります。$ oc -n openshift-ingress delete services/router-defaultサービスを削除すると、Ingress Operator はサービスを
Internalとして再作成します。
2.4.1.2. Ingress Controller エンドポイント公開スコープの外部への設定 リンクのコピーリンクがクリップボードにコピーされました!
インストール時またはインストール後のタスクとして、クラスター管理者は Ingress Controller を Internal に設定できます。さらに、クラスター管理者は 内部 イングレスコントローラーを 外部イングレス コントローラーに変更できます。
クラスターがプライベートであることを指定せずに新しいクラスターをインストールすると、デフォルトの Ingress コントローラーが スコープ を External に設定して作成されます。
一部のプラットフォームでは、サービスを削除して再作成する必要があります。
スコープを変更すると、場合によっては数分間、Ingress トラフィックが中断される可能性があります。これが該当するのは、サービスを削除して再作成する必要があるプラットフォームです。理由は、この手順により、OpenShift Container Platform が既存のサービスロードバランサーのプロビジョニングを解除して新しいサービスロードバランサーをプロビジョニングし、DNS を更新する可能性があるためです。
前提条件
-
OpenShift CLI (
oc) がインストールされている。
手順
内部スコープのイングレスコントローラーを外部スコープに変更するには、次のコマンドを入力します。$ oc -n openshift-ingress-operator patch ingresscontrollers/private --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"External"}}}}'
検証
Ingress Controller のステータスを確認するには、次のコマンドを入力します。
$ oc -n openshift-ingress-operator get ingresscontrollers/default -o yamlステータス状態が
Progressingの場合は、さらにアクションを実行する必要があるかどうかを示します。たとえば、ステータスの状態によっては、次のコマンドを入力して、サービスを削除する必要があることを示している可能性があります。$ oc -n openshift-ingress delete services/router-defaultサービスを削除すると、Ingress Operator はサービスを
Externalとして再作成します。
2.4.1.3. Ingress Controller への単一の NodePort サービスの追加 リンクのコピーリンクがクリップボードにコピーされました!
ポートの競合を防ぐため、プロジェクトごとに NodePort タイプの サービス を作成する代わりに、NodePortService エンドポイント公開ストラテジーを使用できるカスタム Ingress コントローラーを作成します。
すでに HostNetwork Ingress Controller がインストールされている可能性のあるノードに、Ingress シャーディングを通じて一連のルートを適用したい場合は、Ingress Controller にこの設定を検討してください。
各プロジェクトに NodePort タイプの Service を設定する前に、次の考慮事項を確認してください。
-
NodeportIngress Controller ドメインに対して、ワイルドカード DNS レコードを作成する必要があります。Nodeport Ingress Controller ルートには、ワーカーノードのアドレスからアクセスできます。ルートに必要な DNS レコードの詳細は、「user-provisioned DNS 要件」を参照してください。 -
サービス用のルートを公開し、カスタム Ingress Controller ドメインの
--hostname引数を指定する必要があります。 -
アプリケーション Pod にアクセスできるようにするには、
NodePortタイプのServiceに割り当てられているポートをルートに追加する必要があります。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - ワイルドカード DNS レコードが作成されている。
手順
Ingress Controller のカスタムリソース (CR) ファイルを作成します。
IngressControllerオブジェクトの情報を定義する CR ファイルの例apiVersion: v1 items: - apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: <custom_ic_name> namespace: openshift-ingress-operator spec: replicas: 1 domain: <custom_ic_domain_name> nodePlacement: nodeSelector: matchLabels: <key>: <value> namespaceSelector: matchLabels: <key>: <value> endpointPublishingStrategy: type: NodePortService # ...ここでは、以下のようになります。
metadata.name-
IngressControllerCR のカスタム名を指定します。 仕様ドメイン-
Ingress Controller がサービスを提供する DNS 名を指定します。たとえば、デフォルトのイングレスコントローラーのドメインは
apps.ipi-cluster.example.comなので、<custom_ic_domain_name>にはnodeportsvc.ipi-cluster.example.comを指定します。 nodeSelector.matchLabels.<key>- カスタム Ingress コントローラーを含むノードのラベルを指定します。
namespaceSelector.matchLabels.<key>-
一連の名前空間のラベルを指定します。
<key>:<value>は、キーと値のペアのマップに置き換えます。<key>は新しいラベルの一意の名前、<value>はその値です。たとえば、ingresscontroller: custom-icです。
oc label nodeコマンドを使用してノードにラベルを追加します。$ oc label node <node_name> <key>=<value>-
<key>=<value>: ここで、<value> はIngressControllerCR のnodePlacementセクションで指定されたキーと値のペアと一致する必要があります。
-
IngressControllerオブジェクトを作成します。$ oc create -f <ingress_controller_cr>.yamlIngressControllerCR 用に作成されたサービスのポートを確認します。$ oc get svc -n openshift-ingressrouter-nodeport-custom-ic3サービスのポート80:32432/TCPを示す出力例NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-internal-default ClusterIP 172.30.195.74 <none> 80/TCP,443/TCP,1936/TCP 223d router-nodeport-custom-ic3 NodePort 172.30.109.219 <none> 80:32432/TCP,443:31366/TCP,1936:30499/TCP 155m新しいプロジェクトを作成するために、次のコマンドを入力します。
$ oc new-project <project_name>新しい namespace にラベルを付けるために、次のコマンドを入力します。
$ oc label namespace <project_name> <key>=<value>-
<key>=<value>:: ここで、<key>=<value> はIngress Controller CR のnamespaceSelectorセクションの値と一致する必要があります。
-
クラスター内に新しいアプリケーションを作成します。
$ oc new-app --image=<image_name>-
<image_name>:<image_name>の例はquay.io/openshifttest/hello-openshift:multiarchです。
-
サービスの
Routeオブジェクトを作成して、Pod がサービスを使用してアプリケーションをクラスターの外部に公開できるようにします。$ oc expose svc/<service_name> --hostname=<svc_name>-<project_name>.<custom_ic_domain_name>注記--hostname引数で、カスタム Ingress Controller のドメイン名を指定する必要があります。これを行わない場合、Ingress Operator がデフォルトの Ingress Controller を使用してクラスターのすべてのルートを提供します。ルートのステータスが
Admittedであり、カスタム Ingress Controller のメタデータがルートに含まれていることを確認します。$ oc get route/hello-openshift -o json | jq '.status.ingress'出力例
# ... { "conditions": [ { "lastTransitionTime": "2024-05-17T18:25:41Z", "status": "True", "type": "Admitted" } ], [ { "host": "hello-openshift.nodeportsvc.ipi-cluster.example.com", "routerCanonicalHostname": "router-nodeportsvc.nodeportsvc.ipi-cluster.example.com", "routerName": "nodeportsvc", "wildcardPolicy": "None" } ], }デフォルトの
IngressControllerCR を更新して、デフォルトの Ingress Controller がNodePortタイプのServiceを管理しないようにします。他のすべてのクラスタートラフィックは、引き続きデフォルトの Ingress Controller によって監視します。$ oc patch --type=merge -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"namespaceSelector":{"matchExpressions":[{"key":"<key>","operator":"NotIn","values":["<value>]}]}}}'
検証
次のコマンドを入力して、DNS エントリーがクラスターの内外にルーティングできることを確認します。このコマンドでは、上記の手順で
oc label nodeコマンドを実行してラベルを追加したノードの IP アドレスが出力されます。$ dig +short <svc_name>-<project_name>.<custom_ic_domain_name>クラスターが DNS 解決に外部 DNS サーバーの IP アドレスを使用していることを確認するために、次のコマンドを入力してクラスターの接続を確認します。
$ curl <svc_name>-<project_name>.<custom_ic_domain_name>:<port>1 <custom_ic_domain_name>:<port>: ここで、<port>はNodePortタイプのサービスからのノードポートです。oc get svc -n openshift-ingressコマンドの出力例の80:32432/TCPHTTP ルートから、32432がノードポートであることがわかります。出力例
Hello OpenShift!
2.5. ロードバランサーを使用した Ingress クラスターの設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform は、クラスター内で実行されるサービスを使用してクラスター外からの通信を可能にする方法を提供します。この方法では、ロードバランサーを使用します。
以下の手順を開始する前に、管理者は以下の前提条件となるタスクを完了する必要があります。
- 要求がクラスターに到達できるように、クラスターネットワーク環境に対して外部ポートをセットアップします。
- 少なくとも 1 つのコントロールプレーンノード、少なくとも 1 つのコンピュートノード、およびクラスターへのネットワークアクセスが可能なクラスター外部のシステムを備えた OpenShift Container Platform クラスターを用意してください。この手順では、外部システムがクラスターと同じサブセットにあることを前提とします。別のサブセットの外部システムに必要な追加のネットワーク設定は、このトピックでは扱いません。
クラスター管理者ロールを持つユーザーが 1 名以上いることを確認します。このロールをユーザーに追加するには、以下のコマンドを実行します。
$ oc adm policy add-cluster-role-to-user cluster-admin username
2.5.1. ロードバランサーを使用したトラフィックのクラスターへの送信 リンクのコピーリンクがクリップボードにコピーされました!
特定の外部 IP アドレスを必要としない場合、ロードバランサーサービスを OpenShift Container Platform クラスターへの外部アクセスを許可するよう設定することができます。
ロードバランサーサービスは固有の IP を割り当てます。ロードバランサーには単一の edge ルーター IP があります (これは仮想 IP (VIP) の場合もありますが、初期の負荷分散では単一マシンになります。
プールはインフラストラクチャーレベルで設定され、クラスター管理者レベルでは設定されません。
2.5.2. プロジェクトおよびサービスの作成 リンクのコピーリンクがクリップボードにコピーされました!
公開するプロジェクトとサービスが存在しない場合は、プロジェクトを作成してからサービスを作成します。
プロジェクトとサービスがすでに存在する場合は、サービスを公開してルートを作成する手順に進みます。
前提条件
-
OpenShift CLI (
oc) をインストールし、クラスター管理者としてログインしている。
手順
oc new-projectコマンドを実行して、サービス用の新しいプロジェクトを作成します。$ oc new-project <project_name>oc new-appコマンドを使用してサービスを作成します。$ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.gitサービスが作成されたことを確認するには、以下のコマンドを実行します。
$ oc get svc -n <project_name>出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-ex ClusterIP 172.30.197.157 <none> 8080/TCP 70s注記デフォルトで、新規サービスには外部 IP アドレスがありません。
2.5.3. ルートの作成によるサービスの公開 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform 上で動作するアプリケーションへの外部アクセスを有効にするには、oc expose コマンドを使用してサービスをルートとして公開します。
前提条件
- OpenShift Container Platform にログインしている。
手順
公開するサービスが置かれているプロジェクトにログインします。
$ oc project <project_name>oc expose serviceコマンドを実行して、ルートを公開します。$ oc expose service nodejs-ex出力例
route.route.openshift.io/nodejs-ex exposedサービスが公開されていることを確認するには、
curlなどのツールを使用して、クラスター外からサービスにアクセスできることを確認します。ルートのホスト名を見つけるには、次のコマンドを入力します。
$ oc get route出力例
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD nodejs-ex nodejs-ex-myproject.example.com nodejs-ex 8080-tcp Noneホストが GET 要求に応答することを確認するには、次のコマンドを入力します。
curlコマンドの例$ curl --head nodejs-ex-myproject.example.com出力例
HTTP/1.1 200 OK ...
2.5.4. ロードバランサーサービスの作成 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でアプリケーションの受信トラフィックを効率的に分散し、高い可用性を確保するには、ロードバランサーサービスを作成します。
前提条件
- 公開するプロジェクトとサービスがあること。
- クラウドプロバイダーがロードバランサーをサポートしている。
手順
- OpenShift Container Platform にログインします。
公開するサービスが置かれているプロジェクトを読み込みます。
コマンドの例
$ oc project project1コントロールプレーンノード上のテキストファイルを開き、以下のテキストをファイルに貼り付けてください。必要に応じてファイルを編集してください。
ロードバランサー設定ファイルのサンプル
apiVersion: v1 kind: Service metadata: name: egress-2 spec: ports: - name: db port: 3306 loadBalancerIP: loadBalancerSourceRanges: - 10.0.0.0/8 - 192.168.0.0/16 type: LoadBalancer selector: name: mysqlここでは、以下のようになります。
metadata.name- ロードバランサーサービスの説明的な名前を指定します。
ポート.ポート- 公開したいサービスがリッスンしているポートと同じポートを指定します。
loadBalancerSourceRanges- ロードバランサーを通過するトラフィックを制限する特定の IP アドレスのリストを指定します。クラウドプロバイダーがこの機能をサポートしていない場合、このパラメーターは無視されます。
type-
タイプとして
ロードバランサーを指定します。 セレクター名サービスの名前を指定します。
注記ロードバランサーを経由するトラフィックを特定の IP アドレスに制限するには、
spec.endpointPublishingStrategy.loadBalancer.allowedSourceRangesIngress Controller パラメーターを使用します。loadBalancerSourceRangesパラメーターを設定しないでください。
- ファイルを保存し、終了します。
以下のコマンドを実行してサービスを作成します。
$ oc create -f <file_name>以下に例を示します。
$ oc create -f mysql-lb.yaml以下のコマンドを実行して新規サービスを表示します。
$ oc get svc出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE egress-2 LoadBalancer 172.30.22.226 ad42f5d8b303045-487804948.example.com 3306:30357/TCP 15m有効にされたクラウドプロバイダーがある場合、サービスには外部 IP アドレスが自動的に割り当てられます。
マスターサーバー上で、
curlなどのツールを使用して、パブリック IP アドレスを使用してサービスにアクセスできることを確認してください。$ curl <public_ip>:<port>以下に例を示します。
$ curl 172.29.121.74:3306このセクションの例では、クライアントアプリケーションを必要とする MySQL サービスを使用しています。
Got packets out of orderのメッセージと共に文字ストリングを取得する場合は、このサービスに接続していることになります。MySQL クライアントがある場合は、標準 CLI コマンドでログインします。
$ mysql -h 172.30.131.89 -u admin -p出力例
Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. MySQL [(none)]>
2.6. AWS での Ingress クラスタートラフィックの設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform は、クラスター内で実行されるサービスを使用してクラスター外からの通信を可能にする方法を提供します。この方法は、Amazon Web Services (AWS) のロードバランサー、具体的には Network Load Balancer (NLB) または Classic Load Balancer (CLB) を使用します。どちらのタイプのロードバランサーもクライアントの IP アドレスをノードに転送できますが、CLB はプロキシープロトコルのサポートを必要とし、OpenShift Container Platform はこれを自動的に有効にします。
NLB を使用するように Ingress Controller を設定するには、次の 2 つの方法があります。
-
現在 CLB を使用している Ingress Controller を強制的に置き換える。これにより
IngressControllerオブジェクトが削除され、新しい DNS レコードが伝播し、NLB がプロビジョニングされている間、サービスが停止します。 -
CLB を使用している既存の Ingress コントローラーを編集して、NLB を使用するように変更します。これにより、
IngressControllerオブジェクトを削除して再作成することなく、ロードバランサーが変更されます。
どちらの方法も、NLB から CLB への切り替えに使用できます。
これらのロードバランサーは、新規または既存の AWS クラスターで設定できます。
2.6.1. AWS での Classic Load Balancer タイムアウトの設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で長時間実行されるプロセスにおける接続切断を防ぐには、特定のルートまたは Ingress コントローラーに対してカスタムタイムアウト期間を設定します。
安定したネットワークトラフィックを維持するために、これらの設定が Amazon Web Services Classic Load Balancer (CLB) のデフォルトのタイムアウト値である 60 秒を考慮していることを確認してください。
CLB のタイムアウト期間がルートタイムアウトまたは Ingress Controller タイムアウトよりも短い場合、ロードバランサーは接続を途中で終了する可能性があります。ルートと CLB の両方のタイムアウト期間を増やすことで、この問題を防ぐことができます。
2.6.1.1. ルートのタイムアウトの設定 リンクのコピーリンクがクリップボードにコピーされました!
Service Level Availability (SLA) で必要とされる、低タイムアウトが必要なサービスや、バックエンドでの処理速度が遅いケースで高タイムアウトが必要なサービスがある場合は、既存のルートに対してデフォルトのタイムアウトを設定することができます。
OpenShift Container Platform クラスターの前にユーザー管理の外部ロードバランサーを設定した場合は、ユーザー管理の外部ロードバランサーのタイムアウト値がルートのタイムアウト値よりも高いことを確認してください。この設定により、クラスターが使用するネットワーク上でのネットワーク輻輳の問題を防ぐことができます。
前提条件
- 稼働中のクラスターに Ingress コントローラーをデプロイしました。
手順
oc annotateコマンドを使用して、ルートにタイムアウトを追加します。$ oc annotate route <route_name> \ --overwrite haproxy.router.openshift.io/timeout=<timeout><time_unit>< タイムアウト >: サポートされている時間単位は、マイクロ秒 (us)、ミリ秒 (ms)、秒 (s)、分 (m)、時間 (h)、または日 (d) です。以下の例では、2 秒のタイムアウトを
myrouteという名前のルートに設定します。$ oc annotate route myroute --overwrite haproxy.router.openshift.io/timeout=2s
2.6.1.2. Classic Load Balancer タイムアウトの設定 リンクのコピーリンクがクリップボードにコピーされました!
Classic Load Balancer (CLB) のデフォルトのタイムアウトを設定して、アイドル接続を延長できます。
前提条件
- 実行中のクラスターにデプロイ済みの Ingress Controller がある。
手順
以下のコマンドを実行して、デフォルトの
イングレスコントローラーの Amazon Web Services 接続アイドルタイムアウトを 5 分に設定します。$ oc -n openshift-ingress-operator patch ingresscontroller/default \ --type=merge --patch='{"spec":{"endpointPublishingStrategy": \ {"type":"LoadBalancerService", "loadBalancer": \ {"scope":"External", "providerParameters":{"type":"AWS", "aws": \ {"type":"Classic", "classicLoadBalancer": \ {"connectionIdleTimeout":"5m"}}}}}}}'オプション: 次のコマンドを実行して、タイムアウトのデフォルト値を復元します。
$ oc -n openshift-ingress-operator patch ingresscontroller/default \ --type=merge --patch='{"spec":{"endpointPublishingStrategy": \ {"loadBalancer":{"providerParameters":{"aws":{"classicLoadBalancer": \ {"connectionIdleTimeout":null}}}}}}}'注記現在のスコープがすでに設定されている場合を除き、接続タイムアウト値を変更するには
scopeフィールドを指定する必要があります。デフォルトのタイムアウト値に戻す場合は、scopeフィールドを設定する際に再度設定する必要はありません。
2.6.2. ネットワークロードバランサーを使用した AWS での Ingress クラスタートラフィックの設定 リンクのコピーリンクがクリップボードにコピーされました!
外部サービスと OpenShift Container Platform クラスター間の高性能な通信を可能にするには、Amazon Web Services Network Load Balancer (NLB) を設定します。新規または既存の AWS クラスター上に NLB をセットアップすることで、低遅延で受信トラフィックを管理できます。
2.6.2.1. Ingress Controller を Classic Load Balancer から Network Load Balancer に切り替える リンクのコピーリンクがクリップボードにコピーされました!
Amazon Web Services 上の OpenShift Container Platform におけるクラスタートラフィックのパフォーマンスを向上させ、レイテンシーを削減するには、Classic Load Balancer (CLB) を使用している Ingress コントローラーを、Network Load Balancer (NLB) を使用するものに切り替えます。
これらのロードバランサーを切り替えても、IngressController オブジェクトは削除されません。
この手順により、次の問題が発生する可能性があります。
- 新しい DNS レコードの伝播、新しいロードバランサーのプロビジョニング、およびその他の要因により、数分間続く可能性のある停止。この手順を適用すると、Ingress Controller ロードバランサーの IP アドレスや正規名が変更になる場合があります。
- サービスのアノテーションの変更により、ロードバランサーリソースがリークする。
手順
NLB を使用して、切り替えたい既存の Ingress コントローラーを変更します。この例では、デフォルトの Ingress Controller に
Externalスコープがあり、他のカスタマイズがないことを前提としています。ingresscontroller.yamlファイルの例apiVersion: operator.openshift.io/v1 kind: IngressController metadata: creationTimestamp: null name: default namespace: openshift-ingress-operator spec: endpointPublishingStrategy: loadBalancer: scope: External providerParameters: type: AWS aws: type: NLB type: LoadBalancerService注記spec.endpointPublishingStrategy.loadBalancer.providerParameters.aws.typeフィールドの値を指定しない場合、Ingress Controller は、インストール時に設定されたクラスターIngress設定のspec.loadBalancer.platform.aws.type値を使用します。ヒントIngress Controller に、ドメインの変更など、更新したい他のカスタマイズがある場合は、代わりに Ingress Controller 定義ファイルを強制的に置き換えることを検討してください。
次のコマンドを実行して、Ingress Controller YAML ファイルに変更を適用します。
$ oc apply -f ingresscontroller.yamlIngress Controller の更新中は、数分間の停止が予想されます。
2.6.2.2. Network Load Balancer の使用から Classic Load Balancer への Ingress Controller の切り替え リンクのコピーリンクがクリップボードにコピーされました!
Amazon Web Services 上の OpenShift Container Platform で特定のネットワーク設定をサポートするには、Network Load Balancer (NLB) を使用する Ingress Controller を、Classic Load Balancer (CLB) を使用する Ingress Controller に切り替えます。
これらのロードバランサーを切り替えても、IngressController オブジェクトは削除されません。
この手順により、新しい DNS レコードの伝播、新しいロードバランサーのプロビジョニング、およびその他の要因により、数分間続く停止が発生する可能性があります。この手順を適用すると、Ingress Controller ロードバランサーの IP アドレスや正規名が変更になる場合があります。
手順
CLB を使用して切り替える既存の Ingress Controller を変更します。この例では、デフォルトの Ingress Controller に
Externalスコープがあり、他のカスタマイズがないことを前提としています。ingresscontroller.yamlファイルの例apiVersion: operator.openshift.io/v1 kind: IngressController metadata: creationTimestamp: null name: default namespace: openshift-ingress-operator spec: endpointPublishingStrategy: loadBalancer: scope: External providerParameters: type: AWS aws: type: Classic type: LoadBalancerService注記spec.endpointPublishingStrategy.loadBalancer.providerParameters.aws.typeフィールドの値を指定しない場合、Ingress Controller は、インストール時に設定されたクラスターIngress設定のspec.loadBalancer.platform.aws.type値を使用します。ヒントIngress Controller に、ドメインの変更など、更新したい他のカスタマイズがある場合は、代わりに Ingress Controller 定義ファイルを強制的に置き換えることを検討してください。
次のコマンドを実行して、Ingress Controller YAML ファイルに変更を適用します。
$ oc apply -f ingresscontroller.yamlIngress Controller の更新中は、数分間の停止が予想されます。
2.6.2.3. Ingress Controller Classic Load Balancer の Network Load Balancer への置き換え リンクのコピーリンクがクリップボードにコピーされました!
Amazon Web Services 上の OpenShift Container Platform におけるトラフィックのパフォーマンスを向上させ、レイテンシーを低減するには、Classic Load Balancer (CLB) を使用するイングレスコントローラーを、Network Load Balancer (NLB) を使用するイングレスコントローラーに置き換えます。
この手順により、次の問題が発生する可能性があります。
- 新しい DNS レコードの伝播、新しいロードバランサーのプロビジョニング、およびその他の要因により、数分間続く可能性のある停止。この手順を適用すると、Ingress Controller ロードバランサーの IP アドレスや正規名が変更になる場合があります。
- サービスのアノテーションの変更により、ロードバランサーリソースがリークする。
手順
新しいデフォルトの Ingress Controller を含むファイルを作成します。以下の例では、デフォルトの Ingress Controller の範囲が
Externalで、その他のカスタマイズをしていないことを想定しています。ingresscontroller.ymlファイルの例apiVersion: operator.openshift.io/v1 kind: IngressController metadata: creationTimestamp: null name: default namespace: openshift-ingress-operator spec: endpointPublishingStrategy: loadBalancer: scope: External providerParameters: type: AWS aws: type: NLB type: LoadBalancerServiceデフォルトの Ingress Controller が他にカスタマイズされている場合には、それに応じてファイルを修正してください。
ヒントIngress Controller に他のカスタマイズがなく、ロードバランサータイプのみを更新する場合は、「Ingress Controller を Classic Load Balancer から Network Load Balancer に切り替える」に記載の手順に従ってください。
Ingress Controller の YAML ファイルを強制的に置き換えます。
$ oc replace --force --wait -f ingresscontroller.ymlIngress Controller の置き換えが完了するまでお待ちください。数分間の停止が予想されます。
2.6.2.4. 既存 AWS クラスターでの Ingress Controller ネットワークロードバランサーの設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でトラフィック量の多いワークロードのパフォーマンスを向上させるには、既存のクラスター上に Amazon Web Services Network Load Balancer (NLB) をバックエンドとする Ingress Controller を設定します。
既存のクラスター上に、Amazon Web Services の Network Load Balancer (NLB) をバックエンドとするイングレスコントローラーを作成できます。
前提条件
- AWS クラスターをインストールしました。
インフラストラクチャーリソースの
PlatformStatusは AWS である必要があります。PlatformStatus がAWS であることを確認するには、次のコマンドを実行します。$ oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.type}' AWS
手順
Ingress Controller のマニフェストを作成します。
$ cat ingresscontroller-aws-nlb.yaml出力例
apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: <ingress_controller_name> namespace: openshift-ingress-operator spec: domain: <unique_ingress_domain endpointPublishingStrategy: type: LoadBalancerService loadBalancer: scope: External providerParameters: type: AWS aws: type: NLBここでは、以下のようになります。
<ingress_controller_name>- Ingress コントローラーの一意の名前を指定します。
< ユニークイングレスドメイン >-
クラスター内のすべてのイングレスコントローラーの中で一意となるドメイン名を指定します。この変数は、DNS 名
<clustername>.<domain>のサブドメインである必要があります。 scope-
NLB の種類を指定します。外部 NLB を使用する場合は
External、内部 NLB を使用する場合はInternal を選択します。
クラスターにリソースを作成します。
$ oc create -f ingresscontroller-aws-nlb.yaml重要新しい AWS クラスターで Ingress Controller NLB を設定する前に、インストール設定ファイルの作成手順を完了する必要があります。詳細は、インストール設定ファイルの作成を参照してください。
2.7. サービスの外部 IP を使用した Ingress クラスタートラフィックの設定 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB 実装または IP フェイルオーバーデプロイメントのいずれかを使用して、ExternalIP リソースをサービスに接続し、OpenShift Container Platform クラスター外部のトラフィックでそのサービスを利用できるようにすることができます。
この方法で外部 IP アドレスをホストすることは、ベアメタルハードウェアにインストールされたクラスターにのみ適用されます。
トラフィックをサービスにルーティングするには、外部ネットワークインフラストラクチャーを正しく設定する必要があります。
手順を開始する前に、以下の前提条件を満たしていることを確認してください。
- 外部 IP アドレスを有効にしてクラスターを設定しました。詳細は、関連情報 セクションのサービスの外部 IP アドレスの設定を参照してください。
Egress IP に同じ ExternalIP を使用しないでください。
2.7.1. ExternalIP のサービスへの割り当て リンクのコピーリンクがクリップボードにコピーされました!
サービスに ExternalIP リソースを割り当てることができます。リソースをサービスに自動的に割り当てるようにクラスターを設定した場合は、ExternalIP をサービスに手動でアタッチする必要がない場合があります。
この手順の例では、IP フェイルオーバー設定を持つクラスター内のサービスに ExternalIP リソースを手動で割り当てるシナリオを使用します。
手順
CLI で次のコマンドを実行して、ExternalIP リソースの互換性のある IP アドレス範囲を確認します。
$ oc get networks.config cluster -o jsonpath='{.spec.externalIP}{"\n"}'注記autoAssignCIDRsが設定されていて、ExternalIP リソースのspec.externalIPsの値を指定していないと、OpenShift Container Platform は新しいServiceオブジェクトに ExternalIP を自動的に割り当てます。サービスに ExternalIP リソースを割り当てるには、次のいずれかのオプションを選択します。
新しいサービスを作成する場合は、
spec.externalIPsパラメーターに値を指定し、allowedCIDRsパラメーターに 1 つ以上の有効な IP アドレスの配列を指定してください。ExternalIP リソースをサポートするサービス YAML 設定ファイルの例
apiVersion: v1 kind: Service metadata: name: svc-with-externalip spec: externalIPs: policy: allowedCIDRs: - 192.168.123.0/28 # ...ExternalIP を既存のサービスに割り当てる場合は、以下のコマンドを入力します。
<name>をサービス名に置き換えます。<ip_address>を有効な ExternalIP アドレスに置き換えます。コンマで区切られた複数の IP アドレスを指定できます。$ oc patch svc <name> -p \ '{ "spec": { "externalIPs": [ "<ip_address>" ] } }'以下に例を示します。
$ oc patch svc mysql-55-rhel7 -p '{"spec":{"externalIPs":["192.174.120.10"]}}'出力例
"mysql-55-rhel7" patched
ExternalIP アドレスがサービスに割り当てられていることを確認するには、以下のコマンドを入力します。新規サービスに ExternalIP を指定した場合、まずサービスを作成する必要があります。
$ oc get svc出力例
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysql-55-rhel7 172.30.131.89 192.174.120.10 3306/TCP 13m
2.8. NodePort を使用した Ingress クラスタートラフィックの設定 リンクのコピーリンクがクリップボードにコピーされました!
特定のネットワーク要件を満たすためにアプリケーションへの外部アクセスを有効にするには、NodePort を使用してサービスを公開します。
この設定では、クラスター内のすべてのノードで特定のポートが開かれ、任意のノードの IP アドレスを使用して外部トラフィックがワークロードに到達できるようになります。
OpenShift Container Platform は、クラスター内で実行されるサービスを使用してクラスター外からの通信を可能にする方法を提供します。この方法は NodePort を使用します。
以下の手順を開始する前に、管理者は以下の前提条件となるタスクを完了する必要があります。
- 要求がクラスターに到達できるように、クラスターネットワーク環境に対して外部ポートをセットアップします。
- 少なくとも 1 つのコントロールプレーンノード、少なくとも 1 つのコンピュートノード、およびクラスターへのネットワークアクセスが可能なクラスター外部のシステムを備えた OpenShift Container Platform クラスターを用意してください。この手順では、外部システムがクラスターと同じサブセットにあることを前提とします。別のサブセットの外部システムに必要な追加のネットワーク設定は、このトピックでは扱いません。
クラスター管理者ロールを持つユーザーが 1 名以上いることを確認します。このロールをユーザーに追加するには、以下のコマンドを実行します。
$ oc adm policy add-cluster-role-to-user cluster-admin <user_name>
2.8.1. NodePort を使用したトラフィックのクラスターへの送信 リンクのコピーリンクがクリップボードにコピーされました!
NodePort-type Service リソースを使用して、クラスター内のすべてのノードの特定のポートでサービスを公開します。
ポートは、サービス リソースの .spec.ports[*].nodePort パラメーターで指定されます。
ノードポートを使用するには、追加のポートリソースが必要です。
NodePort は、ノードの IP アドレス上の静的ポートでサービスを公開します。NodePort は デフォルトで 30000 から 32767 までの IP アドレス範囲をカバーするため、NodePort が サービスの意図するポートと一致する可能性は低い。たとえば、ノード上ではポート 8080 が ポート 31020 として公開される可能性があります。
管理者は、外部 IP アドレスがノードにルーティングされることを確認する必要があります。
NodePort と外部 IP アドレスは独立しており、両方とも同時に使用できます。
2.8.2. プロジェクトおよびサービスの作成 リンクのコピーリンクがクリップボードにコピーされました!
公開するプロジェクトとサービスが存在しない場合は、プロジェクトを作成してからサービスを作成します。
プロジェクトとサービスがすでに存在する場合は、サービスを公開してルートを作成する手順に進みます。
前提条件
-
OpenShift CLI (
oc) をインストールし、クラスター管理者としてログインしている。
手順
oc new-projectコマンドを実行して、サービス用の新しいプロジェクトを作成します。$ oc new-project <project_name>oc new-appコマンドを使用してサービスを作成します。$ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.gitサービスが作成されたことを確認するには、以下のコマンドを実行します。
$ oc get svc -n <project_name>出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-ex ClusterIP 172.30.197.157 <none> 8080/TCP 70s注記デフォルトで、新規サービスには外部 IP アドレスがありません。
2.8.3. ルートの作成によるサービスの公開 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform 上で動作するアプリケーションへの外部アクセスを有効にするには、oc expose コマンドを使用してサービスをルートとして公開します。
前提条件
- OpenShift Container Platform にログインしている。
手順
公開するサービスが置かれているプロジェクトにログインします。
$ oc project <project_name>アプリケーションのノードポートを公開するには、次のコマンドを入力して、サービスのカスタムリソース定義 (CRD) を変更します。
$ oc edit svc <service_name>出力例
spec: ports: - name: 8443-tcp nodePort: 30327 port: 8443 protocol: TCP targetPort: 8443 sessionAffinity: None type: NodePort-
nodePort: オプションのパラメーター。アプリケーションのノードポート範囲を指定します。デフォルトでは、OpenShift Container Platform は30000-32767範囲で使用可能なポートを選択します。 -
type: サービスの種類を指定します。
-
オプション: サービスが公開されるノードポートで利用可能なことを確認するには、以下のコマンドを入力します。
$ oc get svc -n myproject出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-ex ClusterIP 172.30.217.127 <none> 3306/TCP 9m44s nodejs-ex-ingress NodePort 172.30.107.72 <none> 3306:31345/TCP 39sオプション:
oc new-appコマンドによって自動的に作成されたサービスを削除するには、以下のコマンドを入力します。$ oc delete svc nodejs-ex
検証
サービスノードポートが
30000 ~ 32767の範囲のポートで更新されていることを確認するには、次のコマンドを入力します。$ oc get svc次の出力例では、更新されたポートは
30327です。出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE httpd NodePort 172.xx.xx.xx <none> 8443:30327/TCP 109s
2.9. ロードバランサーの許可された送信元範囲を使用した Ingress クラスタートラフィックの設定 リンクのコピーリンクがクリップボードにコピーされました!
Ingress コントローラーの IP アドレス範囲のリストを指定できます。このアクションは、endpointPublishingStrategy パラメーターに LoadBalancerService の 値を指定した場合に、ロードバランサーサービスへのアクセスを制限します。
2.9.1. ロードバランサーの許可されるソース範囲の設定 リンクのコピーリンクがクリップボードにコピーされました!
spec.endpointPublishingStrategy.loadBalancer.allowedSourceRanges パラメーターを有効化および設定できます。ロードバランサーの許可されるソース範囲を設定することで、Ingress Controller のロードバランサーへのアクセスを、指定した IP アドレス範囲のリストに制限できます。
Ingress Operator はロードバランサーサービスを調整し、AllowedSourceRanges に基づいて spec.loadBalancerSourceRanges パラメーターを設定します。
OpenShift Container Platform の以前のバージョンで spec.loadBalancerSourceRanges パラメーターまたはロードバランサーサービスアノテーション service.beta.kubernetes.io/load-balancer-source-ranges をすでに設定している場合、アップグレード後に Ingress Controller が Progressing=True を報告するようになります。この問題を解決するには、spec.loadBalancerSourceRanges パラメーターを上書きし、service.beta.kubernetes.io/load -balancer-source-ranges アノテーションをクリアする AllowedSourceRanges を設定します。Ingress Controller は、再び Progressing=False の報告を開始します。
前提条件
- 実行中のクラスターにデプロイされた Ingress Controller があります。
手順
次のコマンドを実行して、Ingress Controller の許可されるソース範囲 API を設定します。
$ oc -n openshift-ingress-operator patch ingresscontroller/default \ --type=merge --patch='{"spec":{"endpointPublishingStrategy": \ {"type":"LoadBalancerService", "loadbalancer": \ {"scope":"External", "allowedSourceRanges":["0.0.0.0/0"]}}}}'ここでは、以下のようになります。
allowedSourceRanges-
例の値
0.0.0.0/0は、許可されるソース範囲を指定します。
2.9.2. ロードバランサーの許可されたソース範囲への移行 リンクのコピーリンクがクリップボードにコピーされました!
注釈 service.beta.kubernetes.io/load-balancer-source-ranges をすでに設定している場合は、ロードバランサーの許可されたソース範囲に移行できます。AllowedSourceRanges を設定すると、Ingress Controller は AllowedSourceRanges 値に基づいて spec.loadBalancerSourceRanges フィールドを設定し、service.beta.kubernetes.io/load-balancer-source-ranges アノテーションを設定解除します。
OpenShift Container Platform の以前のバージョンで spec.loadBalancerSourceRanges パラメーターまたはロードバランサーサービスアノテーション service.beta.kubernetes.io/load-balancer-source-ranges をすでに設定している場合、アップグレード後に Ingress Controller が Progressing=True を報告するようになります。この問題を解決するには、spec.loadBalancerSourceRanges パラメーターを上書きし、service.beta.kubernetes.io/load -balancer-source-ranges アノテーションをクリアする AllowedSourceRanges を設定します。Ingress Controller は再び Progressing=False の報告を開始します。
前提条件
-
service.beta.kubernetes.io/load-balancer-source-rangesアノテーションを設定しました。
手順
以下のコマンドを入力して、
service.beta.kubernetes.io/load-balancer-source-ranges が正しく設定されていることを確認してください。$ oc get svc router-default -n openshift-ingress -o yaml出力例
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/load-balancer-source-ranges: 192.168.0.1/32以下のコマンドを入力して、
spec.loadBalancerSourceRangesパラメーターが設定されていないことを確認してください。$ oc get svc router-default -n openshift-ingress -o yaml出力例
... spec: loadBalancerSourceRanges: - 0.0.0.0/0 ...- クラスターを OpenShift Container Platform 4.20 に更新します。
次のコマンドを実行して、
ingresscontrollerの許可されるソース範囲 API を設定します。$ oc -n openshift-ingress-operator patch ingresscontroller/default \ --type=merge --patch='{"spec":{"endpointPublishingStrategy": \ {"loadBalancer":{"allowedSourceRanges":["0.0.0.0/0"]}}}}'ここでは、以下のようになります。
allowedSourceRanges-
例の値
0.0.0.0/0は、許可されるソース範囲を指定します。
2.10. 既存の Ingress オブジェクトのパッチ適用 リンクのコピーリンクがクリップボードにコピーされました!
既存の Ingress オブジェクトの以下のフィールドは、オブジェクトを再作成したり、これらのオブジェクトへのサービスを中断したりすることなく、更新または変更できます。
- Specifications
- Host
- Path
- Backend services
- SSL/TLS settings
- アノテーション
2.10.1. Ingress オブジェクトのパッチ適用による ingressWithoutClassName アラートの解決 リンクのコピーリンクがクリップボードにコピーされました!
特定のルーティングの問題を回避するには、各 Ingress オブジェクトに ingressClassName フィールドを定義する必要があります。
Ingress オブジェクトを作成してから約 24 時間後、Ingress コントローラーから ingressClassName フィールドを設定するよう促す ingressWithoutClassName アラートが送信されます。
この手順では、Ingress オブジェクトに ingressClassName フィールドを入力済みでパッチ適用し、適切なルーティングと機能を確保する方法を示します。
手順
すべての
IngressClassオブジェクトをリスト表示します。$ oc get ingressclass全 namespace 内の
Ingressオブジェクトをすべてリスト表示します。$ oc get ingress -A以下のコマンドを実行して、
Ingressオブジェクトにパッチを適用します。このコマンドは、Ingressオブジェクトにパッチを適用して、目的の Ingress クラス名を含めます。$ oc patch ingress/<ingress_name> --type=merge --patch '{"spec":{"ingressClassName":"openshift-default"}}'-
<ingress_name>:<ingress_name> をIngressオブジェクトの名前に置き換えてください。
-
2.11. DNS 管理ポリシーについて リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者として Ingress Controller を作成すると、Operator は DNS レコードを自動的に管理します。このアプローチには、必要な DNS ゾーンがクラスター DNS ゾーンと異なる場合、または DNS ゾーンがクラウドプロバイダーの外部でホストされている場合に、いくつかの制限があります。
以下に、マネージド DNS 管理ポリシーの重要な側面を詳述します。
- Ingress Controller の Managed DNS 管理ポリシーにより、クラウドプロバイダーのワイルドカード DNS レコードのライフサイクルが Operator によって自動的に管理されるようになります。これがデフォルトの動作です。
-
Ingress Controller を
ManagedからUnmanagedDNS 管理ポリシーに変更すると、Operator はクラウドでプロビジョニングされた以前のワイルドカード DNS レコードをクリーンアップしません。 -
Ingress Controller を
UnmanagedからManagedDNS 管理ポリシーに変更すると、Operator は、クラウドプロバイダーに DNS レコードが存在しない場合は作成を試み、DNS レコードがすでに存在する場合は更新を試みます。
以下に、管理対象外の DNS 管理ポリシーにおける重要な側面を詳述します。
- Ingress Controller の Unmanaged DNS 管理ポリシーにより、クラウドプロバイダーのワイルドカード DNS レコードのライフサイクルが自動的に管理されず、代わりにクラスター管理者の責任になります。
2.11.1. 手動 DNS 管理のための Ingress Controller の作成 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、Unmanaged DNS 管理ポリシーを使用して、新しいカスタム Ingress Controller を作成できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
次の内容を含む、
sample-ingress.yamlという名前のIngressControllerカスタムリソース (CR) ファイルを作成します。apiVersion: operator.openshift.io/v1 kind: IngressController metadata: namespace: openshift-ingress-operator name: <name> spec: domain: <domain> endpointPublishingStrategy: type: LoadBalancerService loadBalancer: scope: External dnsManagementPolicy: Unmanagedここでは、以下のようになります。
metadata.name-
IngressControllerオブジェクトの名前で<name>を指定します。 仕様ドメイン-
前提として作成した DNS レコードをもとに
domainを指定します。 loadBalancer.scope-
scopeをExternalとして指定して、ロードバランサーを外部に公開します。loadBalancer.dnsManagementPolicy: Ingress Controller がロードバランサーに関連付けられたワイルドカード DNS レコードのライフサイクルを管理するかどうかを指定します。有効な値はManagedおよびUnmanagedです。デフォルト値はManagedです。
マニフェストを適用して
IngressControllerオブジェクトを作成します。$ oc apply -f sample-ingress.yaml次のコマンドを実行して、Ingress Controller が正しいポリシーで作成されたことを確認します。
$ oc get ingresscontroller <name> -n openshift-ingress-operator -o=jsonpath={.spec.endpointPublishingStrategy.loadBalancer}出力を検査し、
dnsManagementPolicyがUnmanagedに設定されていることを確認します。
2.11.2. 既存の Ingress Controller を手動で DNS 管理できるように変更する リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、既存の Ingress Controller を変更して、DNS レコードのライフサイクルを手動で管理できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
選択した Ingress Controller を変更して、
dnsManagementPolicyパラメーターを設定します。$ SCOPE=$(oc -n openshift-ingress-operator get ingresscontroller <name> -o=jsonpath="{.status.endpointPublishingStrategy.loadBalancer.scope}")$ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch="{\"spec\":{\"endpointPublishingStrategy\":{\"type\":\"LoadBalancerService\",\"loadBalancer\":{\"dnsManagementPolicy\":\"Unmanaged\", \"scope\":\"${SCOPE}\"}}}}" ingresscontroller.operator.openshift.io/default patched次のコマンドを実行して、Ingress Controller が正しく変更されたことを確認します。
$ oc get ingresscontroller <name> -n openshift-ingress-operator -o=jsonpath={.spec.endpointPublishingStrategy.loadBalancer}出力を検査し、
dnsManagementPolicyがUnmanagedに設定されていることを確認します。
2.12. OpenShift Container Platform のネットワーク機能を備えたゲートウェイ API リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform では、Ingress Operator で Gateway API を使用することにより、ネットワークトラフィックを設定するための追加の方法が提供されます。
Gateway API はユーザー定義ネットワーク (UDN) をサポートしていません。
2.12.1. Gateway API の概要 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でネットワークトラフィック管理を最適化し、ルーティングポリシーを実装するには、Gateway API を使用します。このコミュニティー主導の Kubernetes メカニズムを採用することで、トランスポート層 (L4) とアプリケーション層 (L7) の両方で高度なルーティングを設定できるだけでなく、様々なベンダーがサポートする実装を活用して、特定のネットワーク要件を満たすことができます。
このプロジェクトは、幅広いコミュニティーのサポートを受けた移植可能な API を使用して、標準化されたエコシステムを提供するための取り組みです。Gateway API 機能を Ingress Operator に統合することで、既存のコミュニティーとアップストリーム開発の取り組みに沿ったネットワークソリューションが可能になります。
Gateway API は Ingress Operator の機能を拡張し、よりきめ細かいクラスタートラフィックとルーティング設定を処理します。これらの機能を利用することで、Gateway API のカスタムリソース定義 (CRD) のインスタンスを作成できます。OpenShift Container Platform クラスターの場合、Ingress Operator は次のリソースを作成します。
- Gateway
- このリソースでは、トラフィックをクラスター内のサービスに変換する方法を説明します。たとえば、特定のロードバランサー設定などです。
- GatewayClass
-
このリソースは、共通の設定と動作を共有する
Gatewayオブジェクトのセットを定義します。たとえば、パブリックアプリケーションまたはプライベートアプリケーションに使用されるGatewayリソースのセットを区別するために、2 つの個別のGatewayClassオブジェクトが作成される場合があります。 - HTTPRoute
- このリソースは、Gateway からサービスへの HTTP 要求のルーティング動作を指定し、HTTP 接続または終了した HTTPS 接続を多重化する場合に特に役立ちます。
- GRPCRoute
- このリソースは、gRPC リクエストのルーティング動作を指定します。
- ReferenceGrant
- このリソースは、namespace 間の参照を可能にします。たとえば、ルートが別の namespace にあるバックエンドにトラフィックを転送できるようになります。
OpenShift Container Platform では、Gateway API の実装は gateway.networking.k8s.io/v1 に基づいており、このバージョンのすべてのフィールドがサポートされています。
Gateway API は、リソース管理においてロールベースのアプローチを採用しています。次の図は、ペルソナと、ゲートウェイ などの前述のリソースとの相互関係を示しています。
図2.4 Gateway API の例を示す図
2.12.1.1. Gateway API の利点 リンクのコピーリンクがクリップボードにコピーされました!
Gateway API には次の利点があります。
-
移植性: OpenShift Container Platform は Ingress のパフォーマンスを向上させるために HAProxy を使用しますが、Gateway API は特定の動作を提供するためにベンダー固有のアノテーションに依存することはありません。HAProxy と同等のパフォーマンスを得るには、
Gatewayオブジェクトを水平方向にスケーリングするか、関連するノードを垂直方向にスケーリングする必要があります。 -
関心の分離: Gateway API は、そのリソースに対してロールベースのアプローチを採用しています。これにより、大規模な組織における責任分担やチーム体制と、よりうまく適合します。プラットフォームエンジニアは
GatewayClassリソースに、クラスター管理者はGatewayリソースの設定に、アプリケーション開発者はHTTPRouteリソースを使用したサービスのルーティングにそれぞれ注力する可能性がある。 - 拡張性: 追加機能は標準化された CRD として開発されます。
2.12.1.2. Gateway API の制限 リンクのコピーリンクがクリップボードにコピーされました!
Gateway API には次の制限があります。
- バージョンの非互換性: Gateway API エコシステムは急速に変化しており、一部の実装は、その機能セットが異なるバージョンの Gateway API に基づいているため、他の実装と連携しません。
- リソースのオーバーヘッド: より柔軟ではありますが、Gateway API は結果を達成するために複数のリソースタイプを使用します。小規模なアプリケーションの場合、従来の Ingress のシンプルさがより適している可能性があります。
2.12.2. OpenShift Container Platform の Gateway API 実装 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform における外部ベンダーの実装とネットワークインフラストラクチャー間の相互運用性を確保するには、Ingress Operator を使用して Gateway API のカスタムリソース定義 (CRD) のライフサイクルを管理します。
Gateway API が提供するフィールドの中に、特定のベンダーによる実装ではサポートされていないものが含まれる場合があります。しかしその場合でも、サポートされていないフィールドを除けば、その実装は残りのフィールドとスキーマレベルで互換性があります。これらのデッドフィールドは、イングレスワークロードの中断、アプリケーションやサービスの不適切なプロビジョニング、およびセキュリティー関連の問題を引き起こす可能性があります。OpenShift Container Platform は特定のバージョンの Gateway API CRD を使用するため、サードパーティーの Gateway API 実装を使用する場合は、すべてのフィールドが期待どおりに機能するように、OpenShift Container Platform 実装に準拠する必要があります。
OpenShift Container Platform 4.20 クラスター内で作成されたすべての CRD は、Ingress Operator によって互換性のあるバージョン管理とメンテナンスが行われます。CRD がすでに存在するものの、以前は Ingress Operator によって管理されていなかった場合、Ingress Operator は、それらの設定が OpenShift Container Platform がサポートする Gateway API バージョンと互換性があるかをチェックします。その後、CRD の管理を引き継ぐことへの承認をユーザーに求める admin-gate を作成します。
Gateway API CRD を含む以前の OpenShift Container Platform バージョンからクラスターを更新する場合は、それらのリソースを変更して、OpenShift Container Platform でサポートされているバージョンと完全に一致するようにします。そうしないと、それらの CRD は OpenShift Container Platform によって管理されていなかったため、Red Hat でサポートされていない機能が含まれている可能性があり、クラスターを更新できません。
2.12.3. Ingress Operator の Gateway API を使い始める リンクのコピーリンクがクリップボードにコピーされました!
GatewayClass リソースを作成すると、そのリソースによって Gateway API がクラスター上で使用できるように設定されます。
OpenShift Container Platform Gateway API 実装は、Cluster Ingress Operator (CIO) を利用して、openshift- Ingress namespace に特定のバージョンの OpenShift Service Mesh (OSSM v3.x) をインストールし、管理します。
クラスターのいずれかの namespace にアクティブな OpenShift Service Mesh (OSSM v2.x) サブスクリプションがすでに存在する場合、競合が発生します。OSSM v2.x と OSSM v3.x は同じクラスター上に配置できません。
GatewayClass リソースを作成する際に、競合する OSSM v2.x サブスクリプションが存在する場合、クラスターイングレス Operator は必要な OSSM v3.x コンポーネントのインストールを試みますが、このインストール操作は失敗します。その結果、Gateway や HTTPRoute などの Gateway API リソースは効果を発揮せず、トラフィックをルーティングするためのプロキシーも設定されません。OpenShift Container Platform 4.19 では、この障害は通知されません。OpenShift Container Platform 4.20 以降では、この競合により、イングレス ClusterOperator が Degraded ステータスを報告するようになります。
GatewayClass を作成して Gateway API を有効にする前に、クラスターにアクティブな OSSM v2.x サブスクリプションがないか確認してください。
手順
GatewayClassオブジェクトを作成します。次の情報が含まれる YAML ファイル
openshift-default.yamlを作成します。GatewayClassCR の例apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: name: openshift-default spec: controllerName: openshift.io/gateway-controller/v1controllerName: コントローラー名。重要Ingress Operator がこれを管理するには、コントローラー名が表示されているとおりである必要があります。このフィールドを他の値に設定すると、Ingress Operator は
GatewayClassオブジェクトと、それに関連付けられたすべてのGateway、GRPCRoute、およびHTTPRouteオブジェクトを無視します。コントローラー名は OpenShift Container Platform の Gateway API の実装に関連付けられており、許可されるコントローラー名はopenshift.io/gateway-controller/v1のみです。
次のコマンドを実行して、
GatewayClassリソースを作成します。$ oc create -f openshift-default.yaml出力例
gatewayclass.gateway.networking.k8s.io/openshift-default createdGatewayClassリソースの作成中に、Ingress Operator は Red Hat OpenShift Service Mesh の軽量バージョン、Istio カスタムリソース、およびopenshift-ingressnamespace に新しいデプロイメントをインストールします。オプション: 新しいデプロイメントである
istiod-openshift-gatewayが準備完了で利用可能であることを確認します。$ oc get deployment -n openshift-ingress出力例
NAME READY UP-TO-DATE AVAILABLE AGE istiod-openshift-gateway 1/1 1 1 55s router-default 2/2 2 2 6h4m
次のコマンドを実行してシークレットを作成します。
$ oc -n openshift-ingress create secret tls gwapi-wildcard --cert=wildcard.crt --key=wildcard.key次のコマンドを実行して、Ingress Operator のドメインを取得します。
$ DOMAIN=$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})Gatewayオブジェクトを作成します。次の情報が含まれる YAML ファイル
example-gateway.yamlを作成します。ゲートウェイ CR の例
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: example-gateway namespace: openshift-ingress spec: gatewayClassName: openshift-default listeners: - name: https hostname: "*.gwapi.${DOMAIN}" port: 443 protocol: HTTPS tls: mode: Terminate certificateRefs: - name: gwapi-wildcard allowedRoutes: namespaces: from: Allここでは、以下のようになります。
metadata.namespace-
Gatewayオブジェクトは、openshift-ingressnamespace に作成する必要があります。 gatewayClassName-
Gatewayオブジェクトは、以前に作成されたGatewayClassオブジェクトの名前を参照する必要があります。 リスナー名-
HTTPS リスナーは、クラスタードメインのサブドメインに一致する HTTPS 要求をリッスンします。このリスナーを使用し、Gateway API
HTTPRouteリソースを使用してアプリケーションへの Ingress を設定します。 リスナーホスト名- ホスト名は、Ingress Operator ドメインのサブドメインである必要があります。ドメインを使用する場合、リスナーはそのドメイン内のすべてのトラフィックを処理しようとします。
tls.name- 以前に作成されたシークレットの名前。
次のコマンドを実行して、リソースを適用します。
$ oc apply -f example-gateway.yamlオプション:
Gatewayオブジェクトを作成すると、Red Hat OpenShift Service Mesh は同じ名前のデプロイメントとサービスを自動的にプロビジョニングします。以下のコマンドを実行して、これを確認します。デプロイメントを確認するには、次のコマンドを実行します。
$ oc get deployment -n openshift-ingress example-gateway-openshift-default出力例
NAME READY UP-TO-DATE AVAILABLE AGE example-gateway-openshift-default 1/1 1 1 25sサービスを確認するには、次のコマンドを実行します。
$ oc get service -n openshift-ingress example-gateway-openshift-default出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-gateway-openshift-default LoadBalancer 10.1.2.3 <external_ipname> <port_info> 47s
オプション: Ingress Operator は、リスナーからのホスト名を使用して
DNSRecordCR を自動的に作成し、ラベルgateway.networking.k8s.io/gateway-name=example-gatewayを追加します。次のコマンドを実行して、DNS レコードのステータスを確認します。$ oc -n openshift-ingress get dnsrecord -l gateway.networking.k8s.io/gateway-name=example-gateway -o yaml出力例
kind: DNSRecord ... status: ... zones: - conditions: - message: The DNS provider succeeded in ensuring the record reason: ProviderSuccess status: "True" type: Published dnsZone: tags: ... - conditions: - message: The DNS provider succeeded in ensuring the record reason: ProviderSuccess status: "True" type: Published dnsZone: id: ...
すでに作成済みの namespace と
example-app/example-appというアプリケーションにリクエストを送信するHTTPRouteリソースを作成します。次の情報が含まれる YAML ファイル
example-route.yamlを作成します。HTTP ルート CR の例
apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: example-route namespace: example-app-ns spec: parentRefs: - name: example-gateway namespace: openshift-ingress hostnames: ["example.gwapi.${DOMAIN}"] rules: - backendRefs: - name: example-app1 port: 8443ここでは、以下のようになります。
metadata.namespace- アプリケーションをデプロイする namespace。
spec.parentRefs-
このフィールドは、以前に設定した
Gatewayオブジェクトを指している必要があります。 spec.hostnames-
ホスト名は、
Gatewayオブジェクトで指定されたホスト名と一致する必要があります。この場合、リスナーはワイルドカードホスト名を使用します。 ルール.バックエンド参照- このフィールドは、サービスを指すバックエンド参照を指定します。
ルール名-
アプリケーションの
Serviceの名前。
次のコマンドを実行して、リソースを適用します。
$ oc apply -f example-route.yaml出力例
httproute.gateway.networking.k8s.io/example-route created
検証
次のコマンドを実行して、
Gatewayオブジェクトがデプロイされ、状態がProgrammedであることを確認します。$ oc wait -n openshift-ingress --for=condition=Programmed gateways.gateway.networking.k8s.io example-gateway出力例
gateway.gateway.networking.k8s.io/example-gateway condition met設定された
HTTPRouteオブジェクトのホスト名にリクエストを送信します。$ curl -I --cacert <local cert file> https://example.gwapi.${DOMAIN}:443
2.12.4. Gateway API デプロイメントトポロジー リンクのコピーリンクがクリップボードにコピーされました!
Gateway API は、共有ゲートウェイと専用ゲートウェイという 2 つのトポロジーに対応するように設計されています。トポロジーは、それぞれの利点とセキュリティー上の影響の違いに基づいて選択できます。
- 専用ゲートウェイ
-
ルートおよびロードバランサーやプロキシーは、同じ namespace から提供されます。
Gatewayオブジェクトは、特定のアプリケーション namespace へのルートを制限します。これは、OpenShift Container Platform に Gateway API リソースをデプロイする場合のデフォルトのトポロジーです。
次の例は、専用の Gateway リソースの fin-gateway を示しています。
専用 Gateway リソースの例
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: fin-gateway
namespace: openshift-ingress
spec:
gatewayClassName: openshift-default
listeners:
- name: http
protocol: HTTP
port: 80
hostname: "example.com"
-
spec.listeneres::Gatewayリソースに対してspec.listeners[].allowedRoutesを設定しない場合、システムは暗黙的にnamespaces.fromフィールドをSameの値に設定します。
次の例は、専用の Gateway オブジェクトにアタッチされる、関連付けられた HTTPRoute リソースの sales-db を示しています。
HTTPRoute リソースの例
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: sales-db
namespace: openshift-ingress
spec:
parentRefs:
- name: fin-gateway
hostnames:
- sales-db.example.com
rules:
- backendRefs:
- name: sales-db
¦ port: 8080
HTTPRoute リソースをゲートウェイにアタッチするには、その parentRefs フィールドの値として Gateway オブジェクトの名前を指定する必要があります。システムは、ルートが ゲートウェイ オブジェクトと同じ名前空間に存在することを暗黙のうちに前提としています。
- 共有ゲートウェイ
-
ルートは複数の名前空間または複数のホスト名から提供されます。
Gatewayオブジェクトは、spec.listeners.allowedRoutes.namespacesフィールドを使用することで、アプリケーション名前空間からのルートを許可します。
次の例は、spec.listeners.allowedRoutes.namespaces ラベルセレクターが shared-gateway-access: "true" を含む任意の namespace と一致するように設定された Gateway リソースの devops-gateway を示しています。
共有 Gateway リソースの例
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: devops-gateway
namespace: openshift-ingress
spec:
gatewayClassName: openshift-default
listeners:
- name: http
protocol: HTTP
port: 80
hostname: "example.com"
allowedRoutes:
namespaces:
from: Selector
selector:
¦ matchLabels:
¦ shared-gateway-access: "true"
次の例は、devops-gateway リソースに許可される namespace を示しています。
Namespace リソースの例
apiVersion: v1
kind: Namespace
metadata:
name: dev
labels:
shared-gateway-access: "true"
---
apiVersion: v1
kind: Namespace
metadata:
name: ops
labels:
shared-gateway-access: "true"
この例では、dev-portal と ops-home という 2 つの HTTPRoute リソースが異なる namespace にありますが、共有ゲートウェイに接続されています。
apiVersion: v1
kind: HTTPRoute
metadata:
name: dev-portal
namespace: dev
spec:
parentRefs:
- name: devops-gateway
namespace: openshift-ingress
rules:
- backendRefs:
- name: dev-portal
port: 8080
---
apiVersion: v1
kind: HTTPRoute
metadata:
name: ops-home
namespace: ops
spec:
parentRefs:
- name: devops-gateway
namespace: openshift-ingress
rules:
- backendRefs:
- name: ops-home
port: 8080
共有ゲートウェイトポロジーでは、各ルートは、アタッチしたい Gateway オブジェクトの namespace を指定する必要があります。複数の Gateway オブジェクトを namespace 間でデプロイして共有できます。共有ゲートウェイが複数ある場合、このトポロジーは概念的には Ingress Controller シャーディングに似たものになります。
2.12.5. Gateway API と OSSM v2.x 間の競合を解消する リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform 4.20 以降では、競合する OpenShift Service Mesh (OSSM) v2.x サブスクリプションが存在する状態で GatewayClass リソースを作成すると、ingress クラスター Operator (CIO) によって Degraded ステータスが報告されます。このステータスを確認して、競合を解決できます。
競合は、Gateway API 実装が、OSSM v2.x と共存できない OSSM v3.x を必要とするために発生します。CIO はこの競合を検出し、Gateway API のプロビジョニングを停止し、Degraded ステータスを報告して管理者に警告します。
前提条件
クラスター Operator は、ステータスとして True、タイプとして Degraded、理由として GatewayAPIOSSMConflict を報告します。次のコマンドを実行して確認します。
$ oc get clusteroperator ingress -o yaml
出力の status セクションで、status: "True" と reason: GatewayAPIOSSMConflict が示されている Degraded 状態を探します。
status:
conditions:
lastTransitionTime: "2025-10-22T17:00:00Z"
message: 'Failed to install OpenShift Service Mesh 3.x for Gateway API: A
conflicting OpenShift Service Mesh 2.x subscription was found. Remove the
GatewayClass resource or the conflicting OSSM 2.x subscription to resolve.'
reason: GatewayAPIOSSMConflict
status: "True"
type: Degraded
この問題を解決し、劣化 状態を解除するには、GatewayClass リソースを削除するか、OpenShift Gateway API を使用して競合する OpenShift Service Mesh v2.x サブスクリプションをクラスターから削除してください。
手順
OpenShift Gateway API を使用しない場合は、
GatewayClassリソースを削除します。これは、Ingress Operator に Gateway API のプロビジョニングの試行を停止するように通知します。$ oc delete gatewayclass <gatewayclass-name>OpenShift Gateway API を使用する場合は、競合する OpenShift Service Mesh v2.x サブスクリプションをクラスターから削除する必要があります。
$ oc -n openshift-operators delete subscription <OSSM v2.x subscription name>v2.x のサブスクリプションを削除すると、Ingress Operator は自動的に OSSM v3.x のインストールを再試行し、ゲートウェイ API のプロビジョニングを完了します。
第3章 RHOSP での負荷分散 リンクのコピーリンクがクリップボードにコピーされました!
RHOSP のコンピュートインスタンス全体にネットワークトラフィックと通信アクティビティーを均等に分散させるには、ロードバランシングサービスを設定します。
3.1. ロードバランサーサービスの制限 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat OpenStack Platform (RHOSP) 上の OpenShift Container Platform クラスターは、Octavia を使用してロードバランサーサービスを処理します。この選択の結果、そのようなクラスターには機能的な制約が生じる可能性がある。
Red Hat OpenStack Platform (RHOSP) 上の OpenShift Container Platform クラスターは、Octavia を使用してロードバランサーサービスを処理します。その結果、お使いのクラスターにはいくつかの機能的な制限があります。
RHOSP Octavia では、Amphora と OVN の 2 つのプロバイダーがサポートされています。これらのプロバイダーは、利用可能な機能や実装の詳細において異なっている。これらの違いは、クラスター上に作成するロードバランサーサービスに影響を与えます。
3.1.1. ローカルの外部トラフィックポリシー リンクのコピーリンクがクリップボードにコピーされました!
ロードバランサーサービスで外部トラフィックポリシー (ETP) パラメーター .spec.externalTrafficPolicy を設定して、受信トラフィックがサービスエンドポイント Pod に到達する際に、その送信元 IP アドレスを保存できます。
クラスターが Amphora Octavia プロバイダーを使用している場合、トラフィックの送信元 IP アドレスは Amphora 仮想マシンの IP アドレスに置き換えられます。クラスターが OVN Octavia プロバイダーを使用している場合、この動作は発生しません。
ETP オプションを ローカル に設定するには、ロードバランサーのヘルスモニターを作成する必要があります。ヘルスモニターがないと、機能するエンドポイントを持たないノードにトラフィックがルーティングされ、接続が切断される可能性があります。ヘルスモニターの作成を Cloud Provider OpenStack に強制するには、クラウドプロバイダー設定の create-monitor オプションの値を true に設定する必要があります。
RHOSP 16.2 では、OVN Octavia プロバイダーはヘルスモニターをサポートしません。したがって、ETP を ローカル に設定することはサポートされていません。
RHOSP 16.2 では、Amphora Octavia プロバイダーは UDP プールでの HTTP モニターをサポートしません。その結果、UDP ロードバランサーサービスには UDP-CONNECT モニターが代わりに作成されます。実装の詳細に基づき、この設定は OVN-Kubernetes CNI プラグインでのみ適切に機能します。
3.2. Octavia を使用したアプリケーショントラフィック用のクラスターのスケーリング リンクのコピーリンクがクリップボードにコピーされました!
複数の仮想マシン (VM) 間でトラフィックを分散するには、Red Hat OpenStack Platform (RHOSP) 上で動作するクラスターを設定して、Octavia ロードバランシングサービスを使用するようにします。この機能を使用することで、個々のマシンやアドレスによって引き起こされるボトルネックを軽減できます。
アプリケーションのネットワークのスケーリングに使用する、独自の Octavia ロードバランサーを作成する必要があります。
3.2.1. Octavia を使用したクラスターのスケーリング リンクのコピーリンクがクリップボードにコピーされました!
複数の API ロードバランサーを使用する場合、Octavia ロードバランサーを作成し、それを使用するようにクラスターを設定します。
前提条件
- Octavia は Red Hat OpenStack Platform (RHOSP) デプロイメントで利用できます。
手順
コマンドラインインターフェイス (CLI) から、Amphora ドライバーを使用する Octavia ロードバランサーを作成します。
$ openstack loadbalancer create --name API_OCP_CLUSTER --vip-subnet-id <id_of_worker_vms_subnet>API_OCP_CLUSTERの代わりに、任意の名前を使用することができます。ロードバランサーがアクティブになったら、リスナーを作成します。
$ openstack loadbalancer listener create --name API_OCP_CLUSTER_6443 --protocol HTTPS--protocol-port 6443 API_OCP_CLUSTER注記ロードバランサーのステータスを表示するには、
openstack loadbalancer listと入力します。ラウンドロビンアルゴリズムを使用し、セッション永続性が有効になっているプールを作成します。
$ openstack loadbalancer pool create --name API_OCP_CLUSTER_pool_6443 --lb-algorithm ROUND_ROBIN --session-persistence type=<source_IP_address> --listener API_OCP_CLUSTER_6443 --protocol HTTPS制御プレーンマシンが利用可能であることを確認するために、ヘルスモニターを作成します。
$ openstack loadbalancer healthmonitor create --delay 5 --max-retries 4 --timeout 10 --type TCP API_OCP_CLUSTER_pool_6443コントロールプレーンマシンをロードバランサープールのメンバーとして追加します。
$ for SERVER in $(MASTER-0-IP MASTER-1-IP MASTER-2-IP) do openstack loadbalancer member create --address $SERVER --protocol-port 6443 API_OCP_CLUSTER_pool_6443 doneオプション: クラスター API の Floating IP アドレスを再利用するには、設定を解除します。
$ openstack floating ip unset $API_FIP設定を解除された
API_FIP、または新規アドレスを、作成されたロードばランサー VIP に追加します。$ openstack floating ip set --port $(openstack loadbalancer show -c <vip_port_id> -f value API_OCP_CLUSTER) $API_FIPクラスターは、負荷分散に Octavia を使用するようになりました。
3.3. ユーザー管理ロードバランサーのサービス リンクのコピーリンクがクリップボードにコピーされました!
Red Hat OpenStack Platform (RHOSP) 上の OpenShift Container Platform クラスターを設定して、デフォルトのロードバランサーの代わりにユーザー管理ロードバランサーを使用できます。
ユーザー管理ロードバランサーの設定は、ベンダーのロードバランサーによって異なります。
このセクションの情報と例は、ガイドラインのみを目的としています。ベンダーのロードバランサーに関する詳細は、ベンダーのドキュメントを参照してください。
Red Hat は、ユーザー管理ロードバランサーに対して次のサービスをサポートしています。
- Ingress Controller
- OpenShift API
- OpenShift MachineConfig API
ユーザー管理ロードバランサーに対して、これらのサービスの 1 つを設定するか、すべてを設定するかを選択できます。一般的な設定オプションは、Ingress Controller サービスのみを設定することです。次の図は、各サービスの詳細を示しています。
図3.1 OpenShift Container Platform 環境で動作する Ingress Controller を示すネットワークワークフローの例
図3.2 OpenShift Container Platform 環境で動作する OpenShift API を示すネットワークワークフローの例
図3.3 OpenShift Container Platform 環境で動作する OpenShift MachineConfig API を示すネットワークワークフローの例
ユーザー管理ロードバランサーでは、次の設定オプションがサポートされています。
- ノードセレクターを使用して、Ingress Controller を特定のノードのセットにマッピングします。このセットの各ノードに静的 IP アドレスを割り当てるか、Dynamic Host Configuration Protocol (DHCP) から同じ IP アドレスを受け取るように各ノードを設定する必要があります。インフラストラクチャーノードは通常、このタイプの設定を受け取ります。
サブネット上のすべての IP アドレスをターゲットにします。この設定では、ロードバランサーターゲットを再設定せずにネットワーク内でノードを作成および破棄できるため、メンテナンスオーバーヘッドを削減できます。
/27や/28などの小規模なネットワーク上に設定されたマシンを使用して Ingress Pod をデプロイする場合、ロードバランサーのターゲットを簡素化できます。ヒントマシン config プールのリソースを確認することで、ネットワーク内に存在するすべての IP アドレスをリスト表示できます。
OpenShift Container Platform クラスターのユーザー管理ロードバランサーを設定する前に、以下の情報を考慮してください。
- フロントエンド IP アドレスの場合、フロントエンド IP アドレス、Ingress Controller のロードバランサー、および API ロードバランサーに同じ IP アドレスを使用できます。この機能は、ベンダーのドキュメントを確認してください。
バックエンド IP アドレスの場合、ユーザー管理ロードバランサーの有効期間中に OpenShift Container Platform コントロールプレーンノードの IP アドレスが変更されないことを確認します。次のいずれかのアクションを実行すると、これを実現できます。
- 各コントロールプレーンノードに静的 IP アドレスを割り当てます。
- ノードが DHCP リースを要求するたびに、DHCP から同じ IP アドレスを受信するように各ノードを設定します。ベンダーによっては、DHCP リースは IP 予約または静的 DHCP 割り当ての形式になる場合があります。
- Ingress Controller バックエンドサービスのユーザー管理ロードバランサーで Ingress Controller を実行する各ノードを手動で定義します。たとえば、Ingress Controller が未定義のノードに移動すると、接続が停止する可能性があります。
3.3.1. ユーザー管理ロードバランサーの設定 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat OpenStack Platform (RHOSP) 上の OpenShift Container Platform クラスターを設定して、デフォルトのロードバランサーの代わりにユーザー管理ロードバランサーを使用できます。
ユーザー管理ロードバランサーを設定する前に、「ユーザー管理ロードバランサーのサービス」セクションを必ずお読みください。
ユーザー管理ロードバランサー用に設定するサービスに適用される次の前提条件をお読みください。
クラスター上で実行される MetalLB は、ユーザー管理ロードバランサーとして機能します。
前提条件
以下に、OpenShift API の前提条件の詳細を記載します。
- フロントエンド IP アドレスを定義している。
TCP ポート 6443 および 22623 は、ロードバランサーのフロントエンド IP アドレスで公開されている。以下の項目を確認します。
- ポート 6443 が OpenShift API サービスにアクセスできる。
- ポート 22623 が Ignition 起動設定をノードに提供できる。
- フロントエンド IP アドレスとポート 6443 へは、OpenShift Container Platform クラスターの外部の場所にいるシステムのすべてのユーザーがアクセスできる。
- フロントエンド IP アドレスとポート 22623 は、OpenShift Container Platform ノードからのみ到達できる。
- ロードバランサーバックエンドは、ポート 6443 および 22623 の OpenShift Container Platform コントロールプレーンノードと通信できる。
以下に、Ingress Controller の前提条件を詳述します。
- フロントエンド IP アドレスを定義している。
- TCP ポート 443 とポート 80 は、ロードバランサーのフロントエンド IP アドレスで公開されています。
- フロントエンドの IP アドレス、ポート 80、ポート 443 は、OpenShift Container Platform クラスターの外部に位置するシステムユーザーすべてからアクセス可能です。
- フロントエンドの IP アドレス、ポート 80、およびポート 443 は、OpenShift Container Platform クラスター内で動作するすべてのノードからアクセス可能です。
- ロードバランサーバックエンドは、ポート 80、443、および 1936 で Ingress Controller を実行する OpenShift Container Platform ノードと通信できる。
以下に、ヘルスチェック URL 仕様の前提条件を詳述します。
ほとんどのロードバランサーは、サービスが使用可能か使用不可かを判断するヘルスチェック URL を指定して設定できます。OpenShift Container Platform は、OpenShift API、Machine Configuration API、および Ingress Controller バックエンドサービスのこれらのヘルスチェックを提供します。
以下の例は、バックエンドサービスに対する Kubernetes API のヘルスチェック仕様を示しています。
Path: HTTPS:6443/readyz
Healthy threshold: 2
Unhealthy threshold: 2
Timeout: 10
Interval: 10
以下の例は、バックエンドサービスに対するマシン設定 API のヘルスチェック仕様を示しています。
Path: HTTPS:22623/healthz
Healthy threshold: 2
Unhealthy threshold: 2
Timeout: 10
Interval: 10
以下の例は、バックエンドサービスに対する Ingress Controller のヘルスチェック仕様を示しています。
Path: HTTP:1936/healthz/ready
Healthy threshold: 2
Unhealthy threshold: 2
Timeout: 5
Interval: 10
手順
HAProxy Ingress Controller を設定して、ポート 6443、22623、443、および 80 でロードバランサーからクラスターへのアクセスを有効化できるようにします。必要に応じて、HAProxy 設定で単一のサブネットの IP アドレスまたは複数のサブネットの IP アドレスを指定できます。
1 つのサブネットをリストした HAProxy 設定の例
# ... listen my-cluster-api-6443 bind 192.168.1.100:6443 mode tcp balance roundrobin option httpchk http-check connect http-check send meth GET uri /readyz http-check expect status 200 server my-cluster-master-2 192.168.1.101:6443 check inter 10s rise 2 fall 2 server my-cluster-master-0 192.168.1.102:6443 check inter 10s rise 2 fall 2 server my-cluster-master-1 192.168.1.103:6443 check inter 10s rise 2 fall 2 listen my-cluster-machine-config-api-22623 bind 192.168.1.100:22623 mode tcp balance roundrobin option httpchk http-check connect http-check send meth GET uri /healthz http-check expect status 200 server my-cluster-master-2 192.168.1.101:22623 check inter 10s rise 2 fall 2 server my-cluster-master-0 192.168.1.102:22623 check inter 10s rise 2 fall 2 server my-cluster-master-1 192.168.1.103:22623 check inter 10s rise 2 fall 2 listen my-cluster-apps-443 bind 192.168.1.100:443 mode tcp balance roundrobin option httpchk http-check connect http-check send meth GET uri /healthz/ready http-check expect status 200 server my-cluster-worker-0 192.168.1.111:443 check port 1936 inter 10s rise 2 fall 2 server my-cluster-worker-1 192.168.1.112:443 check port 1936 inter 10s rise 2 fall 2 server my-cluster-worker-2 192.168.1.113:443 check port 1936 inter 10s rise 2 fall 2 listen my-cluster-apps-80 bind 192.168.1.100:80 mode tcp balance roundrobin option httpchk http-check connect http-check send meth GET uri /healthz/ready http-check expect status 200 server my-cluster-worker-0 192.168.1.111:80 check port 1936 inter 10s rise 2 fall 2 server my-cluster-worker-1 192.168.1.112:80 check port 1936 inter 10s rise 2 fall 2 server my-cluster-worker-2 192.168.1.113:80 check port 1936 inter 10s rise 2 fall 2 # ...複数のサブネットをリストした HAProxy 設定の例
# ... listen api-server-6443 bind *:6443 mode tcp server master-00 192.168.83.89:6443 check inter 1s server master-01 192.168.84.90:6443 check inter 1s server master-02 192.168.85.99:6443 check inter 1s server bootstrap 192.168.80.89:6443 check inter 1s listen machine-config-server-22623 bind *:22623 mode tcp server master-00 192.168.83.89:22623 check inter 1s server master-01 192.168.84.90:22623 check inter 1s server master-02 192.168.85.99:22623 check inter 1s server bootstrap 192.168.80.89:22623 check inter 1s listen ingress-router-80 bind *:80 mode tcp balance source server worker-00 192.168.83.100:80 check inter 1s server worker-01 192.168.83.101:80 check inter 1s listen ingress-router-443 bind *:443 mode tcp balance source server worker-00 192.168.83.100:443 check inter 1s server worker-01 192.168.83.101:443 check inter 1s listen ironic-api-6385 bind *:6385 mode tcp balance source server master-00 192.168.83.89:6385 check inter 1s server master-01 192.168.84.90:6385 check inter 1s server master-02 192.168.85.99:6385 check inter 1s server bootstrap 192.168.80.89:6385 check inter 1s listen inspector-api-5050 bind *:5050 mode tcp balance source server master-00 192.168.83.89:5050 check inter 1s server master-01 192.168.84.90:5050 check inter 1s server master-02 192.168.85.99:5050 check inter 1s server bootstrap 192.168.80.89:5050 check inter 1s # ...curlCLI コマンドを使用して、ユーザー管理ロードバランサーとそのリソースが動作していることを確認します。次のコマンドを実行して応答を観察し、クラスターマシン設定 API が Kubernetes API サーバーリソースにアクセスできることを確認します。
$ curl https://<loadbalancer_ip_address>:6443/version --insecure設定が正しい場合は、応答として JSON オブジェクトを受信します。
{ "major": "1", "minor": "11+", "gitVersion": "v1.11.0+ad103ed", "gitCommit": "ad103ed", "gitTreeState": "clean", "buildDate": "2019-01-09T06:44:10Z", "goVersion": "go1.10.3", "compiler": "gc", "platform": "linux/amd64" }次のコマンドを実行して出力を確認し、クラスターマシン設定 API がマシン設定サーバーリソースからアクセスできることを確認します。
$ curl -v https://<loadbalancer_ip_address>:22623/healthz --insecure設定が正しい場合、コマンドの出力には次の応答が表示されます。
HTTP/1.1 200 OK Content-Length: 0次のコマンドを実行して出力を確認し、コントローラーがポート 80 の Ingress Controller リソースにアクセスできることを確認します。
$ curl -I -L -H "Host: console-openshift-console.apps.<cluster_name>.<base_domain>" http://<load_balancer_front_end_IP_address>設定が正しい場合、コマンドの出力には次の応答が表示されます。
HTTP/1.1 302 Found content-length: 0 location: https://console-openshift-console.apps.ocp4.private.opequon.net/ cache-control: no-cache次のコマンドを実行して出力を確認し、コントローラーがポート 443 の Ingress Controller リソースにアクセスできることを確認します。
$ curl -I -L --insecure --resolve console-openshift-console.apps.<cluster_name>.<base_domain>:443:<Load Balancer Front End IP Address> https://console-openshift-console.apps.<cluster_name>.<base_domain>設定が正しい場合、コマンドの出力には次の応答が表示されます。
HTTP/1.1 200 OK referrer-policy: strict-origin-when-cross-origin set-cookie: csrf-token=UlYWOyQ62LWjw2h003xtYSKlh1a0Py2hhctw0WmV2YEdhJjFyQwWcGBsja261dGLgaYO0nxzVErhiXt6QepA7g==; Path=/; Secure; SameSite=Lax x-content-type-options: nosniff x-dns-prefetch-control: off x-frame-options: DENY x-xss-protection: 1; mode=block date: Wed, 04 Oct 2023 16:29:38 GMT content-type: text/html; charset=utf-8 set-cookie: 1e2670d92730b515ce3a1bb65da45062=1bf5e9573c9a2760c964ed1659cc1673; path=/; HttpOnly; Secure; SameSite=None cache-control: private
ユーザー管理ロードバランサーのフロントエンド IP アドレスをターゲットにするようにクラスターの DNS レコードを設定します。ロードバランサー経由で、クラスター API およびアプリケーションの DNS サーバーのレコードを更新する必要があります。以下の例は、変更された DNS レコードを示しています。
<load_balancer_ip_address> A api.<cluster_name>.<base_domain> A record pointing to Load Balancer Front End<load_balancer_ip_address> A apps.<cluster_name>.<base_domain> A record pointing to Load Balancer Front End重要DNS の伝播では、各 DNS レコードが使用可能になるまでに時間がかかる場合があります。各レコードを検証する前に、各 DNS レコードが伝播されることを確認してください。
OpenShift Container Platform クラスターでユーザー管理ロードバランサーを使用するには、クラスターの
install-config.yamlファイルで次の設定を指定する必要があります。# ... platform: openstack: loadBalancer: type: UserManaged apiVIPs: - <api_ip>1 ingressVIPs: - <ingress_ip>2 # ...ここでは、以下のようになります。
ロードバランサーのタイプ-
クラスターのユーザー管理ロードバランサーを指定するには、
typeパラメーターにUserManagedを設定します。パラメーターのデフォルトはOpenShiftManagedDefaultで、これはデフォルトの内部ロードバランサーを示します。openshift-kni-infranamespace で定義されたサービスの場合、ユーザー管理ロードバランサーはcorednsサービスをクラスター内の Pod にデプロイできますが、keepalivedおよびhaproxyサービスは無視します。 ロードバランサー.<api_ip>- ユーザーが管理するロードバランサーを指定します。Kubernetes API がユーザー管理ロードバランサーと通信できるように、ユーザー管理ロードバランサーのパブリック IP アドレスを指定します。必須パラメーター。
ロードバランサー.<ingress_ip>- ユーザーが管理するロードバランサーを指定します。ユーザー管理ロードバランサーのパブリック IP アドレスを指定して、ユーザー管理ロードバランサーがクラスターの Ingress トラフィックを管理できるようにします。必須パラメーター。
検証
curlCLI コマンドを使用して、ユーザー管理ロードバランサーと DNS レコード設定が動作していることを確認します。次のコマンドを実行して出力を確認し、クラスター API にアクセスできることを確認します。
$ curl https://api.<cluster_name>.<base_domain>:6443/version --insecure設定が正しい場合は、応答として JSON オブジェクトを受信します。
{ "major": "1", "minor": "11+", "gitVersion": "v1.11.0+ad103ed", "gitCommit": "ad103ed", "gitTreeState": "clean", "buildDate": "2019-01-09T06:44:10Z", "goVersion": "go1.10.3", "compiler": "gc", "platform": "linux/amd64" }次のコマンドを実行して出力を確認し、クラスターマシン設定にアクセスできることを確認します。
$ curl -v https://api.<cluster_name>.<base_domain>:22623/healthz --insecure設定が正しい場合、コマンドの出力には次の応答が表示されます。
HTTP/1.1 200 OK Content-Length: 0以下のコマンドを実行し、その出力を確認することで、各クラスターアプリケーションにポート 80 でアクセスできることを確認してください。
$ curl http://console-openshift-console.apps.<cluster_name>.<base_domain> -I -L --insecure設定が正しい場合、コマンドの出力には次の応答が表示されます。
HTTP/1.1 302 Found content-length: 0 location: https://console-openshift-console.apps.<cluster-name>.<base domain>/ cache-control: no-cacheHTTP/1.1 200 OK referrer-policy: strict-origin-when-cross-origin set-cookie: csrf-token=39HoZgztDnzjJkq/JuLJMeoKNXlfiVv2YgZc09c3TBOBU4NI6kDXaJH1LdicNhN1UsQWzon4Dor9GWGfopaTEQ==; Path=/; Secure x-content-type-options: nosniff x-dns-prefetch-control: off x-frame-options: DENY x-xss-protection: 1; mode=block date: Tue, 17 Nov 2020 08:42:10 GMT content-type: text/html; charset=utf-8 set-cookie: 1e2670d92730b515ce3a1bb65da45062=9b714eb87e93cf34853e87a92d6894be; path=/; HttpOnly; Secure; SameSite=None cache-control: private次のコマンドを実行して出力を確認し、ポート 443 で各クラスターアプリケーションにアクセスできることを確認します。
$ curl https://console-openshift-console.apps.<cluster_name>.<base_domain> -I -L --insecure設定が正しい場合、コマンドの出力には次の応答が表示されます。
HTTP/1.1 200 OK referrer-policy: strict-origin-when-cross-origin set-cookie: csrf-token=UlYWOyQ62LWjw2h003xtYSKlh1a0Py2hhctw0WmV2YEdhJjFyQwWcGBsja261dGLgaYO0nxzVErhiXt6QepA7g==; Path=/; Secure; SameSite=Lax x-content-type-options: nosniff x-dns-prefetch-control: off x-frame-options: DENY x-xss-protection: 1; mode=block date: Wed, 04 Oct 2023 16:29:38 GMT content-type: text/html; charset=utf-8 set-cookie: 1e2670d92730b515ce3a1bb65da45062=1bf5e9573c9a2760c964ed1659cc1673; path=/; HttpOnly; Secure; SameSite=None cache-control: private
3.4. Ingress Controller で Floating IP アドレスを指定する リンクのコピーリンクがクリップボードにコピーされました!
Red Hat OpenStack Platform (RHOSP) 上の OpenShift Container Platform クラスターへの外部アクセスを確立するには、自動的に割り当てられるフローティング IP アドレスを使用します。フローティング IP アドレスは、イングレスポートに関連付けられています。
DNS レコードを更新してデプロイメントをクラスタリングする前に、フローティング IP アドレスを事前に作成しておくと良いでしょう。その場合は、Ingress Controller に Floating IP アドレスを定義できます。これは、Octavia を使用しているか、ユーザー管理のクラスターを使用しているかにかかわらず実行できます。
手順
Floating IP を使用して Ingress Controller カスタムリソース (CR) ファイルを作成します。
Ingress 設定の例 (
sample-ingress.yaml)apiVersion: operator.openshift.io/v1 kind: IngressController metadata: namespace: openshift-ingress-operator name: <name> spec: domain: <domain> endpointPublishingStrategy: type: LoadBalancerService loadBalancer: scope: External providerParameters: type: OpenStack openstack: floatingIP: <ingress_port_IP>ここでは、以下のようになります。
metadata.name-
Ingress コントローラーの名前を指定します。デフォルトの Ingress Controller を使用している場合、このフィールドの値は
defaultになります。 仕様ドメイン- Ingress コントローラーが処理する DNS 名を指定します。
loadBalancer.scope-
Floating IP アドレスを使用するには、スコープを
Externalに設定する必要があります。 openstack.- Ingress Controller がリッスンしているポートに関連付けられたフローティング IP アドレスを指定します。
以下のコマンドを実行して CR ファイルを適用します。
$ oc apply -f sample-ingress.yamlIngress Controller エンドポイントを使用して DNS レコードを更新します。
*.apps.<name>.<domain>. IN A <ingress_port_IP>- OpenShift Container Platform クラスターの作成を続行します。
検証
次のコマンドを使用して
IngressControllerの状態を確認し、ロードバランサーが正常にプロビジョニングされたことを確認します。$ oc get ingresscontroller -n openshift-ingress-operator <name> -o jsonpath="{.status.conditions}" | yq -PC
第4章 MetalLB を使用した負荷分散 リンクのコピーリンクがクリップボードにコピーされました!
4.1. MetalLB アドレスプールの設定 リンクのコピーリンクがクリップボードにコピーされました!
ロードバランサーサービスに割り当てられた IP アドレスを割り当て、管理するには、MetalLB アドレスプールのカスタムリソースを設定します。これらのプールを定義することで、アプリケーションのワークロードが指定されたネットワーク範囲を通じて常にアクセス可能となり、外部からのアクセスが安定的に行われることが保証されます。
例で使用されている名前空間では 、metallb-system が 名前空間として示されています。
MetalLB Operator のインストール方法の詳細は、MetalLB および MetalLB Operator について を参照してください。
4.1.1. IPAddressPool カスタムリソースについて リンクのコピーリンクがクリップボードにコピーされました!
ロードバランサーサービスで使用可能な IP アドレス範囲を定義するには、MetalLB IPAddressPool カスタムリソース (CR) のプロパティーを設定します。
以下の表は、IPAddressPool CR のパラメーターの詳細を示しています。
| パラメーター | 型 | 説明 |
|---|---|---|
|
|
|
アドレスプールの名前を指定します。サービスを追加する場合は、 |
|
|
| アドレスプールの namespace を指定します。MetalLB Operator が使用するものと同じ namespace を指定します。 |
|
|
|
オプション: |
|
|
| MetalLB Operator がサービスに割り当てる IP アドレスのリストを指定します。1 つのプール内で複数の範囲を指定できます。これらの範囲はすべて同じ設定を共有します。各範囲は、Classless Inter-Domain Routing (CIDR) 表記で指定するか、開始 IP アドレスと終了 IP アドレスをハイフンで区切って指定します。 |
|
|
|
オプション:MetalLBOperator がこのプールから IP アドレスを自動的に割り当てるかどうかを指定します。 注記
IP アドレスプール設定の場合、アドレスパラメーターには、利用可能で他のネットワークデバイス (特にゲートウェイアドレス) で使用されていない IP アドレスのみを指定するようにしてください。これにより、 |
|
|
|
オプション: このパラメーターを有効に設定すると、末尾が |
spec.serviceAllocation 仕様を設定することにより、IPAddressPool からサービスおよび namespace に IP アドレスを割り当てることができます。
| パラメーター | 型 | 説明 |
|---|---|---|
|
|
| オプション: 複数の IP アドレスプールがサービスまたは namespace に一致する場合の IP アドレスプール間の優先度を定義します。数字が小さいほど優先度が高いことを示します。 |
|
|
| オプション: IP アドレスプール内の IP アドレスに割り当てることができる namespace のリストを指定します。 |
|
|
| オプション: リスト形式のラベルセレクターを使用して、IP アドレスプールから IP アドレスに割り当てることができる namespace ラベルを指定します。 |
|
|
| オプション: リスト形式のラベルセレクターを使用して、アドレスプールから IP アドレスに割り当てることができるサービスラベルを指定します。 |
4.1.2. アドレスプールの設定 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションワークロードへの外部アクセスを正確に管理するには、クラスター用に MetalLB アドレスプールを設定してください。これらのプールを定義することで、ロードバランサーサービスに割り当てられる特定の IP アドレス範囲を制御し、一貫性のあるネットワークルーティングを実現できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
以下の例のような内容で、
ipaddresspool.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example labels: zone: east spec: addresses: - 203.0.113.1-203.0.113.10 - 203.0.113.65-203.0.113.75 # ...ここでは、以下のようになります。
labels-
IPAddressPoolに割り当てられたラベルは、BGPAdvertisementCRD 内のipAddressPoolSelectorsによって参照され、IPAddressPool をアドバタイズメントに関連付けることができます。
次のコマンドを入力して、IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool.yaml
検証
次のコマンドを入力して、アドレスプールを表示します。
$ oc describe -n metallb-system IPAddressPool doc-example出力例
Name: doc-example Namespace: metallb-system Labels: zone=east Annotations: <none> API Version: metallb.io/v1beta1 Kind: IPAddressPool Metadata: ... Spec: Addresses: 203.0.113.1-203.0.113.10 203.0.113.65-203.0.113.75 Auto Assign: true Events: <none>-
doc-exampleなどのアドレスプール名と IP アドレス範囲が出力に存在することを確認します。
4.1.3. VLAN の MetalLB アドレスプールの設定 リンクのコピーリンクがクリップボードにコピーされました!
特定の VLAN を介した外部アクセスを正確に管理するには、クラスター用に MetalLB アドレスプールを設定してください。これらのプールを定義することで、ロードバランサーサービスは、指定されたネットワーク範囲から承認された IP アドレスを取得し、安全かつ一貫性のあるルーティングを実現できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - 別の VLAN を設定する。
-
cluster-admin権限を持つユーザーとしてログインしている。
手順
次の例のようなファイル (
ipaddresspool-vlan.yamlなど) を作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-vlan labels: zone: east spec: addresses: - 192.168.100.1-192.168.100.254 # ...ここでは、以下のようになります。
ラベルゾーン-
IPAddressPoolに割り当てられたこのラベルは、BGPAdvertisementCRD のipAddressPoolSelectorsによって参照され、IPAddressPoolをアドバタイズメントに関連付けることができます。 spec.addresses- この IP 範囲は、ネットワーク上の VLAN に割り当てられたサブネットと一致する必要があります。レイヤー 2 (L2) モードをサポートするには、IP アドレス範囲がクラスターノードと同じサブネット内にある必要があります。
IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool-vlan.yamlこの設定が VLAN に適用されることを確認するには、
specgatewayConfig.ipForwarding をGlobalに設定する必要があります。次のコマンドを実行して、ネットワーク設定カスタムリソース (CR) を編集します。
$ oc edit network.operator.openshift/clusterspec.defaultNetwork.ovnKubernetesConfigセクションを更新して、gatewayConfig.ipForwardingをGlobalに設定します。次の例はこの設定を示しています。apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: clusterNetwork: - cidr: 10.128.0.0/14 hostPrefix: 23 defaultNetwork: type: OVNKubernetes ovnKubernetesConfig: gatewayConfig: ipForwarding: Global # ...
4.1.4. アドレスプールの設定例 リンクのコピーリンクがクリップボードにコピーされました!
クラスターサービスに IP アドレス範囲を正確に割り当てるには、Classless Inter-Domain Routing (CIDR) 表記またはハイフン付き境界を使用して MetalLB アドレスプールを設定します。これらの特定の範囲を定義することで、アプリケーションのワークロードが、既存のネットワークインフラストラクチャーの要件に合致した有効な IP アドレス割り当てを受けられることが保証されます。
- IPv4 と CIDR の範囲の例
- Classless Inter-Domain Routing (CIDR) 表記で IP アドレスの範囲を指定できます。CIDR 表記と、ハイフンを使用する表記を組み合わせて下層と上限を分けることができます。
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: doc-example-cidr
namespace: metallb-system
spec:
addresses:
- 192.168.100.0/24
- 192.168.200.0/24
- 192.168.255.1-192.168.255.5
# ...
- IP アドレスの割り当て例
-
autoAssignパラメーターをfalseに設定すると、MetalLB がアドレスプールから IP アドレスを自動的に割り当てるのを防ぐことができます。その場合、IP アドレスプールから単一の IP アドレスまたは複数の IP アドレスを割り当てることができます。IP アドレスを割り当てるには、spec.addressesパラメーター内のターゲット IP アドレスに CIDR 表記/32を追加します。この設定により、特定の IP アドレスのみが割り当て可能となり、予約されていない IP アドレスはアプリケーションで使用できるようになります。
複数の IP アドレスを割り当てる IPAddressPool CR の例
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: doc-example-reserved
namespace: metallb-system
spec:
addresses:
- 192.168.100.1/32
- 192.168.200.1/32
autoAssign: false
# ...
サービスを追加する場合は、アドレスプールから特定の IP アドレスを要求することも、アノテーションでプール名を指定して、そのプールから任意の IP アドレスを要求することもできます。
- IPv4 アドレスと IPv6 アドレスの例
-
IPv4 および IPv6 を使用するアドレスプールを追加できます。複数の IPv4 の例と同様に、
addresses一覧で複数の範囲を指定できます。
サービスが単一の IPv4 アドレス、単一の IPv6 アドレス、またはその両方に割り当てられるかどうかは、サービスの追加方法によって決まります。spec.ipFamilies および spec.ipFamilyPolicy パラメーターは、サービスに IP アドレスを割り当てる方法を制御します。
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: doc-example-combined
namespace: metallb-system
spec:
addresses:
- 10.0.100.0/28
- 2002:2:2::1-2002:2:2::100
# ...
spec.addresses: ここで、10.0.100.0/28 はローカルネットワークの IP アドレスに /28 ネットワークプレフィックスが続くものです。
- サービスまたは名前空間に IP アドレスプールを割り当てる例
-
IPAddressPoolから指定したサービスと namespace に IP アドレスを割り当てることができます。
サービスまたは namespace を複数の IP アドレスプールに割り当てる場合、MetalLB は優先度の高い IP アドレスプールから使用可能な IP アドレスを使用します。割り当てられた優先度の高い IP アドレスプールから使用可能な IP アドレスがない場合、MetalLB は、優先度の低い、または優先度のない IP アドレスプールから使用可能な IP アドレスを使用します。
namespaceSelectors と serviceSelectors の仕様には、matchLabels ラベルセレクター、matchExpressions ラベルセレクター、またはその両方を使用できます。この例は、仕様ごとに 1 つのラベルセレクターを示しています。
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: doc-example-service-allocation
namespace: metallb-system
spec:
addresses:
- 192.168.20.0/24
serviceAllocation:
priority: 50
namespaces:
- namespace-a
- namespace-b
namespaceSelectors:
- matchLabels:
zone: east
serviceSelectors:
- matchExpressions:
- key: security
operator: In
values:
- S1
# ...
ここでは、以下のようになります。
サービス割り当て優先度- アドレスプールに優先度を割り当てます。数字が小さいほど優先度が高いことを示します。
serviceAllocation.namespaces- 1 つ以上の namespace をリスト形式で IP アドレスプールに割り当てます。
serviceAllocation.namespaceSelectors- リスト形式のラベルセレクターを使用して、1 つ以上の namespace ラベルを IP アドレスプールに割り当てます。
serviceAllocation.serviceSelectors- リスト形式のラベルセレクターを使用して、1 つ以上のサービスラベルを IP アドレスプールに割り当てます。
4.2. IP アドレスプールのアドバタイズメントについて リンクのコピーリンクがクリップボードにコピーされました!
IP アドレスがレイヤー 2 プロトコル、BGP プロトコル、またはその両方でアドバタイズされるように MetalLB を設定できます。
レイヤー 2 では、MetalLB ではフォールトトレラントな外部 IP アドレスを使用できます。BGP を使用すると、MetalLB で外部 IP アドレスに対するフォールトトレランス機能および負荷分散が提供されます。
MetalLB は、同一の IP アドレスセットに対してレイヤ 2 と BGP を使用してアドバタイズメントをサポートします。
MetalLB は、特定の BGP ピアにアドレスプールを割り当てる柔軟性を提供し、ネットワーク上のノードのサブセットにアドバタイズを効果的に制限します。これにより、ノードの分離やネットワークのセグメンテーションなど、より複雑な設定が可能になります。
4.2.1. BGPAdvertisement カスタムリソースについて リンクのコピーリンクがクリップボードにコピーされました!
クラスターが外部ピアに IP アドレスを通知する方法を設定するには、BGPAdvertisement カスタムリソース (CR) のプロパティーを定義します。これらのパラメーターを指定することで、MetalLB がネットワーク内でアプリケーションサービスのルーティングアドバタイズメントを正しく管理できるようになります。
以下の表は、BGPAdvertisements CR のパラメーターについて説明しています。
| パラメーター | 型 | 説明 |
|---|---|---|
|
|
| BGP アドバタイズメントの名前を指定します。 |
|
|
| BGP アドバタイズメントの namespace を指定します。MetalLB Operator が使用するものと同じ namespace を指定します。 |
|
|
|
オプション: 32 ビット CIDR マスクに含めるビット数を指定します。マスクが複数のサービス IP アドレスのルートに適用され、speaker は集約されたルートをアドバタイズし、speaker が BGP ピアにアドバタイズするルートを集約します。たとえば、集約の長さが |
|
|
|
オプション: 128 ビット CIDR マスクに含めるビット数を指定します。たとえば、集約の長さが |
|
|
| オプション: 1 つ以上の BGP コミュニティーを指定します。各コミュニティーは、16 ビット値 2 つをコロン文字で区切って指定します。一般的なコミュニティーは、16 ビット値として指定する必要があります。
|
|
|
| オプション: このアドバタイズメントのローカル設定を指定します。この BGP 属性は、Autonomous System 内の BGP セッションに適用されます。 |
|
|
|
オプション: 名前で選択された、このアドバタイズメントでアドバタイズする |
|
|
|
オプション: このアドバタイズメントでアドバタイズされる |
|
|
|
オプション: |
|
|
|
オプション: リストを使用して、MetalLB サービス IP アドレスのアドバタイズメントを受信する各 |
4.2.2. MetalLB を BGP アドバタイズメントと基本的なユースケースで設定する リンクのコピーリンクがクリップボードにコピーされました!
MetalLB がサービスに割り当てるロードバランサーの IP アドレスごとに、ピア BGP ルーターが 203.0.113.200/32 ルートと fc00:f853:ccd:e799::1/128 ルートをそれぞれ 1 つずつ受信するように MetalLB を設定します。
localPref および communities フィールドが指定されていないため、ルートは localPref をゼロに設定して BGP コミュニティーなしでアドバタイズされます。
MetalLB がサービスに割り当てるロードバランサーの IP アドレスごとに、ピア BGP ルーターが 203.0.113.200/32 ルートと fc00:f853:ccd:e799::1/128 ルートをそれぞれ 1 つずつ受信するように MetalLB を設定できることを確認してください。localPref および communities パラメーターを指定しない場合、MetalLB は localPref を 0 に設定し、BGP コミュニティーを指定しないルートをアドバタイズします。
4.2.2.1. BGP を使用した基本アドレスプール設定のアドバタイズ リンクのコピーリンクがクリップボードにコピーされました!
MetalLB が BGP(Border Gateway Protocol) を使用して IP アドレスプールを アドバタイズするように設定します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
IP アドレスプールを作成します。
以下の例のような内容で、
ipaddresspool.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-bgp-basic spec: addresses: - 203.0.113.200/30 - fc00:f853:ccd:e799::/124 # ...IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool.yaml
BGP アドバタイズメントを作成します。
以下の例のような内容で、
bgpadvertisement.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: bgpadvertisement-basic namespace: metallb-system spec: ipAddressPools: - doc-example-bgp-basic # ...設定を適用します。
$ oc apply -f bgpadvertisement.yaml
4.2.3. BGP アドバタイズメントと高度なユースケースを使用する MetalLB の設定 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB を設定して、MetalLB がロードバランサーサービスに 203.0.113.200 から 203.0.113.203 の範囲、および fc00:f853:ccd:e799::0 から fc00:f853:ccd:e799::f の 範囲の IP アドレスを割り当てるようにします。
MetalLB が 203.0.113.200 の IP アドレスをサービスに割り当てる例を見ていき、これら 2 つの BGP アドバタイズメントを説明します。その IP アドレスを例にとると、スピーカーは BGP ピアに対して以下の 2 つのルートをアドバタイズします。
-
localPrefが100に、コミュニティーがNO_ADVERTISEコミュニティーの数値に設定されている203.0.113.200/32。この仕様は、ピアルーターにこのルートを使用できることを指定していますが、このルートに関する情報を BGP ピアに伝播しないようにします。 -
MetalLB で割り当てられたロードバランサーの IP アドレスを 1 つのルートに集約する
203.0.113.200/30。MetalLB は、コミュニティー属性が8000:800に設定された BGP ピアに集約ルートをアドバタイズします。BGP ピアは、203.0.113.200/30ルートを他の BGP ピアに伝播します。トラフィックが speaker のあるノードにルーティングされる場合には、203.0.113.200/32ルートを使用して、トラフィックがクラスターに転送され、サービスに関連付けられている Pod に転送されます。
サービスを追加し、MetalLB がプールからロードバランサーの IP アドレスをより多く割り当てると、ピアルーターは各サービスに対して 1 つのローカルルート (203.0.113.20x/32) と、集約ルート (203.0.113.200/30) を受け取ります。追加する各サービスは /30 ルートを生成しますが、MetalLB は、ピアルーターと通信する前に、ルートの重複を排除して 1 つの BGP アドバタイズにします。
4.2.3.1. BGP を使用した高度なアドレスプール設定のアドバタイズ リンクのコピーリンクがクリップボードにコピーされました!
MetalLB が BGP を使用して高度なアドレスプールをアドバタイズするように設定します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
IP アドレスプールを作成します。
以下の例のような内容で、
ipaddresspool.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-bgp-adv labels: zone: east spec: addresses: - 203.0.113.200/30 - fc00:f853:ccd:e799::/124 autoAssign: false # ...IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool.yaml
BGP アドバタイズメントを作成します。
以下の例のような内容で、
bgpadvertisement1.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: bgpadvertisement-adv-1 namespace: metallb-system spec: ipAddressPools: - doc-example-bgp-adv communities: - 65535:65282 aggregationLength: 32 localPref: 100 # ...設定を適用します。
$ oc apply -f bgpadvertisement1.yaml以下の例のような内容で、
bgpadvertisement2.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: bgpadvertisement-adv-2 namespace: metallb-system spec: ipAddressPools: - doc-example-bgp-adv communities: - 8000:800 aggregationLength: 30 aggregationLengthV6: 124 # ...設定を適用します。
$ oc apply -f bgpadvertisement2.yaml
4.2.4. ノードのサブセットからの IP アドレスプールのアドバタイズ リンクのコピーリンクがクリップボードにコピーされました!
IP アドレスプールから特定のノードセットのみの IP アドレスをアドバタイズするには、BGPAdvertisement カスタムリソース (CR) の .spec.nodeSelector 仕様を使用します。この仕様は、IP アドレスのプールをクラスター内の一連のノードに関連付けます。これは、クラスター内の異なるサブネット上にノードがあり、特定のサブネット (パブリックに面したサブネットのみなど) のアドレスプールから IP アドレスをアドバタイズしたい場合に役立ちます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
CR を使用して IP アドレスプールを作成します。
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: pool1 spec: addresses: - 4.4.4.100-4.4.4.200 - 2001:100:4::200-2001:100:4::400 # ...BGPAdvertisementCR の.spec.nodeSelector値を設定することで、プール 1から IP アドレスをアドバタイズするクラスターノードを制御します。次の例では、プール 1の IP アドレスをNodeAとNodeBからのみアドバタイズします。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: example spec: ipAddressPools: - pool1 nodeSelector: - matchLabels: kubernetes.io/hostname: NodeA - matchLabels: kubernetes.io/hostname: NodeB # ...
4.2.5. L2Advertisement カスタムリソースについて リンクのコピーリンクがクリップボードにコピーされました!
レイヤ 2 ネットワーク上でアプリケーションサービスがどのように通知されるかを設定するには、L2Advertisement カスタムリソース (CR) のプロパティーを定義します。これらのパラメーターを設定することで、MetalLB がローカルネットワークインフラストラクチャー内でロードバランサーの IP アドレスのルーティングを正しく管理できるようになります。
以下の表は、l2Advertisements CR のパラメーターの詳細を示しています。
| パラメーター | 型 | 説明 |
|---|---|---|
|
|
| L2 アドバタイズメントの名前を指定します。 |
|
|
| L2 アドバタイズメントの namespace を指定します。MetalLB Operator が使用するものと同じ namespace を指定します。 |
|
|
|
オプション: 名前で選択された、このアドバタイズメントでアドバタイズする |
|
|
|
オプション: この広告で宣伝する |
|
|
|
オプション: 重要 ネクストホップとしてアナウンスするノードの制限は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。 Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。 |
|
|
|
オプション: ロードバランサーの IP アドレスを通知する |
4.2.6. L2 アドバタイズメントを使用した MetalLB の設定 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB を設定することで、IP アドレスプールを L2 プロトコルでアドバタイズすることができます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
IP アドレスプールを作成します。
以下の例のような内容で、
ipaddresspool.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-l2 spec: addresses: - 4.4.4.0/24 autoAssign: false # ...IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool.yaml
L2 広告を作成します。
以下の例のような内容で、
l2advertisement.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2advertisement namespace: metallb-system spec: ipAddressPools: - doc-example-l2 # ...設定を適用します。
$ oc apply -f l2advertisement.yaml
4.2.7. MetalLB を L2 アドバタイズメントとラベルで設定する リンクのコピーリンクがクリップボードにコピーされました!
BGPAdvertisement および L2Advertisement の カスタムリソース定義にある ipAddressPoolSelectors フィールドを使用すると、IP アドレスプールを アドバタイズメントに関連付けることができます。この関連付けは、IPAddressPool の名前自体ではなく、割り当てられたラベルに基づいています。
手順書の例では、ipAddressPoolSelectors フィールドを設定することで、IPAddressPool が L2 プロトコルでアドバタイズされるように MetalLB を設定する方法を示しています。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
IP アドレスプールを作成します。
以下の例のような内容で、
ipaddresspool.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-l2-label labels: zone: east spec: addresses: - 172.31.249.87/32 # ...IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool.yaml
ipAddressPoolSelectorsを使用して IP アドレスをアドバタイズする L2 アドバタイズを作成します。以下の例のような内容で、
l2advertisement.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2advertisement-label namespace: metallb-system spec: ipAddressPoolSelectors: - matchExpressions: - key: zone operator: In values: - east # ...設定を適用します。
$ oc apply -f l2advertisement.yaml
4.2.8. 選択したインターフェイスの L2 アドバタイズを使用した MetalLB の設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、サービスに割り当てられた IP アドレスプールの IP アドレスが、すべてのネットワークインターフェイスからアドバタイズされます。L2Advertisement カスタムリソース定義の interfaces フィールドを使用すると、IP アドレスプールをアドバタイズするネットワークインターフェイスを制限できます。
手順書の例では、MetalLB を設定して、すべてのノードの interfaces パラメーターにリストされているネットワークインターフェイスからのみ IP アドレスプールをアドバタイズする方法を示しています。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
IP アドレスプールを作成します。
ipaddresspool.yamlなどのファイルを作成し、次の例に示すように設定の詳細を入力します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-l2 spec: addresses: - 4.4.4.0/24 autoAssign: false # ...次の例に示すように、IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool.yaml
インターフェイスセレクターを使用して L2 アドバタイズメントを作成し、IP アドレスをアドバタイズします。l2advertisement.yamlなどの YAML ファイルを作成し、次の例に示すように設定の詳細を入力します。apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2advertisement namespace: metallb-system spec: ipAddressPools: - doc-example-l2 interfaces: - interfaceA - interfaceB # ...次の例に示すように、広告の設定を適用してください。
$ oc apply -f l2advertisement.yaml重要インターフェイスセレクターは、MetalLB が L2 を使用して特定の IP をアナウンスするノードを選択する方法には影響しません。ノードが選択されたインターフェイスを持たない場合、選択されたノードはサービスをアナウンスしません。
4.2.9. セカンダリーネットワークを使用した MetalLB の設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform 4.14 以降、デフォルトのネットワーク動作では、ネットワークインターフェイス間での IP パケットの転送は許可されません。したがって、MetalLB がセカンダリーインターフェイス上に設定されている場合は、必要なインターフェイスに対してのみ IP 転送を有効にするマシン設定を追加する必要があります。
4.13 からアップグレードされた OpenShift Container Platform クラスターは、アップグレード中にグローバル IP 転送を有効にするグローバルパラメーターが設定されるため、影響を受けません。
セカンダリーインターフェイスの IP 転送を有効にするには、次の 2 つのオプションがあります。
- 特定のインターフェイスの IP 転送を有効にします。
- すべてのインターフェイスで IP 転送を有効にします。
特定のインターフェイスに対して IP 転送を有効にすると、よりきめ細かい制御が可能になりますが、すべてのインターフェイスに対して有効にすると、グローバル設定が適用されます。
手順
以下のコマンドを実行して、Cluster Network Operator のパラメーター
routingViaHost をtrueに設定し、パッチを適用します。$ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig": {"routingViaHost": true} }}}}' --type=merge特定のセカンダリーインターフェイス (
bridge-netなど) の転送を有効にするには、MachineConfigCR を作成して適用します。ローカルマシンで次のコマンドを実行して、ネットワークカーネルパラメーターを設定するために使用される文字列を Base64 でエンコードします。
$ echo -e "net.ipv4.conf.bridge-net.forwarding = 1" | base64 -w0出力例
bmV0LmlwdjQuY29uZi5icmlkZ2UtbmV0LmZvcndhcmRpbmcgPSAxCg==-
bridge-netという名前のセカンダリーインターフェイスの IP 転送を有効にするために、MachineConfigCR を作成します。 以下の YAML を
enable-ip-forward.yamlファイルに保存します。apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: <node_role> name: 81-enable-global-forwarding spec: config: ignition: version: 3.2.0 storage: files: - contents: source: data:text/plain;charset=utf-8;base64,bmV0LmlwdjQuY29uZi5icmlkZ2UtbmV0LmZvcndhcmRpbmcgPSAxCg== verification: {} filesystem: root mode: 420 path: /etc/sysctl.d/enable-global-forwarding.conf osImageURL: "" # ...ここでは、以下のようになります。
<node_role>-
IP 転送を有効にしたいノードのロール。たとえば、
ワーカー。 contents.source- 生成された Base64 文字列を入力します。
以下のコマンドを実行して設定を適用します。
$ oc apply -f enable-ip-forward.yaml
オプション: 次のコマンドを実行して、IP 転送をグローバルに有効にします。
$ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}' --type=merge
検証
マシン設定を適用した後、以下の手順を実行して変更内容を確認してください。
以下のコマンドを実行して、対象ノードでデバッグセッションに入ります。このコマンドは
、<node-name>-debugという名前のデバッグ Pod をインスタンス化します。$ oc debug node/<node-name>次のコマンドを実行して、デバッグシェル内で
/hostをルートディレクトリーとして設定します。デバッグ Pod は、ホストのルートファイルシステムを Pod 内の/hostにマウントします。ルートディレクトリーを/hostに変更することで、ホストの実行可能パスに含まれるバイナリーを実行できるようになります。$ chroot /host次のコマンドを実行して、IP 転送が有効になっていることを確認します。
$ cat /etc/sysctl.d/enable-global-forwarding.conf出力例
net.ipv4.conf.bridge-net.forwarding = 1この出力は、
bridge-netインターフェイスで IPv4 転送が有効になっていることを示しています。
4.3. MetalLB BGP ピアの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、ボーダーゲートウェイプロトコル (BGP) ピアを追加、変更、および削除できます。MetalLB Operator は、BGP ピアカスタムリソースを使用して、MetalLB speaker Pod が BGP セッションを開始するために接続するピアを識別します。
ピアは、MetalLB がサービスに割り当てるロードバランサー IP アドレスのルートアドバタイズメントを受信します。
4.3.1. BGP ピアカスタムリソースについて リンクのコピーリンクがクリップボードにコピーされました!
ロードバランサーサービスのネットワーク接続を確立し、ルートをアドバタイズするには、MetalLB Border Gateway Protocol (BGP) ピアカスタムリソース (CR) のプロパティーを設定します。これらのパラメーターを設定することで、クラスターが特定のルーティングピアに対して、外部トラフィックをアプリケーションのワークロードに正しくルーティングすることを許可できるようになります。
以下の表は、BGP ピア CR のパラメーターについて説明しています。
| パラメーター | 型 | 説明 |
|---|---|---|
|
|
| BGP ピア CR の名前を指定します。 |
|
|
| BGP ピア CR のネームスペースを指定します。 |
|
|
|
BGP セッションのローカルエンドの AS 番号 (ASN) を指定します。追加するすべての BGP ピア CR において、同じ値を指定してください。範囲は |
|
|
|
BGP セッションのリモートエンドの ASN を指定します。範囲は |
|
|
|
明示的に設定せずに、セッションのリモートエンドに使用する ASN を検出します。同じ ASN を持つピアの場合は |
|
|
|
BGP セッションを確立するために接続するピアの IP アドレスを指定します。このパラメーターを使用する場合、 |
|
|
|
セッションを確立するときに使用するインターフェイス名を指定します。このパラメーターを使用して、番号なし BGP ピアリングを設定します。2 つの BGP ピア間にポイントツーポイントのレイヤー 2 接続を確立する必要があります。番号なし BGP ピアリングは、IPv4、IPv6、またはデュアルスタックで使用できますが、IPv6 RA (ルーターアドバタイズメント) を有効にする必要があります。各インターフェイスは 1 つの BGP 接続に制限されます。このパラメーターを使用する場合、 |
|
|
| オプション: BGP セッションの確立時に使用する IP アドレスを指定します。値は IPv4 アドレスである必要があります。 |
|
|
|
オプション: BGP セッションを確立するために接続するピアのネットワークポートを指定します。範囲は |
|
|
|
オプション: BGP ピアに提案するホールドタイムの期間を指定します。最小値は 3 秒 ( |
|
|
|
オプション: キープアライブメッセージを BGP ピアに送信する間の最大間隔を指定します。このパラメーターを指定する場合は、 |
|
|
| オプション: BGP ピアにアドバタイズするルーター ID を指定します。このパラメーターを指定する場合は、追加するすべての BGP ピアカスタムリソースで同じ値を指定する必要があります。 |
|
|
| オプション: TCP MD5 認証が済んだ BGP セッションを実施するルーターのピアに送信する MD5 パスワードを指定します。 |
|
|
|
オプション:BGP ピアの認証シークレットの名前を指定します。シークレットは |
|
|
| オプション: BFD プロファイルの名前を指定します。 |
|
|
| オプション: 一致式と一致ラベルを使用してセレクターを指定し、BGP ピアに接続できるノードを制御します。 |
|
|
|
オプション: BGP ピアがネットワークホップ数回分を離れるように指定します。BGP ピアが同じネットワークに直接接続されていない場合、このパラメーターが |
|
|
| BGP が近隣に次に接続を試行するまで待機する時間を指定します。 |
passwordSecret パラメーターは password パラメーターとは排他的であり、使用するパスワードを含むシークレットへの参照を含みます。両方のパラメーターを設定すると、解析が失敗します。
4.3.2. BGP ピアの設定 リンクのコピーリンクがクリップボードにコピーされました!
ロードバランサーサービスのルーティング情報を交換し、IP アドレスをアドバタイズするには、MetalLB BGP ピア CR を設定します。これらのピアを確立することで、ネットワークインフラストラクチャーがクラスターアプリケーションのワークロードに到達し、トラフィックを正しくルーティングできるようになります。
BGP ピアカスタムリソースを追加することで、ネットワークルーターとルーティング情報を交換したり、サービスの IP アドレスをアドバタイズしたりできます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - BGP アドバタイズメントを使用して MetalLB を設定します。
手順
以下の例のような内容で、
bgppeer.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta2 kind: BGPPeer metadata: namespace: metallb-system name: doc-example-peer spec: peerAddress: 10.0.0.1 peerASN: 64501 myASN: 64500 routerID: 10.10.10.10 # ...以下のコマンドを入力して、BGP ピア設定を適用します。
$ oc apply -f bgppeer.yaml
4.3.3. 指定されたアドレスプールに対して特定の BGP ピアセットを設定 リンクのコピーリンクがクリップボードにコピーされました!
特定の IP アドレスプールを指定された BGP ピアに割り当てるには、MetalLB BGP アドバタイズメントを設定します。これらのマッピングを確立することで、クラスターは指定されたネットワーク範囲を承認されたルーティングピアにのみ通知し、外部トラフィックを正確に制御できるようになります。
この手順では、以下のタスクについて説明します。
-
アドレスプールのセット (
pool1とpool2)を設定します。 -
BGP ピアのセット (
peer1とpeer2)を設定します。 -
pool1をpeer1に、pool2をpeer2に割り当てるように BGP アドバタイズメントを設定します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
アドレスプール
pool1を作成します。以下の例のような内容で、
ipaddresspool1.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: pool1 spec: addresses: - 4.4.4.100-4.4.4.200 - 2001:100:4::200-2001:100:4::400 # ...IP アドレスプール
pool1の設定を適用します。$ oc apply -f ipaddresspool1.yaml
アドレスプール
pool2を作成します。以下の例のような内容で、
ipaddresspool2.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: pool2 spec: addresses: - 5.5.5.100-5.5.5.200 - 2001:100:5::200-2001:100:5::400 # ...IP アドレスプール
pool2の設定を適用します。$ oc apply -f ipaddresspool2.yaml
BGP
peer1を作成します。以下の例のような内容で、
bgppeer1.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta2 kind: BGPPeer metadata: namespace: metallb-system name: peer1 spec: peerAddress: 10.0.0.1 peerASN: 64501 myASN: 64500 routerID: 10.10.10.10 # ...BGP
ピア 1の設定を適用します。$ oc apply -f bgppeer1.yaml
BGP
peer2を作成します。以下の例のような内容で、
bgppeer2.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta2 kind: BGPPeer metadata: namespace: metallb-system name: peer2 spec: peerAddress: 10.0.0.2 peerASN: 64501 myASN: 64500 routerID: 10.10.10.10 # ...BGP
peer2の設定を適用します。$ oc apply -f bgppeer2.yaml
BGP advertisement 1 を作成します。
以下の例のような内容で、
bgpadvertisement1.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: bgpadvertisement-1 namespace: metallb-system spec: ipAddressPools: - pool1 peers: - peer1 communities: - 65535:65282 aggregationLength: 32 aggregationLengthV6: 128 localPref: 100 # ...設定を適用します。
$ oc apply -f bgpadvertisement1.yaml
BGP advertisement 2 を作成します。
以下の例のような内容で、
bgpadvertisement2.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: bgpadvertisement-2 namespace: metallb-system spec: ipAddressPools: - pool2 peers: - peer2 communities: - 65535:65282 aggregationLength: 32 aggregationLengthV6: 128 localPref: 100 # ...設定を適用します。
$ oc apply -f bgpadvertisement2.yaml
4.3.4. ネットワーク VRF を介したサービスの公開 リンクのコピーリンクがクリップボードにコピーされました!
ネットワークトラフィックを分離し、複数のルーティングテーブルを管理するには、仮想ルーティングおよび転送 (VRF) インスタンスを介してサービスを公開します。VRF を MetalLB BGP ピアに関連付けることで、外部トラフィックがセグメント化され、意図したアプリケーションワークロードに正しくルーティングされることが保証されます。
BGP ピア上の VRF を介したサービスの公開は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
ネットワークインターフェイス上で VRF を使用して BGP ピア経由でサービスを公開すると、サービスへのトラフィックを分離し、独立したルーティング決定を設定し、ネットワークインターフェイス上でマルチテナントのサポートを有効化できます。
ネットワーク VRF に属するインターフェイスを通じて BGP セッションを確立すると、MetalLB はそのインターフェイスを通じてサービスをアドバタイズし、外部トラフィックがこのインターフェイスを通じてサービスに到達させることができます。ただし、ネットワーク VRF ルーティングテーブルは、OVN-Kubernetes で使用されるデフォルトの VRF ルーティングテーブルとは異なります。したがって、トラフィックは OVN-Kubernetes ネットワークインフラストラクチャーに到達できません。
サービスに送信されたトラフィックが OVN-Kubernetes ネットワークインフラストラクチャーに到達できるようにするには、ルーティングルールを設定してネットワークトラフィックのネクストホップを定義する必要があります。詳細は、関連情報 セクションの 「MetalLB を使用した対称ルーティングの管理」の NodeNetworkConfigurationPolicy リソースを参照してください。
以下の大まかな手順は、BGP ピアを持つネットワーク VRF を介してサービスを公開する方法を示しています。
- BGP ピアを定義し、ネットワーク VRF インスタンスを追加します。
- MetalLB の IP アドレスプールを指定します。
- MetalLB が指定された IP アドレスプールと VRF インスタンスに関連付けられた BGP ピアを使用してルートをアドバタイズするように、BGP ルートアドバタイズを設定します。
- サービスをデプロイして設定をテストします。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 -
Virtual Routing and Forwarding (VRF) インスタンスをネットワークインターフェイスに関連付けるために、
NodeNetworkConfigurationPolicy(NNCP) を定義しました。この前提条件を満たす方法の詳細は、関連情報 セクションを参照してください。 - MetalLB をクラスターにインストールした。
手順
BGPPeerカスタムリソース (CR) を作成します。次の例のような内容を含むファイル
(frrviavrf.yamlなど) を作成します。apiVersion: metallb.io/v1beta2 kind: BGPPeer metadata: name: frrviavrf namespace: metallb-system spec: myASN: 100 peerASN: 200 peerAddress: 192.168.130.1 vrf: ens4vrf # ...spec.vrf:BGP ピアに関連付けるネットワーク VRF インスタンスを指定します。MetalLB は、サービスをアドバタイズし、VRF 内のルーティング情報に基づいてルーティングを決定できます。注記このネットワーク VRF インスタンスは
NodeNetworkConfigurationPolicyCR で設定する必要があります。詳細は、関連情報 を参照してください。次のコマンドを実行して、BGP ピアの設定を適用します。
$ oc apply -f frrviavrf.yaml
IPAddressPoolCR を作成します。次の例のような内容を含むファイル (
first-pool.yamlなど) を作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - 192.169.10.0/32 # ...次のコマンドを実行して、IP アドレスプールの設定を適用します。
$ oc apply -f first-pool.yaml
BGPAdvertisementCR を作成します。次の例のような内容を含むファイル (
first-adv.yamlなど) を作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: first-adv namespace: metallb-system spec: ipAddressPools: - first-pool peers: - frrviavrf # ...peers.frrviavrf: この例では、MetalLB はfirst-poolIP アドレスプールから、frrviavrfBGP ピアに IP アドレスの範囲をアドバタイズします。次のコマンドを実行して、BGP アドバタイズメントの設定を適用します。
$ oc apply -f first-adv.yaml
Namespace、Deployment、およびServiceCR を作成します。次の例のような内容を含むファイル (
deploy-service.yamlなど) を作成します。apiVersion: v1 kind: Namespace metadata: name: test --- apiVersion: apps/v1 kind: Deployment metadata: name: server namespace: test spec: selector: matchLabels: app: server template: metadata: labels: app: server spec: containers: - name: server image: nginx ports: - name: http containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: server1 namespace: test spec: ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: server type: LoadBalancer # ...次のコマンドを実行して、namespace、デプロイメント、およびサービスの設定を適用します。
$ oc apply -f deploy-service.yaml
検証
次のコマンドを実行して、MetalLB スピーカー Pod を識別します。
$ oc get -n metallb-system pods -l component=speaker出力例
NAME READY STATUS RESTARTS AGE speaker-c6c5f 6/6 Running 0 69m次のコマンドを実行して、BGP セッションの状態がスピーカー Pod で
Establishedとなっていることを確認します。設定に一致するように変数を置き換えます。$ oc exec -n metallb-system <speaker_pod> -c frr -- vtysh -c "show bgp vrf <vrf_name> neigh"出力例
BGP neighbor is 192.168.30.1, remote AS 200, local AS 100, external link BGP version 4, remote router ID 192.168.30.1, local router ID 192.168.30.71 BGP state = Established, up for 04:20:09 ...次のコマンドを実行して、サービスが正しくアドバタイズされていることを確認します。
$ oc exec -n metallb-system <speaker_pod> -c frr -- vtysh -c "show bgp vrf <vrf_name> ipv4"
4.3.6. BGP ピア設定の例 リンクのコピーリンクがクリップボードにコピーされました!
ネットワークトポロジーを正確に管理し、ルーティングの耐障害性を向上させるには、ノードの接続性を制限し、BFD プロファイルを組み込んだ MetalLB BGP ピア設定を設定します。これらのパラメーターを定義することで、クラスターが安全なピア関係を維持し、パス障害を迅速に検出して高いサービス可用性を確保できます。
- BGP ピアに接続するノードを制限する例
-
nodeSelectorsパラメーターを指定することで、どのノードが BGP ピアに接続できるかを制御できます。
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
name: doc-example-nodesel
namespace: metallb-system
spec:
peerAddress: 10.0.20.1
peerASN: 64501
myASN: 64500
nodeSelectors:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values: [compute-1.example.com, compute-2.example.com]
# ...
- BGP ピアの BFD プロファイルを指定する例
- BGP ピアに関連付ける BFD プロファイルを指定できます。BFD は BGP を補完する技術であり、BGP 単独よりもピア間の通信障害をより迅速に検出できる。
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
name: doc-example-peer-bfd
namespace: metallb-system
spec:
peerAddress: 10.0.20.1
peerASN: 64501
myASN: 64500
holdTime: "10s"
bfdProfile: doc-example-bfd-profile-full
# ...
双方向転送検出 (BFD) プロファイルを削除し、ボーダーゲートウェイプロトコル (BGP) ピアリソースに追加された bfdProfile を削除しても、BFD は無効になりません。代わりに、BGP ピアはデフォルトの BFD プロファイルの使用を開始します。BGP ピアリソースから BFD をディセーブルにするには、BGP ピア設定を削除し、BFD プロファイルなしで再作成します。詳細は、BZ#2050824 を参照してください。
- デュアルスタックネットワークにおける BGP ピアの指定例
- デュアルスタックネットワーキングをサポートするには、IPv4 用に BGP ピアカスタムリソース 1 つと IPv6 用に BGP ピアカスタムリソースを 1 つ追加します。
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
name: doc-example-dual-stack-ipv4
namespace: metallb-system
spec:
peerAddress: 10.0.20.1
peerASN: 64500
myASN: 64500
---
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
name: doc-example-dual-stack-ipv6
namespace: metallb-system
spec:
peerAddress: 2620:52:0:88::104
peerASN: 64500
myASN: 64500
# ...
- 番号なし BGP ピアリングにおける BGP ピアの指定例
-
番号なし BGP ピアリングを設定するには、以下の設定例を使用して、
spec.interfaceパラメーターでインターフェイスを指定します。
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
name: peer-unnumber
namespace: metallb-system
spec:
myASN: 64512
ASN: 645000
interface: net0
# ...
インターフェイス パラメーターを使用するには、2 つの BGP ピア間でポイントツーポイントのレイヤ 2 接続を確立する必要があります。番号なし BGP ピアリングは、IPv4、IPv6、またはデュアルスタックで使用できますが、IPv6 ルーターアドバタイズメント (RA) を有効にする必要があります。各インターフェイスは 1 つの BGP 接続に制限されます。
このパラメーターを使用する場合、spec.bgp.routers.neighbors.address パラメーターに値を指定することはできません。
4.4. コミュニティーエイリアスの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、コミュニティーエイリアスを設定して、さまざまなアドバタイズメントで使用できます。
4.4.1. コミュニティーカスタムリソースについて リンクのコピーリンクがクリップボードにコピーされました!
BGP の設定を簡素化するために、コミュニティーカスタムリソースを使用して、コミュニティー値に名前付きエイリアスを定義します。BGPAdvertisement リソースを使用して ipAddressPools を アドバタイズする際に、これらのエイリアスを参照できます。
次の表で、community カスタムリソースのフィールドを説明します。
community CRD は BGPAdvertisement にのみ適用されます。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
BGPAdvertisements で使用できる BGP コミュニティーエイリアスのリストを指定します。コミュニティーエイリアスは、名前 (エイリアス) と値 (番号 : 番号) のペアで構成されます。 |
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
|
|
|
|
指定された名前に対応する BGP |
4.4.2. BGP アドバタイズメントとコミュニティーエイリアスを使用した MetalLB の設定 リンクのコピーリンクがクリップボードにコピーされました!
BGP プロトコルを使用して IP アドレスプールを アドバタイズするには、MetalLB にコミュニティーエイリアスを設定します。この設定では、エイリアスを NO_ADVERTISE コミュニティーの数値に設定します。
次の例では、ピア BGP ルーター doc-example-peer-community は、MetalLB がサービスに割り当てるロードバランサー IP アドレスごとに 1 つの 203.0.113.200/32 ルートと 1 つの fc00:f853:ccd:e799::1/128 ルートを受信します。コミュニティーエイリアスは、NO_ADVERTISE コミュニティーで設定されます。
前提条件
-
OpenShift CLI (
oc) をインストールします。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
IP アドレスプールを作成します。
以下の例のような内容で、
ipaddresspool.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-bgp-community spec: addresses: - 203.0.113.200/30 - fc00:f853:ccd:e799::/124IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool.yaml
community1という名前のコミュニティーエイリアスを作成します。apiVersion: metallb.io/v1beta1 kind: Community metadata: name: community1 namespace: metallb-system spec: communities: - name: NO_ADVERTISE value: '65535:65282'doc-example-bgp-peerという名前の BGP ピアを作成します。以下の例のような内容で、
bgppeer.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta2 kind: BGPPeer metadata: namespace: metallb-system name: doc-example-bgp-peer spec: peerAddress: 10.0.0.1 peerASN: 64501 myASN: 64500 routerID: 10.10.10.10BGP ピアの設定を適用します。
$ oc apply -f bgppeer.yaml
コミュニティーエイリアスを使用して BGP アドバタイズメントを作成します。
以下の例のような内容で、
bgpadvertisement.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: bgp-community-sample namespace: metallb-system spec: aggregationLength: 32 aggregationLengthV6: 128 communities: - NO_ADVERTISE1 ipAddressPools: - doc-example-bgp-community peers: - doc-example-peerここでは、以下のようになります。
NO_ADVERTISE: ここでは、コミュニティーカスタムリソース (CR) 名ではなく、CommunityAlias.nameを指定します。設定を適用します。
$ oc apply -f bgpadvertisement.yaml
4.5. MetalLB BFD プロファイルの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、双方向フォワーディング検出 (BFD) プロファイルを追加、変更、および削除できます。MetalLB Operator は、BFD プロファイルのカスタムリソースを使用して、BFD を使用する BGP セッションで、BGP だけの時よりも障害検出のパスを素早く見つけ出すセッションを特定します。
4.5.1. BFD プロファイルカスタムリソースについて リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者として、BFD プロファイル CR でパラメーターを指定できます。MetalLB Operator は、BFD プロファイルのカスタムリソースを使用して、BFD を使用する BGP セッションで、BGP だけの時よりも障害検出のパスを素早く見つけ出すセッションを特定します。
以下の表は、BFD プロファイル CR のパラメーターについて説明しています。
| パラメーター | 型 | 説明 |
|---|---|---|
|
|
| BFD プロファイルカスタムリソースの名前を指定します。 |
|
|
| BFD プロファイルカスタムリソースの namespace を指定します。 |
|
|
| パケット損失を決定するための検出乗数を指定します。リモート送信間隔にこの値を乗算して、接続損失検出タイマーを決定します。
たとえば、ローカルシステムの検出乗数が |
|
|
|
エコー送信モードを指定します。分散 BFD を使用していないと、エコー送信モードは、ピアが FRR でもある場合にのみ機能します。デフォルト値は
エコー送信モードが有効になっている場合は、制御パケットの送信間隔を増やして、帯域幅の使用量を減らすことを検討してください。たとえば、送信間隔を |
|
|
|
このシステムがエコーパケットの送受信に使用する最小送信間隔 (ジッターの軽減) を指定します。範囲は |
|
|
| 着信制御パケットに最小限必要な TTL を指定します。このフィールドは、マルチホップセッションにのみ適用されます。
最小 TTL を設定する目的は、パケット検証要件をより厳しくし、他のセッションからの制御パケットの受信を回避することです。デフォルト値は |
|
|
| セッションをアクティブまたはパッシブとしてマークするかどうかを指定します。パッシブセッションは接続の開始を試行しません。代わりに、パッシブセッションは、応答の開始前にピアからの制御パケットを待機します。
セッションをパッシブとしてマークすることは、スターネットワークの中央ノードとして機能するルーターがあり、システムが送信する必要のない制御パケットの送信を避ける場合に役立ちます。デフォルト値は |
|
|
|
このシステムが制御パケットを受信できる最小間隔を指定します。範囲は |
|
|
|
このシステムが制御パケットの送信に使用する最小送信間隔 (ジッターの軽減) を指定します。範囲は |
4.5.2. BFD プロファイルの設定 リンクのコピーリンクがクリップボードにコピーされました!
BGP セッションのパス障害検出を高速化するには、MetalLB BFD プロファイルを設定し、それを BGP ピアに関連付けます。これらのプロファイルを確立することで、標準プロトコルよりも迅速に接続の問題を特定し、ネットワークルーティングの高い可用性と応答性を確保できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
次の例のようなコンテンツを含む
bfdprofile.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: BFDProfile metadata: name: doc-example-bfd-profile-full namespace: metallb-system spec: receiveInterval: 300 transmitInterval: 300 detectMultiplier: 3 echoMode: false passiveMode: true minimumTtl: 254 # ...BFD プロファイルの設定を適用します。
$ oc apply -f bfdprofile.yaml
4.6. MetalLB を使用するためのサービスの設定 リンクのコピーリンクがクリップボードにコピーされました!
予測可能なネットワークエンドポイントを確保するため、MetalLB が ロードバランサー タイプのサービスに IP アドレスを割り当てる方法を制御します。特定の IP アドレスまたは IP アドレスプールを要求することで、アプリケーションが特定のネットワークアドレス計画に合致した有効な IP アドレス割り当てを受けられることが保証されます。
4.6.1. 特定の IP アドレスの要求 リンクのコピーリンクがクリップボードにコピーされました!
サービスに特定の静的 IP アドレスを割り当てるには、サービス仕様の spec.loadBalancerIP パラメーターを設定します。
MetalLB は、設定済みのアドレスプールから要求されたアドレスを割り当てようと試み、指定された静的なネットワークエンドポイントでサービスにアクセスできるようにします。要求された IP アドレスが範囲外の場合、MetalLB は警告を報告します。
特定の IP アドレスのサービス YAML の例
apiVersion: v1
kind: Service
metadata:
name: <service_name>
annotations:
metallb.io/address-pool: <address_pool_name>
spec:
selector:
<label_key>: <label_value>
ports:
- port: 8080
targetPort: 8080
protocol: TCP
type: LoadBalancer
loadBalancerIP: <ip_address>
MetalLB が要求された IP アドレスを割り当てられない場合、サービスの EXTERNAL-IP には <pending> と表示され、実行中の oc describe service <service_name> には次の例のようなイベントが含まれます。
MetalLB が要求された IP アドレスを割り当てることができない場合のイベントの例
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning AllocationFailed 3m16s metallb-controller Failed to allocate IP for "default/invalid-request": "4.3.2.1" is not allowed in config
4.6.2. 特定のプールからの IP アドレスの要求 リンクのコピーリンクがクリップボードにコピーされました!
予測可能なネットワークエンドポイントを確保するため、MetalLB が ロードバランサー タイプのサービスに IP アドレスを割り当てる方法を制御します。特定の IP アドレスまたは IP アドレスプールを要求することで、アプリケーションが特定のネットワークアドレス計画に合致した有効な IP アドレス割り当てを受けられることが保証されます。
特定プールからの IP アドレスのサービス YAML の例
apiVersion: v1
kind: Service
metadata:
name: <service_name>
annotations:
metallb.io/address-pool: <address_pool_name>
spec:
selector:
<label_key>: <label_value>
ports:
- port: 8080
targetPort: 8080
protocol: TCP
type: LoadBalancer
<address_pool_name> に指定するアドレスプールが存在しない場合、MetalLB は、自動割り当てを許可する任意のプールから IP アドレスを割り当てようとします。
4.6.3. 任意の IP アドレスを許可します。 リンクのコピーリンクがクリップボードにコピーされました!
手動で指定することなくサービスに IP アドレスを自動的に割り当てるには、MetalLB のアドレスプールを設定して自動割り当てを許可します。MetalLB はこれらのプールから利用可能なアドレスを動的に割り当てることで、シームレスなサービスデプロイメントとネットワーク接続を保証します。
任意の IP アドレスを受け入れるサービス YAML の例
apiVersion: v1
kind: Service
metadata:
name: <service_name>
spec:
selector:
<label_key>: <label_value>
ports:
- port: 8080
targetPort: 8080
protocol: TCP
type: LoadBalancer
4.6.5. MetalLB を使用したサービスの設定 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションを外部ネットワークトラフィックに公開するには、ロードバランシングサービスを設定します。MetalLB は、設定済みの IP アドレスプールから外部 IP アドレスを割り当て、クラスター外部からアプリケーションにアクセスできるようにします。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - MetalLB Operator をインストールして、MetalLB を起動します。
- 1 つ以上のアドレスプールを設定します。
- トラフィックをクライアントからクラスターのホストネットワークにルーティングするようにネットワークを設定します。
手順
<service_name>.yamlファイルを作成します。ファイル内で、spec.typeパラメーターをLoadBalancerに設定します。MetalLB がサービスに割り当てる外部 IP アドレスを要求する方法は、例を参照してください。
サービスを作成します。
$ oc apply -f <service_name>.yaml出力例
service/<service_name> created
検証
サービスを記述します。
$ oc describe service <service_name>出力例
Name: <service_name> Namespace: default Labels: <none> Annotations: metallb.io/address-pool: doc-example Selector: app=service_name Type: LoadBalancer IP Family Policy: SingleStack IP Families: IPv4 IP: 10.105.237.254 IPs: 10.105.237.254 LoadBalancer Ingress: 192.168.100.5 Port: <unset> 80/TCP TargetPort: 8080/TCP NodePort: <unset> 30550/TCP Endpoints: 10.244.0.50:8080 Session Affinity: None External Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal nodeAssigned 32m (x2 over 32m) metallb-speaker announcing from node "<node_name>"ここでは、以下のようになります。
アノテーション- 特定のプールから IP アドレスを要求する場合に表示されるアノテーションを指定します。
型-
LoadBalancerを示す必要があるサービスタイプを指定します。 ロードバランサーイングレス- サービスが正しく割り当てられている場合、外部 IP アドレスを指定します。
Events- 外部 IP アドレスを通知するために割り当てられたノード名を示すイベントパラメーターを指定します。エラーが発生した場合、events パラメーターにはエラーの原因が示されます。
4.7. MetalLB を使用した対称ルーティングの管理 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、MetalLB、NMState、OVN-Kubernetes の機能を実装することで、複数のホストインターフェイスを備えた MetalLB ロードバランサーサービスの背後にある Pod のトラフィックを効果的に管理できます。このコンテキストでこれらの機能を組み合わせることで、対称ルーティング、トラフィック分離を提供し、重複する CIDR アドレスを持つ異なるネットワーク上のクライアントをサポートできます。
この機能を実現するために、MetalLB を使用して Virtual Routing and Forwarding (VRF) インスタンスを実装し、Egress サービスを設定する方法を説明します。
MetalLB と出力サービスを備えた VRF インスタンスを使用した対称トラフィックの設定は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
4.7.1. MetalLB を使用した対称ルーティング管理の課題 リンクのコピーリンクがクリップボードにコピーされました!
複数のホストインターフェイスにおけるネットワーク分離と非対称ルーティングの課題を解決するために、MetalLB、NMState、および OVN-Kubernetes を組み合わせた設定を実装します。このソリューションは、対称ルーティングを保証し、手動による静的ルート管理を必要とせずに、CIDR アドレスの重複を防ぎます。
戻りトラフィックが正しいクライアントに確実に到達するための 1 つのオプションとして、静的ルートを使用します。ただし、このソリューションでは、MetalLB がサービスを分離して、別のインターフェイスを通じて各サービスを通知できません。さらに、静的ルーティングには手動設定が必要であり、リモートサイトが追加された場合はメンテナンスが必要になります。
外部システムで、アプリケーションの送信元と宛先の IP アドレスが同じである必要があるシナリオなどが、MetalLB サービスの実装時における対称ルーティングのさらなる課題として挙げられます。OpenShift Container Platform のデフォルトの動作では、ホストネットワークインターフェイスの IP アドレスが、Pod から発信されるトラフィックの送信元 IP アドレスとして割り当てられます。これは、複数のホストインターフェイスがある場合に問題になります。
MetalLB、NMState、OVN-Kubernetes の機能を組み合わせた設定を実装することで、これらの課題を克服できます。
4.7.2. MetalLB で VRF を使用した対称ルーティング管理の概要 リンクのコピーリンクがクリップボードにコピーされました!
NMState を使用してホスト上で VRF インスタンスを設定し、VRF インスタンスを MetalLB BGPPeer リソースに関連付け、OVN-Kubernetes を使用して出力トラフィック用の出力サービスを設定することで、対称ルーティングの実装の課題を克服できます。
図4.1 MetalLB で VRF を使用して対称ルーティングを管理するネットワークの概要
設定プロセスには 3 つの段階が含まれます。
- 1:VRF とルーティングルールを定義する
-
NodeNetworkConfigurationPolicyカスタムリソース (CR) を設定して、VRF インスタンスをネットワークインターフェイスに関連付けます。 - VRF ルーティングテーブルを使用して、受信トラフィックと送信トラフィックを送信します。
-
- 2:VRF を MetalLB
BGPPeerにリンクする -
ネットワークインターフェイス上で VRF インスタンスを使用するように MetalLB
BGPPeerリソースを設定します。 -
BGPPeerリソースを VRF インスタンスに関連付けることにより、指定されたネットワークインターフェイスが BGP セッションのプライマリーインターフェイスになり、MetalLB はこのインターフェイスを通じてサービスをアドバタイズします。
-
ネットワークインターフェイス上で VRF インスタンスを使用するように MetalLB
- 3:Egress サービスの設定
- Egress サービスを設定して、Egress トラフィック用の VRF インスタンスに関連付けられたネットワークを選択します。
- オプション: MetalLB ロードバランサーサービスの IP アドレスを Egress トラフィックの送信元 IP として使用するように Egress サービスを設定します。
4.7.3. MetalLB で VRF を使用した対称ルーティングの設定 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB サービスの背後にあるアプリケーションが、Ingress と Egress の両方で同じネットワークパスを使用するようにするには、Virtual Routing and Forwarding (VRF) を使用して対称ルーティングを設定します。
この手順の例では、VRF ルーティングテーブルを MetalLB および Egress サービスに関連付けることで、ロードバランサー サービスの背後にある Pod の Ingress トラフィックと出力トラフィックに対して対称ルーティングを有効にします。
-
EgressServiceCR でsourceIPBy: "LoadBalancerIP"設定を使用する場合は、BGPAdvertisementカスタムリソース (CR) でロードバランサーノードを指定する必要があります。 -
sourceIPBy: "Network"設定は、gatewayConfig.routingViaHost仕様がtrueに設定された OVN-Kubernetes を使用するクラスターでのみ使用できます。さらに、sourceIPBy: "Network"設定を使用する場合は、ネットワーク VRF インスタンスで設定されたノード上でアプリケーションワークロードをスケジュールする必要があります。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - Kubernetes NMState Operator をインストールします。
- MetalLB Operator がインストールされている。
手順
NodeNetworkConfigurationPolicyCR を作成して VRF インスタンスを定義します。次の例のような内容を含むファイル (
node-network-vrf.yamlなど) を作成します。apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: vrfpolicy spec: nodeSelector: vrf: "true" maxUnavailable: 3 desiredState: interfaces: - name: ens4vrf type: vrf state: up vrf: port: - ens4 route-table-id: 2 - name: ens4 type: ethernet state: up ipv4: address: - ip: 192.168.130.130 prefix-length: 24 dhcp: false enabled: true routes: config: - destination: 0.0.0.0/0 metric: 150 next-hop-address: 192.168.130.1 next-hop-interface: ens4 table-id: 2 route-rules: config: - ip-to: 172.30.0.0/16 priority: 998 route-table: 254 - ip-to: 10.132.0.0/14 priority: 998 route-table: 254 - ip-to: 169.254.0.0/17 priority: 998 route-table: 254 # ...ここでは、以下のようになります。
metadata.name- ポリシーの名前を指定します。
nodeSelector.vrf-
ラベル
vrf:trueを持つすべてのノードに対するポリシーを指定します。 インターフェイス名 ens4vrf- インターフェイスの名前を指定します。
interfaces.type- インターフェイスの種類を指定します。この例では VRF インスタンスを作成します。
vrf.port- VRF が接続するノードインターフェイスを指定します。
vrf.route-table-id- VRF のルーティングテーブル ID の名前を指定します。
- `interfaces.name.ens4`
- VRF に関連付けられたインターフェイスの IPv4 アドレスを指定します。
routes-
ネットワーク経路の設定を指定します。
next-hop-addressフィールドは、ルートのネクストホップの IP アドレスを定義します。next-hop-interfaceフィールドは、ルートの送信インターフェイスを定義します。この例では、VRF ルーティングテーブルは2で、EgressServiceCR で定義した ID を参照します。 ルーティングルール-
追加のルーティングルールを指定します。
ip-toフィールドは、Cluster Networkの CIDR、Service Networkの CIDR、およびInternal Masqueradeサブネットの CIDR と一致する必要があります。oc describe network.operator/clusterコマンドを実行すると、これらの CIDR アドレス仕様の値を表示できます。 ルートルール.ルートテーブル-
Linux カーネルが経路を計算する際に使用するメインルーティングテーブルを指定します。ID は
254です。
以下のコマンドを実行してポリシーを適用します。
$ oc apply -f node-network-vrf.yaml
BGPPeerカスタムリソース (CR) を作成します。次の例のような内容を含むファイル (
frr-via-vrf.yamlなど) を作成します。apiVersion: metallb.io/v1beta2 kind: BGPPeer metadata: name: frrviavrf namespace: metallb-system spec: myASN: 100 peerASN: 200 peerAddress: 192.168.130.1 vrf: ens4vrf # ...ここでは、以下のようになります。
仕様.vrf- BGP ピアに関連付ける VRF インスタンスを指定します。MetalLB は、サービスをアドバタイズし、VRF 内のルーティング情報に基づいてルーティングを決定できます。
次のコマンドを実行して、BGP ピアの設定を適用します。
$ oc apply -f frr-via-vrf.yaml
IPAddressPoolCR を作成します。次の例のような内容を含むファイル (
first-pool.yamlなど) を作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - 192.169.10.0/32 # ...次のコマンドを実行して、IP アドレスプールの設定を適用します。
$ oc apply -f first-pool.yaml
BGPAdvertisementCR を作成します。次の例のような内容を含むファイル (
first-adv.yamlなど) を作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: first-adv namespace: metallb-system spec: ipAddressPools: - first-pool peers: - frrviavrf nodeSelectors: - matchLabels: egress-service.k8s.ovn.org/test-server1: "" # ...ここでは、以下のようになります。
peers-
この例では、MetalLB は、
first-poolの IP アドレスプールからfrrviavrfBGP ピアに IP アドレスの範囲をアドバタイズします。 ノードセレクター-
この例では、
EgressServiceCR は、ロードバランサーサービス IP アドレスを使用するように、Egress トラフィックの送信元 IP アドレスを設定します。したがって、Pod から発信されるトラフィックに同じリターンパスを使用するには、リターントラフィックのロードバランサーノードを指定する必要があります。
次のコマンドを実行して、BGP アドバタイズメントの設定を適用します。
$ oc apply -f first-adv.yaml
EgressServiceCR を作成します。次の例のような内容を含むファイル (
egress-service.yamlなど) を作成します。apiVersion: k8s.ovn.org/v1 kind: EgressService metadata: name: server1 namespace: test spec: sourceIPBy: "LoadBalancerIP" nodeSelector: matchLabels: vrf: "true" network: "2" # ...ここでは、以下のようになります。
metadata.name-
Egress サービスの名前を指定します。
EgressServiceリソースの名前は、変更するロードバランサーサービスの名前と一致する必要があります。 metadata.namespace-
Egress サービスの名前空間を指定します。
EgressServiceの namespace は、変更するロードバランサーサービスの namespace と一致する必要があります。Egress サービスは namespace スコープです。 spec.sourceIPBy-
LoadBalancerサービスの IngressIP アドレスを、送信トラフィックの送信元 IP アドレスとして指定します。 マッチラベル.vrf-
sourceIPBy仕様のLoadBalancerを指定すると、単一ノードがLoadBalancerサービストラフィックを処理します。この例では、ラベルがvrf: "true"のノードのみがサービストラフィックを処理できます。ノードを指定しない場合、OVN-Kubernetes はサービストラフィックを処理するワーカーノードを選択します。ノードが選択されると、OVN-Kubernetes はそのノードにegress-service.k8s.ovn.org/<svc_namespace>-<svc_name>: ""という形式でラベルを付けます。 network-
送信トラフィックのルーティングテーブル ID を指定します。必ず
NodeNetworkConfigurationPolicyリソースで定義されているroute-table-idID (例:route-table-id: 2) と一致する値を指定してください。
次のコマンドを実行して、Egress サービスの設定を適用します。
$ oc apply -f egress-service.yaml
検証
次のコマンドを実行して、MetalLB サービスの背後で実行されている Pod のアプリケーションエンドポイントにアクセスできることを確認します。
$ curl <external_ip_address>:<port_number>-
<external_ip_address>:<port_number>: アプリケーションのエンドポイントに合わせて、外部 IP アドレスとポート番号を指定します。
-
-
オプション:
LoadBalancerサービスの Ingress IP アドレスを Egress トラフィックの送信元 IP アドレスとして割り当てた場合は、tcpdumpなどのツールを使用して外部クライアントで受信したパケットを分析し、この設定を確認します。
4.8. MetalLB と FRR-K8s の統合の設定 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB がネイティブに提供していない高度なルーティングサービスにアクセスするには、FRRConfiguration カスタムリソース (CR) を設定します。CR を定義することで、特定の FRRouting (FRR) 機能が公開され、クラスターのルーティング機能が標準的な MetalLB アドバタイズメントを超えて拡張されます。
FRRouting (FRR) は、Linux および UNIX プラットフォーム向けの、無料のオープンソースインターネットルーティングプロトコルスイートです。FRR-K8s は Kubernetes ベースの DaemonSet であり、FRR API の一部を Kubernetes に準拠した形で公開します。MetalLB は、適用された MetalLB 設定に対応する FRR-K8s 設定を生成します。
仮想ルート転送 (VRF) を設定する際は、VRF のテーブル ID を 1000 未満に変更する必要があります。1000 より大きい 値 は OpenShift Container Platform 用に予約されているためです。
4.8.1. FRR の設定 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB で FRR サービスを使用するために、複数の FRRConfiguration CR を作成できます。
MetalLB は FRRConfiguration オブジェクトを生成し、FRR-K8s はそのオブジェクトをすべてのユーザーが作成した他のすべての設定とマージします。たとえば、特定の近隣によりアドバタイズされた接頭辞すべてを受信するように FRR-K8s を設定できます。次の例では、ホスト 172.18.0.5 の BGPPeer によってアドバタイズされるすべての接頭辞を受信するように FRR-K8 を設定します。
FRRConfiguration CR の例
apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
name: test
namespace: metallb-system
spec:
bgp:
routers:
- asn: 64512
neighbors:
- address: 172.18.0.5
asn: 64512
toReceive:
allowed:
mode: all
# ...
また、FRR-K8s を設定して、適用される設定に関係なく、常に接頭辞のセットをブロックすることもできます。これは、クラスターの誤動作を引き起こす可能性のある、Pod や クラスター IP の CIDR への経路を回避するのに役立ちます。次の例では、接頭辞セット 192.168.1.0/24 をブロックします。
MetalLB CR の例
apiVersion: metallb.io/v1beta1
kind: MetalLB
metadata:
name: metallb
namespace: metallb-system
spec:
bgpBackend: frr-k8s
frrk8sConfig:
alwaysBlock:
- 192.168.1.0/24
# ...
FRR-K8s では、clusterNetwork CIDR と serviceNetwork CIDR をブロックするように設定できます。次のコマンドを実行すると、これらの CIDR アドレス仕様の値を表示できます。
$ oc describe network.config/cluster
4.8.2. FRRConfiguration CRD の設定 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB の標準機能を超えてルーティング動作をカスタマイズするには、FRRConfiguration カスタムリソース (CR) を設定します。
以下の参考例は、受信ルートなどの高度なサービスを有効にするために、特定の FRRouting (FRR) パラメーターを定義する方法を示しています。
ルーターパラメーター-
routersパラメーターを使用すると、Virtual Routing and Forwarding (VRF) リソースごとに 1 つのルーターを設定して、複数のルーターを設定することができます。各ルーターに AS 番号 (ASN) を定義する必要があります。
次の例のように、接続する Border Gateway Protocol (BGP) の近隣のリストを定義することもできます。
FRRConfiguration CR の例
apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
name: test
namespace: frr-k8s-system
spec:
bgp:
routers:
- asn: 64512
neighbors:
- address: 172.30.0.3
asn: 4200000000
ebgpMultiHop: true
port: 180
- address: 172.18.0.6
asn: 4200000000
port: 179
# ...
toAdvertiseパラメーター-
デフォルトでは、
FRR-K8sはルーター設定の一部として設定された接頭辞をアドバタイズしません。プレフィックスを通知するには、toAdvertiseパラメーターを使用します。
次の例のように、接頭辞のサブセットをアドバタイズできます。
FRRConfiguration CR の例
apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
name: test
namespace: frr-k8s-system
spec:
bgp:
routers:
- asn: 64512
neighbors:
- address: 172.30.0.3
asn: 4200000000
ebgpMultiHop: true
port: 180
toAdvertise:
allowed:
prefixes:
- 192.168.2.0/24
prefixes:
- 192.168.2.0/24
- 192.169.2.0/24
# ...
-
allowed.prefixes: プレフィックスのサブセットを通知します。
次の例は、すべての接頭辞をアドバタイズする方法を示しています。
FRRConfiguration CR の例
apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
name: test
namespace: frr-k8s-system
spec:
bgp:
routers:
- asn: 64512
neighbors:
- address: 172.30.0.3
asn: 4200000000
ebgpMultiHop: true
port: 180
toAdvertise:
allowed:
mode: all
prefixes:
- 192.168.2.0/24
- 192.169.2.0/24
# ...
allowed.mode: すべてのプレフィックスを通知します。toReceiveパラメーター-
デフォルトでは、
FRR-K8sは近隣によってアドバタイズされた接頭辞を処理しません。このようなアドレスを処理するには、toReceiveパラメーターを使用できます。
次の例のように、接頭辞のサブセットを設定できます。
FRRConfiguration CR の例
apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
name: test
namespace: frr-k8s-system
spec:
bgp:
routers:
- asn: 64512
neighbors:
- address: 172.18.0.5
asn: 64512
port: 179
toReceive:
allowed:
prefixes:
- prefix: 192.168.1.0/24
- prefix: 192.169.2.0/24
ge: 25
le: 28
# ...
-
接頭辞: 接頭辞の長さがle接頭辞の長さ以下で、ge接頭辞の長さ以上の場合、接頭辞が適用されます。
次の例では、アナウンスされたすべての接頭辞を処理するように FRR を設定します。
FRRConfiguration CR の例
apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
name: test
namespace: frr-k8s-system
spec:
bgp:
routers:
- asn: 64512
neighbors:
- address: 172.18.0.5
asn: 64512
port: 179
toReceive:
allowed:
mode: all
# ...
bgpパラメーター-
bgpパラメーターを使用すると、さまざまなBFDプロファイルを定義し、それらをネイバーに関連付けることができます。次の例では、BFDは、BGPセッションをバックアップし、FRRはリンク障害を検出できます。
FRRConfiguration CR の例
apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
name: test
namespace: frr-k8s-system
spec:
bgp:
routers:
- asn: 64512
neighbors:
- address: 172.30.0.3
asn: 64512
port: 180
bfdProfile: defaultprofile
bfdProfiles:
- name: defaultprofile
# ...
nodeSelectorパラメーター-
デフォルトでは、
FRR-K8sは、デーモンが実行されているすべてのノードに設定を適用します。nodeSelectorパラメーターを使用すると、設定を適用するノードを指定できます。以下に例を示します。
FRRConfiguration CR の例
apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
name: test
namespace: frr-k8s-system
spec:
bgp:
routers:
- asn: 64512
nodeSelector:
labelSelector:
foo: "bar"
# ...
インターフェイスパラメーター-
インターフェイスパラメーターを使用すると、以下の設定例のように、番号なし BGP ピアリングを設定できます。
FRRConfiguration CR の例
apiVersion: frrk8s.metallb.io/v1beta1
kind: FRRConfiguration
metadata:
name: test
namespace: frr-k8s-system
spec:
bgp:
bfdProfiles:
- echoMode: false
name: simple
passiveMode: false
routers:
- asn: 64512
neighbors:
- asn: 64512
bfdProfile: simple
disableMP: false
interface: net10
port: 179
toAdvertise:
allowed:
mode: filtered
prefixes:
- 5.5.5.5/32
toReceive:
allowed:
mode: filtered
prefixes:
- 5.5.5.5/32
# ...
-
neighbors.interface: 番号なしの BGP ピアリングを有効にします。
インターフェイス パラメーターを使用するには、2 つの BGP ピア間でポイントツーポイントのレイヤ 2 接続を確立する必要があります。番号なし BGP ピアリングは、IPv4、IPv6、またはデュアルスタックで使用できますが、IPv6 RA (ルーターアドバタイズメント) を有効にする必要があります。各インターフェイスは 1 つの BGP 接続に制限されます。
このパラメーターを使用する場合、spec.bgp.routers.neighbors.address パラメーターに値を指定することはできません。
FRRConfiguration カスタムリソースのパラメーターは、次の表に記載されています。
| パラメーター | 型 | 説明 |
|---|---|---|
|
|
| FRR が設定するルーターを指定します (VRF ごとに 1 つ)。 |
|
|
| セッションのローカル側で使用する AS 番号 (ASN)。 |
|
|
|
|
|
|
| このルーターからセッションを確立するために使用するホスト VRF を指定します。 |
|
|
| BGP セッションを確立する近隣を指定します。 |
|
|
|
セッションのリモート終了に使用する ASN を指定します。このパラメーターを使用する場合、 |
|
|
|
明示的に設定せずに、セッションのリモートエンドに使用する ASN を検出します。同じ ASN を持つネイバーの場合は |
|
|
|
セッションを確立する IP アドレスを指定します。このパラメーターを使用する場合、 |
|
|
| セッションを確立するときに使用するインターフェイス名を指定します。このパラメーターを使用して、番号なし BGP ピアリングを設定します。2 つの BGP ピア間には、ポイントツーポイントのレイヤー 2 接続が必要です。番号なし BGP ピアリングは、IPv4、IPv6、またはデュアルスタックで使用できますが、IPv6 RA (ルーターアドバタイズメント) を有効にする必要があります。各インターフェイスは 1 つの BGP 接続に制限されます。 |
|
|
|
セッションを確立するときにダイアリングするポートを指定します。デフォルト値は |
|
|
|
BGP セッションの確立に使用するパスワードを指定します。 |
|
|
|
ネイバーの認証シークレットの名前を指定します。シークレットは "kubernetes.io/basic-auth" タイプであり、FRR-K8s デーモンと同じ namespace にある必要があります。キー "password" はパスワードをシークレットに保存します。 |
|
|
| RFC4271 に従って、要求された BGP ホールド時間を指定します。デフォルトは 180s です。 |
|
|
|
RFC4271 に従って、要求された BGP キープアライブ時間を指定します。デフォルトは |
|
|
| BGP が近隣に次に接続を試行するまで待機する時間を指定します。 |
|
|
| BGP ピアが複数ホップ離れているかどうかを示します。 |
|
|
| BGP セッションに関連付けられた BFD セッションに使用する BFD プロファイルの名前を指定します。設定されていない場合、BFD セッションは設定されません。 |
|
|
| 近隣にアドバタイズする接頭辞のリストと、関連するプロパティーを表します。 |
|
|
| 近隣にアドバタイズする接頭辞のリストを指定します。このリストは、ルーターで定義した接頭辞と一致する必要があります。 |
|
|
|
接頭辞を処理するときに使用するモードを指定します。接頭辞リスト内の接頭辞のみを許可するように |
|
|
| アドバタイズされたローカルプリファレンスに関連付けられた接頭辞を指定します。ローカル設定に関連付けられた接頭辞を、アドバタイズが許可される接頭辞に指定する必要があります。 |
|
|
| ローカル設定に関連付けられた接頭辞を指定します。 |
|
|
| 接頭辞に関連付けられたローカル設定を指定します。 |
|
|
| アドバタイズされた BGP コミュニティーに関連付けられた接頭辞を指定します。アドバタイズする接頭辞のリストに、ローカル設定に関連付けられた接頭辞を含める必要があります。 |
|
|
| コミュニティーに関連付けられた接頭辞を指定します。 |
|
|
| 接頭辞に関連付けられたコミュニティーを指定します。 |
|
|
| 近隣から受信する接頭辞を指定します。 |
|
|
| 近隣から受信する情報を指定します。 |
|
|
| 近隣から許可される接頭辞を指定します。 |
|
|
|
接頭辞を処理するときに使用するモードを指定します。 |
|
|
| MP BGP を無効にして、IPv4 と IPv6 のルート交換を別々の BGP セッションに分離しないようにします。 |
|
|
| このルーターインスタンスからアドバタイズするすべての接頭辞を指定します。 |
|
|
| ネイバーを設定する際に使用する BFD プロファイルのリストを指定します。 |
|
|
| 設定の他の部分で参照される BFD プロファイルの名前。 |
|
|
|
このシステムが制御パケットを受信できる最小間隔をミリ秒単位で指定します。デフォルトは |
|
|
|
このシステムが BFD 制御パケットを送信するために使用する、ジッターを除いた最小送信間隔をミリ秒単位で指定します。デフォルトは |
|
|
| パケット損失を判定するための検出乗数を設定します。接続損失検出タイマーを決定するには、リモート送信間隔にこの値を乗算します。 |
|
|
|
このシステムが処理できる最小のエコー受信送信間隔をミリ秒単位で設定します。デフォルトは |
|
|
| エコー送信モードを有効または無効にします。このモードはデフォルトで無効になっており、マルチホップ設定ではサポートされていません。 |
|
|
| セッションを passive としてマークします。passive セッションでは接続を開始せず、応答を開始する前にピアからの制御パケットを待機します。 |
|
|
| マルチホップセッションのみ。着信 BFD 制御パケットの最小予想 TTL を設定します。 |
|
|
| この設定の適用を試みるノードを制限します。指定した場合、指定されたセレクターに一致するラベルが割り当てられたノードのみが設定の適用を試みます。指定されていない場合は、すべてのノードがこの設定を適用しようとします。 |
|
|
| FRRConfiguration の監視状態を定義します。 |
4.8.3. FRR-K8s が複数の設定を統合する方法 リンクのコピーリンクがクリップボードにコピーされました!
FRR-K8s は、複数のユーザーが同じノードを設定する際に、加算マージストラテジーを使用します。FRR-K8s を使用することで、隣接ノードやプレフィックスの追加など、既存の設定を拡張できますが、他のソースで定義されたコンポーネントの削除を防ぐことができます。
- 設定の競合
特定の設定では競合が発生し、エラーが発生する可能性があります。次に例を示します。
- 同じルーター (同じ VRF 内) に対して異なる ASN がある
- 同じネイバー (同じ IP/ポート) に対して異なる ASN がある
- 名前が同じで値が異なる BFD プロファイルが複数ある
デーモンは、ノードに対して無効な設定を検出すると、その設定を無効として報告し、以前の有効な FRR 設定に戻します。
- マージ
マージ時には、以下の操作を実行できます。
- 近隣のノードに通知したい IP アドレスのセットを拡張します。
- IP アドレスのセットを持つ、新たな隣人を追加します。
- コミュニティーを関連付けたい IP アドレスのセットを拡張します。
- 近隣への着信ルートを許可します。
各設定は自己完結型である必要があります。これは、たとえば、別の設定から取得したプレフィックスを利用して、ルーターセクションで定義されていないプレフィックスを許可することはできない、という意味です。
適用する設定に互換性がある場合、マージは次のように機能します。
-
FRR-K8sは、すべてのルーターを組み合わせます。 -
FRR-K8sは、ルーターごとにすべての接頭辞と近隣をマージします。 -
FRR-K8sは、近隣ごとに、すべてのフィルターをマージします。
制限の少ないフィルターは、制限が厳密なフィルターよりも優先されます。たとえば、一部の接頭辞を受け入れるフィルターは、接頭辞をまったく受け入れないフィルターよりも優先され、すべての接頭辞を受け入れるフィルターは、一部の接頭辞を受け入れるフィルターよりも優先されます。
4.9. MetalLB のロギング、トラブルシューティング、サポート リンクのコピーリンクがクリップボードにコピーされました!
MetalLB の設定に関する問題を診断および解決するには、よく使用されるコマンドのリストを参照してください。これらのコマンドを使用することで、ネットワーク接続を確認し、サービスの状態を検査して、効率的なエラー回復を確保できます。
4.9.1. MetalLB ログレベルの設定 リンクのコピーリンクがクリップボードにコピーされました!
FRRouting (FRR) コンテナーのログの詳細度を管理するには、logLevel 仕様を設定します。この設定を調整することで、デフォルトの情報レベルからログの量を減らしたり、MetalLB の設定問題のトラブルシューティングのために詳細度を上げたりすることができます。
logLevel をdebug に設定することで、MetalLB についてより深く理解できます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
手順
以下の例のような内容で、
setdebugloglevel.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: MetalLB metadata: name: metallb namespace: metallb-system spec: logLevel: debug nodeSelector: node-role.kubernetes.io/worker: ""次のコマンドを入力して設定を適用します。
$ oc replace -f setdebugloglevel.yaml注記metallbCR はすでに作成済みで、ログレベルのみを変更すればよいので、oc replaceコマンドを使用してください。speakerPod の名前を表示します。$ oc get -n metallb-system pods -l component=speaker出力例
NAME READY STATUS RESTARTS AGE speaker-2m9pm 4/4 Running 0 9m19s speaker-7m4qw 3/4 Running 0 19s speaker-szlmx 4/4 Running 0 9m19s注記スピーカー Pod とコントローラー Pod が再作成され、更新されたログレベルが確実に適用されます。MetalLB のすべてのコンポーネントのログレベルが変更されます。
speakerログを表示します。$ oc logs -n metallb-system speaker-7m4qw -c speaker出力例
{"branch":"main","caller":"main.go:92","commit":"3d052535","goversion":"gc / go1.17.1 / amd64","level":"info","msg":"MetalLB speaker starting (commit 3d052535, branch main)","ts":"2022-05-17T09:55:05Z","version":""} {"caller":"announcer.go:110","event":"createARPResponder","interface":"ens4","level":"info","msg":"created ARP responder for interface","ts":"2022-05-17T09:55:05Z"} {"caller":"announcer.go:119","event":"createNDPResponder","interface":"ens4","level":"info","msg":"created NDP responder for interface","ts":"2022-05-17T09:55:05Z"} {"caller":"announcer.go:110","event":"createARPResponder","interface":"tun0","level":"info","msg":"created ARP responder for interface","ts":"2022-05-17T09:55:05Z"} {"caller":"announcer.go:119","event":"createNDPResponder","interface":"tun0","level":"info","msg":"created NDP responder for interface","ts":"2022-05-17T09:55:05Z"} I0517 09:55:06.515686 95 request.go:665] Waited for 1.026500832s due to client-side throttling, not priority and fairness, request: GET:https://172.30.0.1:443/apis/operators.coreos.com/v1alpha1?timeout=32s {"Starting Manager":"(MISSING)","caller":"k8s.go:389","level":"info","ts":"2022-05-17T09:55:08Z"} {"caller":"speakerlist.go:310","level":"info","msg":"node event - forcing sync","node addr":"10.0.128.4","node event":"NodeJoin","node name":"ci-ln-qb8t3mb-72292-7s7rh-worker-a-vvznj","ts":"2022-05-17T09:55:08Z"} {"caller":"service_controller.go:113","controller":"ServiceReconciler","enqueueing":"openshift-kube-controller-manager-operator/metrics","epslice":"{\"metadata\":{\"name\":\"metrics-xtsxr\",\"generateName\":\"metrics-\",\"namespace\":\"openshift-kube-controller-manager-operator\",\"uid\":\"ac6766d7-8504-492c-9d1e-4ae8897990ad\",\"resourceVersion\":\"9041\",\"generation\":4,\"creationTimestamp\":\"2022-05-17T07:16:53Z\",\"labels\":{\"app\":\"kube-controller-manager-operator\",\"endpointslice.kubernetes.io/managed-by\":\"endpointslice-controller.k8s.io\",\"kubernetes.io/service-name\":\"metrics\"},\"annotations\":{\"endpoints.kubernetes.io/last-change-trigger-time\":\"2022-05-17T07:21:34Z\"},\"ownerReferences\":[{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"name\":\"metrics\",\"uid\":\"0518eed3-6152-42be-b566-0bd00a60faf8\",\"controller\":true,\"blockOwnerDeletion\":true}],\"managedFields\":[{\"manager\":\"kube-controller-manager\",\"operation\":\"Update\",\"apiVersion\":\"discovery.k8s.io/v1\",\"time\":\"2022-05-17T07:20:02Z\",\"fieldsType\":\"FieldsV1\",\"fieldsV1\":{\"f:addressType\":{},\"f:endpoints\":{},\"f:metadata\":{\"f:annotations\":{\".\":{},\"f:endpoints.kubernetes.io/last-change-trigger-time\":{}},\"f:generateName\":{},\"f:labels\":{\".\":{},\"f:app\":{},\"f:endpointslice.kubernetes.io/managed-by\":{},\"f:kubernetes.io/service-name\":{}},\"f:ownerReferences\":{\".\":{},\"k:{\\\"uid\\\":\\\"0518eed3-6152-42be-b566-0bd00a60faf8\\\"}\":{}}},\"f:ports\":{}}}]},\"addressType\":\"IPv4\",\"endpoints\":[{\"addresses\":[\"10.129.0.7\"],\"conditions\":{\"ready\":true,\"serving\":true,\"terminating\":false},\"targetRef\":{\"kind\":\"Pod\",\"namespace\":\"openshift-kube-controller-manager-operator\",\"name\":\"kube-controller-manager-operator-6b98b89ddd-8d4nf\",\"uid\":\"dd5139b8-e41c-4946-a31b-1a629314e844\",\"resourceVersion\":\"9038\"},\"nodeName\":\"ci-ln-qb8t3mb-72292-7s7rh-master-0\",\"zone\":\"us-central1-a\"}],\"ports\":[{\"name\":\"https\",\"protocol\":\"TCP\",\"port\":8443}]}","level":"debug","ts":"2022-05-17T09:55:08Z"}FRR ログを表示します。
$ oc logs -n metallb-system speaker-7m4qw -c frr出力例
Started watchfrr 2022/05/17 09:55:05 ZEBRA: client 16 says hello and bids fair to announce only bgp routes vrf=0 2022/05/17 09:55:05 ZEBRA: client 31 says hello and bids fair to announce only vnc routes vrf=0 2022/05/17 09:55:05 ZEBRA: client 38 says hello and bids fair to announce only static routes vrf=0 2022/05/17 09:55:05 ZEBRA: client 43 says hello and bids fair to announce only bfd routes vrf=0 2022/05/17 09:57:25.089 BGP: Creating Default VRF, AS 64500 2022/05/17 09:57:25.090 BGP: dup addr detect enable max_moves 5 time 180 freeze disable freeze_time 0 2022/05/17 09:57:25.090 BGP: bgp_get: Registering BGP instance (null) to zebra 2022/05/17 09:57:25.090 BGP: Registering VRF 0 2022/05/17 09:57:25.091 BGP: Rx Router Id update VRF 0 Id 10.131.0.1/32 2022/05/17 09:57:25.091 BGP: RID change : vrf VRF default(0), RTR ID 10.131.0.1 2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF br0 2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF ens4 2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF ens4 addr 10.0.128.4/32 2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF ens4 addr fe80::c9d:84da:4d86:5618/64 2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF lo 2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF ovs-system 2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF tun0 2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF tun0 addr 10.131.0.1/23 2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF tun0 addr fe80::40f1:d1ff:feb6:5322/64 2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF veth2da49fed 2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF veth2da49fed addr fe80::24bd:d1ff:fec1:d88/64 2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF veth2fa08c8c 2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF veth2fa08c8c addr fe80::6870:ff:fe96:efc8/64 2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF veth41e356b7 2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF veth41e356b7 addr fe80::48ff:37ff:fede:eb4b/64 2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF veth1295c6e2 2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF veth1295c6e2 addr fe80::b827:a2ff:feed:637/64 2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF veth9733c6dc 2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF veth9733c6dc addr fe80::3cf4:15ff:fe11:e541/64 2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF veth336680ea 2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF veth336680ea addr fe80::94b1:8bff:fe7e:488c/64 2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF vetha0a907b7 2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF vetha0a907b7 addr fe80::3855:a6ff:fe73:46c3/64 2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF vethf35a4398 2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF vethf35a4398 addr fe80::40ef:2fff:fe57:4c4d/64 2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF vethf831b7f4 2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF vethf831b7f4 addr fe80::f0d9:89ff:fe7c:1d32/64 2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF vxlan_sys_4789 2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF vxlan_sys_4789 addr fe80::80c1:82ff:fe4b:f078/64 2022/05/17 09:57:26.094 BGP: 10.0.0.1 [FSM] Timer (start timer expire). 2022/05/17 09:57:26.094 BGP: 10.0.0.1 [FSM] BGP_Start (Idle->Connect), fd -1 2022/05/17 09:57:26.094 BGP: Allocated bnc 10.0.0.1/32(0)(VRF default) peer 0x7f807f7631a0 2022/05/17 09:57:26.094 BGP: sendmsg_zebra_rnh: sending cmd ZEBRA_NEXTHOP_REGISTER for 10.0.0.1/32 (vrf VRF default) 2022/05/17 09:57:26.094 BGP: 10.0.0.1 [FSM] Waiting for NHT 2022/05/17 09:57:26.094 BGP: bgp_fsm_change_status : vrf default(0), Status: Connect established_peers 0 2022/05/17 09:57:26.094 BGP: 10.0.0.1 went from Idle to Connect 2022/05/17 09:57:26.094 BGP: 10.0.0.1 [FSM] TCP_connection_open_failed (Connect->Active), fd -1 2022/05/17 09:57:26.094 BGP: bgp_fsm_change_status : vrf default(0), Status: Active established_peers 0 2022/05/17 09:57:26.094 BGP: 10.0.0.1 went from Connect to Active 2022/05/17 09:57:26.094 ZEBRA: rnh_register msg from client bgp: hdr->length=8, type=nexthop vrf=0 2022/05/17 09:57:26.094 ZEBRA: 0: Add RNH 10.0.0.1/32 type Nexthop 2022/05/17 09:57:26.094 ZEBRA: 0:10.0.0.1/32: Evaluate RNH, type Nexthop (force) 2022/05/17 09:57:26.094 ZEBRA: 0:10.0.0.1/32: NH has become unresolved 2022/05/17 09:57:26.094 ZEBRA: 0: Client bgp registers for RNH 10.0.0.1/32 type Nexthop 2022/05/17 09:57:26.094 BGP: VRF default(0): Rcvd NH update 10.0.0.1/32(0) - metric 0/0 #nhops 0/0 flags 0x6 2022/05/17 09:57:26.094 BGP: NH update for 10.0.0.1/32(0)(VRF default) - flags 0x6 chgflags 0x0 - evaluate paths 2022/05/17 09:57:26.094 BGP: evaluate_paths: Updating peer (10.0.0.1(VRF default)) status with NHT 2022/05/17 09:57:30.081 ZEBRA: Event driven route-map update triggered 2022/05/17 09:57:30.081 ZEBRA: Event handler for route-map: 10.0.0.1-out 2022/05/17 09:57:30.081 ZEBRA: Event handler for route-map: 10.0.0.1-in 2022/05/17 09:57:31.104 ZEBRA: netlink_parse_info: netlink-listen (NS 0) type RTM_NEWNEIGH(28), len=76, seq=0, pid=0 2022/05/17 09:57:31.104 ZEBRA: Neighbor Entry received is not on a VLAN or a BRIDGE, ignoring 2022/05/17 09:57:31.105 ZEBRA: netlink_parse_info: netlink-listen (NS 0) type RTM_NEWNEIGH(28), len=76, seq=0, pid=0 2022/05/17 09:57:31.105 ZEBRA: Neighbor Entry received is not on a VLAN or a BRIDGE, ignoring
4.9.1.1. FRRouting (FRR) ログレベル リンクのコピーリンクがクリップボードにコピーされました!
トラブルシューティングや監視のためにネットワークログの詳細度を制御するには、FRRouting (FRR) のログレベルを参照してください。
以下の値は、記録されたイベントの重大度を定義するものであり、運用要件に基づいて出力をフィルタリングするために使用できます。
| ログレベル | 説明 |
|---|---|
|
| すべてのログレベルのすべてのログ情報を提供します。 |
|
|
診断に役立つ情報。詳細なトラブルシューティング情報を提供するには、 |
|
| 常にログに記録する必要がある情報を提供しますが、通常の状況ではユーザーの介入は必要ありません。これはデフォルトのログレベルです。 |
|
|
一貫性のない |
|
|
|
|
| すべてのロギングをオフにします。 |
4.9.2. BGP の問題のトラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
BGP の設定に関する問題を診断および解決するには、FRR コンテナー内で直接コマンドを実行します。コンテナーにアクセスすることで、ルーティングの状態を確認したり、接続エラーを特定したりできます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
手順
次のコマンドを実行して、
frr-k8sPod の名前を表示します。$ oc -n metallb-system get pods -l component=frr-k8s出力例
NAME READY STATUS RESTARTS AGE frr-k8s-thsmw 6/6 Running 0 109m次のコマンドを実行して、FRR の実行設定を表示します。
$ oc exec -n metallb-system frr-k8s-thsmw -c frr -- vtysh -c "show running-config"出力例
Building configuration... Current configuration: ! frr version 8.5.3 frr defaults traditional hostname some-hostname log file /etc/frr/frr.log informational log timestamp precision 3 no ip forwarding no ipv6 forwarding service integrated-vtysh-config ! router bgp 64500 bgp router-id 10.0.1.2 no bgp ebgp-requires-policy no bgp default ipv4-unicast no bgp network import-check neighbor 10.0.2.3 remote-as 64500 neighbor 10.0.2.3 bfd profile doc-example-bfd-profile-full neighbor 10.0.2.3 timers 5 15 neighbor 10.0.2.4 remote-as 64500 neighbor 10.0.2.4 bfd profile doc-example-bfd-profile-full neighbor 10.0.2.4 timers 5 15 ! address-family ipv4 unicast network 203.0.113.200/30 neighbor 10.0.2.3 activate neighbor 10.0.2.3 route-map 10.0.2.3-in in neighbor 10.0.2.4 activate neighbor 10.0.2.4 route-map 10.0.2.4-in in exit-address-family ! address-family ipv6 unicast network fc00:f853:ccd:e799::/124 neighbor 10.0.2.3 activate neighbor 10.0.2.3 route-map 10.0.2.3-in in neighbor 10.0.2.4 activate neighbor 10.0.2.4 route-map 10.0.2.4-in in exit-address-family ! route-map 10.0.2.3-in deny 20 ! route-map 10.0.2.4-in deny 20 ! ip nht resolve-via-default ! ipv6 nht resolve-via-default ! line vty ! bfd profile doc-example-bfd-profile-full transmit-interval 35 receive-interval 35 passive-mode echo-mode echo-interval 35 minimum-ttl 10 ! ! endここでは、以下のようになります。
ルーター BGP 64500-
MetalLB の ASN を示す
ルーター BGPを指定します。 ネイバー 10.0.2.3 リモート AS 64500-
追加した各 BGP ピアのカスタムリソースに対して、
neighbor <ip-address> remote-as <peer-ASN>行が存在することを指定します。 bfd プロファイルドキュメント例 -bfd プロファイル完全版- BFD プロファイルが正しい BGP ピアに関連付けられており、コマンド出力に BFD プロファイルが表示されることを指定します。
ネットワーク 203.0.113.200/30-
ネットワークの <ip-address-range>行が、アドレスプールのカスタムリソースで指定した IP アドレス範囲と一致することを指定します。
次のコマンドを実行して BGP のサマリーを表示します。
$ oc exec -n metallb-system frr-k8s-thsmw -c frr -- vtysh -c "show bgp summary"出力例
IPv4 Unicast Summary: BGP router identifier 10.0.1.2, local AS number 64500 vrf-id 0 BGP table version 1 RIB entries 1, using 192 bytes of memory Peers 2, using 29 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt 10.0.2.3 4 64500 387 389 0 0 0 00:32:02 0 1 10.0.2.4 4 64500 0 0 0 0 0 never Active 0 Total number of neighbors 2 IPv6 Unicast Summary: BGP router identifier 10.0.1.2, local AS number 64500 vrf-id 0 BGP table version 1 RIB entries 1, using 192 bytes of memory Peers 2, using 29 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt 10.0.2.3 4 64500 387 389 0 0 0 00:32:02 NoNeg 10.0.2.4 4 64500 0 0 0 0 0 never Active 0 Total number of neighbors 2ここでは、以下のようになります。
10.0.2.3- 追加した BGP ピアカスタムリソースごとに 1 行ずつ出力に含めることを指定します。
10.0.2.4-
出力に受信メッセージ
数 0、送信メッセージ数0 と表示されることを指定します。これは、BGP セッションを持たない BGP ピアであることを示します。ネットワーク接続と BGP ピアの BGP 設定を確認します。
次のコマンドを実行して、アドレスプールを受信した BGP ピアを表示します。
$ oc exec -n metallb-system frr-k8s-thsmw -c frr -- vtysh -c "show bgp ipv4 unicast 203.0.113.200/30"ipv4をipv6に置き換えて、IPv6 アドレスプールを受信した BGP ピアを表示します。203.0.113.200/30は、アドレスプールの IPv4 または IPv6IP アドレス範囲に置き換えます。出力例
BGP routing table entry for 203.0.113.200/30 Paths: (1 available, best #1, table default) Advertised to non peer-group peers: 10.0.2.3 Local 0.0.0.0 from 0.0.0.0 (10.0.1.2) Origin IGP, metric 0, weight 32768, valid, sourced, local, best (First path received) Last update: Mon Jan 10 19:49:07 2022ここでは、以下のようになります。
10.0.2.3- 出力に BGP ピアの IP アドレスが含まれることを指定します。
4.9.3. BFD の問題のトラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
双方向フォワーディング検出 (BFD) の問題を診断および解決するには、FRRouting (FRR) コンテナー内で直接コマンドを実行します。コンテナーにアクセスすることで、BFD ピアが確立された BGP セッションで正しく設定されていることを確認できます。
Red Hat がサポートする BFD の実装では、スピーカー Pod 内に存在するコンテナー内で FRRouting (FRR) を使用します。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
手順
speakerPod の名前を表示します。$ oc get -n metallb-system pods -l component=speaker出力例
NAME READY STATUS RESTARTS AGE speaker-66bth 4/4 Running 0 26m speaker-gvfnf 4/4 Running 0 26m ...BFD ピアを表示します。
$ oc exec -n metallb-system speaker-66bth -c frr -- vtysh -c "show bfd peers brief"出力例
Session count: 2 SessionId LocalAddress PeerAddress Status ========= ============ =========== ====== 3909139637 10.0.1.2 10.0.2.3 upここでは、以下のようになります。
up-
PeerAddress列には各 BFD ピアが含まれることを指定します。出力に含まれると予想される BFD ピア IP アドレスが出力にリストされていない場合は、ピアとの BGP 接続のトラブルシューティングを行います。ステータスフィールドがdownと表示されている場合は、ノードとピア間のリンクと機器の接続を確認します。speaker Pod のノード名は、oc get pods -n metallb-system speaker-66bth -o jsonpath='{.spec.nodeName}'などのコマンドで判断できます。
4.9.4. BGP および BFD の MetalLB メトリクス リンクのコピーリンクがクリップボードにコピーされました!
ネットワーク接続を監視し、ルーティング状態を診断するには、MetalLB の Prometheus メトリクスを参照してください。これらのメトリクスは、BGP ピアと BFD プロファイルの状態を可視化し、安定した外部通信を確保するのに役立ちます。
| 名前 | 説明 |
|---|---|
|
| 各 BFD ピアから受信した BFD 制御パケットの数をカウントします。 |
|
| 各 BFD ピアに送信された BFD 制御パケットの数をカウントします。 |
|
| 各 BFD ピアから受信した BFD エコーパケットの数をカウントします。 |
|
| 各 BFD に送信された BFD エコーパケットの数をカウントします。 |
|
|
ピアとの BFD セッションが |
|
|
BFD ピアとの接続状態を示します。 |
|
|
ピアとの BFD セッションが |
|
| 各 BFD ピアの BFD Zebra 通知の数をカウントします。 |
| 名前 | 説明 |
|---|---|
|
| BGP ピアにアドバタイズされるロードバランサーの IP アドレス接頭辞の数をカウントします。接頭辞 と 集約ルート という用語は同じ意味です。 |
|
|
BGP ピアとの接続状態を示します。 |
|
| 各 BGP ピアに送信された BGP 更新メッセージの数をカウントします。 |
|
| 各 BGP ピアに送信された BGP オープンメッセージの数をカウントします。 |
|
| 各 BGP ピアから受信した BGP オープンメッセージの数をカウントします。 |
|
| 各 BGP ピアに送信された BGP 通知メッセージの数をカウントします。 |
|
| 各 BGP ピアから受信した BGP 更新メッセージの数をカウントします。 |
|
| 各 BGP ピアに送信された BGP keepalive メッセージの数をカウントします。 |
|
| 各 BGP ピアから受信した BGP keepalive メッセージの数をカウントします。 |
|
| 各 BGP ピアに送信された BGP ルートリフレッシュメッセージの数をカウントします。 |
|
| 各 BGP ピアに送信された BGP メッセージの合計数をカウントします。 |
|
| 各 BGP ピアから受信した BGP メッセージの合計数をカウントします。 |
4.9.5. MetalLB データの収集について リンクのコピーリンクがクリップボードにコピーされました!
デバッグやサポート分析のために診断データを収集するには、oc adm must-gather CLI コマンドを実行します。このユーティリティーは、クラスター、MetalLB 設定、および MetalLBOperator の状態に関する重要な情報を取得します。
以下のリストは、MetalLB および MetalLBOperator に関連する機能とオブジェクトの詳細を示しています。
- MetalLBOperator をデプロイする名前空間と子オブジェクト
- すべての MetalLB Operator カスタムリソース定義 (CRD)
このコマンドは、Red Hat が BGP および BFD を実装するために使用する FRRouting (FRR) から以下の情報を収集します。
-
/etc/frr/frr.conf -
/etc/frr/frr.log -
/etc/frr/daemons設定ファイル -
/etc/frr/vtysh.conf
このコマンドは、各 スピーカー Pod に存在する frr コンテナーからログファイルと設定ファイルを収集します。さらに、このコマンドは以下の vtysh コマンドの出力を収集します。
-
show running-config -
show bgp ipv4 -
show bgp ipv6 -
show bgp neighbor -
show bfd peer
コマンドを実行する際に、追加の設定は必要ありません。
関連情報