ネットワーク Operator
OpenShift Container Platform におけるネットワーク固有の Operator の管理
概要
第1章 Kubernetes NMState Operator リンクのコピーリンクがクリップボードにコピーされました!
Kubernetes NMState Operator は、NMState の OpenShift Container Platform クラスターのノード間でステートドリブンのネットワーク設定を実行するための Kubernetes API を提供します。Kubernetes NMState Operator は、ユーザーに対して、クラスターノードの各種のネットワークインターフェイスタイプ、DNS、およびルーティングを設定する機能を提供します。さらに、クラスターノードのデーモンは、各ノードの API サーバーへのネットワークインターフェイスの状態の定期的な報告を行います。
Red Hat は、ベアメタル、IBM Power®、IBM Z®、IBM® LinuxONE、VMware vSphere、および Red Hat OpenStack Platform (RHOSP) インストール上の実稼働環境で Kubernetes NMState Operator をサポートしています。
Red Hat では、Microsoft Azure 上で Kubernetes NMState Operator を使用するためのサポートが提供されていますが、その機能は限られています。サポートは、インストール後のタスクとしてシステム上の DNS サーバーを設定することに限定されています。
OpenShift Container Platform で NMState を使用する前に、Kubernetes NMState Operator をインストールする必要があります。Kubernetes NMState Operator をインストールしたら、次のタスクを完了できます。
- ノードのネットワーク状態と設定の監視と更新
-
カスタマイズされた
br-exブリッジを含むマニフェストオブジェクトの作成
これらのタスクの詳細は、関連情報 セクションを参照してください。
Kubernetes NMState Operator は、セカンダリー NIC のネットワーク設定を更新します。Operator は、プライマリー NIC のネットワーク設定を更新したり、ほとんどのオンプレミスネットワーク上の br-ex ブリッジを更新したりすることはできません。
ベアメタルプラットフォームでは、Kubernetes NMState Operator を使用して br-ex ブリッジネットワーク設定を更新することは、マシン設定マニフェストファイルで br-ex ブリッジをインターフェイスとして設定した場合にのみサポートされます。br-ex ブリッジをインストール後のタスクとして更新するには、クラスターの NodeNetworkConfigurationPolicy カスタムリソース (CR) の NMState 設定で、br-ex ブリッジをインターフェイスとして設定する必要があります。詳細は、インストール後の設定 の カスタマイズされた br-ex ブリッジを含むマニフェストオブジェクトの作成 を参照してください。
OpenShift Container Platform は nmstate を使用して、ノードネットワークの状態を報告し、これを設定します。これにより、たとえばすべてのノードに Linux ブリッジを作成するなど、単一の設定マニフェストをクラスターに適用して、ネットワークポリシー設定を変更できるようになります。
ノードのネットワークは、以下のオブジェクトによって監視され更新されます。
NodeNetworkState- そのノード上のネットワークの状態を報告します。
NodeNetworkConfigurationPolicy-
ノードで要求されるネットワーク設定を説明します。
NodeNetworkConfigurationPolicyCR をクラスターに適用して、インターフェイスの追加および削除など、ノードネットワーク設定を更新します。 NodeNetworkConfigurationEnactment- 各ノードに制定されたネットワークポリシーを報告します。
インストール後の作業として、br-ex ブリッジまたはその基盤となるインターフェイスの設定変更を行わないでください。
1.1. Kubernetes NMState Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
ウェブコンソールまたは CLI を使用して、Kubernetes NMState Operator をインストールできます。
1.1.1. Web コンソールを使用した Kubernetes NMState Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
Web コンソールを使用して Kubernetes NMState Operator をインストールできます。Kubernetes NMState Operator をインストールすると、Operator によって NMState State Controller がすべてのクラスターノードにデーモンセットとしてデプロイされます。
前提条件
-
cluster-admin権限を持つユーザーとしてログインしている。
手順
- Ecosystem → Software Catalog を選択します。
-
All Items の下の検索フィールドに、
nmstateと入力し、Enter をクリックして Kubernetes NMState Operator を検索します。 - Kubernetes NMState Operator の検索結果をクリックします。
- Install をクリックして、Install Operator ウィンドウを開きます。
- Install をクリックして Operator をインストールします。
- Operator のインストールが完了したら、View Operator をクリックします。
-
Provided APIs で Create Instance をクリックし、
kubernetes-nmstateのインスタンスを作成するダイアログボックスを開きます。 ダイアログボックスの Name フィールドで、インスタンスの名前が
nmstateであることを確認します。注記名前の制限は既知の問題です。インスタンスはクラスター全体のシングルトンです。
- デフォルト設定を受け入れ、Create をクリックしてインスタンスを作成します。
1.1.2. CLI を使用した Kubernetes NMState Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
OpenShift CLI (oc) を使用して、Kubernetes NMState Operator をインストールできます。インストール後、Operator は NMState ステートコントローラーをデーモンセットとしてクラスター内のすべてのノードに展開し、ノードのネットワーク状態と設定を管理します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
nmstateOperator namespace を作成します。$ cat << EOF | oc apply -f - apiVersion: v1 kind: Namespace metadata: name: openshift-nmstate spec: finalizers: - kubernetes EOFOperatorGroupを作成します。$ cat << EOF | oc apply -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: openshift-nmstate namespace: openshift-nmstate spec: targetNamespaces: - openshift-nmstate EOFnmstateOperator にサブスクライブします。$ cat << EOF| oc apply -f - apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: kubernetes-nmstate-operator namespace: openshift-nmstate spec: channel: stable installPlanApproval: Automatic name: kubernetes-nmstate-operator source: redhat-operators sourceNamespace: openshift-marketplace EOFnmstateOperator デプロイメントのClusterServiceVersion(CSV) ステータスがSucceededであることを確認します。$ oc get clusterserviceversion -n openshift-nmstate \ -o custom-columns=Name:.metadata.name,Phase:.status.phasenmstateOperator のインスタンスを作成します。$ cat << EOF | oc apply -f - apiVersion: nmstate.io/v1 kind: NMState metadata: name: nmstate EOFDNS 接続の問題が原因でクラスターで DNS ヘルスチェックプローブに問題がある場合は、次の DNS ホスト名設定を
NMStateCRD に追加して、これらの問題を解決できるヘルスチェックを組み込むことができます。apiVersion: nmstate.io/v1 kind: NMState metadata: name: nmstate spec: probeConfiguration: dns: host: redhat.com # ...次のコマンドを実行して、DNS ホスト名の設定をクラスターネットワークに適用します。
<filename>は、CRD ファイルの名前に置き換えます。$ oc apply -f <filename>.yaml次のコマンドを実行して、リソースが
Available条件に達するまでnmstateCRD を監視します。--timeoutオプションの値を設定して、設定した最大待機時間内にAvailable条件が満たされなかった場合にコマンドがタイムアウトし、エラーメッセージが生成されるようにします。$ oc wait --for=condition=Available nmstate/nmstate --timeout=600s
検証
次のコマンドを入力して、NMState Operator のすべての Pod のステータスが
Runningであることを確認します。$ oc get pod -n openshift-nmstate
1.1.3. Kubernetes NMState Operator によって収集されたメトリクスの表示 リンクのコピーリンクがクリップボードにコピーされました!
Kubernetes NMState Operator である kubernetes-nmstate-operator は、kubernetes_nmstate_features_applied コンポーネントからメトリクスを収集し、すぐに使用できるメトリクスとして公開できます。メトリクスを表示するユースケースとして、NodeNetworkConfigurationPolicy カスタムリソース (CR) を作成し、そのポリシーが有効であることを確認したい場合を考えてみましょう。
kubernetes_nmstate_features_applied メトリクスは API ではないため、OpenShift Container Platform のバージョン間で変更になる可能性があります。
Web コンソールのメトリクス UI には、選択したプロジェクトの定義済み CPU、メモリー、帯域幅、およびネットワークパケットクエリーがいくつか含まれています。プロジェクトの CPU、メモリー、帯域幅、ネットワークパケット、およびアプリケーションメトリクスにカスタム Prometheus Query Language (PromQL) クエリーを実行できます。
次の例は、OpenShift Container Platform クラスターに適用される NodeNetworkConfigurationPolicy マニフェストの例を示しています。
# ...
interfaces:
- name: br1
type: linux-bridge
state: up
ipv4:
enabled: true
dhcp: true
dhcp-custom-hostname: foo
bridge:
options:
stp:
enabled: false
port: []
# ...
NodeNetworkConfigurationPolicy マニフェストはメトリクスを公開し、Cluster Monitoring Operator (CMO) が利用できるようにします。次の例は、公開されたメトリクスの一部を示しています。
controller_runtime_reconcile_time_seconds_bucket{controller="nodenetworkconfigurationenactment",le="0.005"} 16
controller_runtime_reconcile_time_seconds_bucket{controller="nodenetworkconfigurationenactment",le="0.01"} 16
controller_runtime_reconcile_time_seconds_bucket{controller="nodenetworkconfigurationenactment",le="0.025"} 16
...
# HELP kubernetes_nmstate_features_applied Number of nmstate features applied labeled by its name
# TYPE kubernetes_nmstate_features_applied gauge
kubernetes_nmstate_features_applied{name="dhcpv4-custom-hostname"} 1
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - 管理者として Web コンソールにログインし、Kubernetes NMState Operator をインストールしている。
- 開発者として、またはメトリクスで表示しているプロジェクトの表示権限を持つユーザーとしてクラスターへのアクセスがある。
- ユーザー定義プロジェクトのモニタリングが有効化されている。
- ユーザー定義プロジェクトにサービスをデプロイしている。
-
NodeNetworkConfigurationPolicyマニフェストを作成し、クラスターに適用している。
OpenShift Container Platform 4.19 以降、Web コンソールのパースペクティブが統合されました。Developer パースペクティブは、デフォルトでは有効になっていません。
すべてのユーザーは、OpenShift Container Platform Web コンソールのすべての機能を操作できます。ただし、クラスターの所有者でない場合は、特定の機能にアクセスする権限をクラスターの所有者に要求する必要がある場合があります。
引き続き Developer パースペクティブを有効にできます。Web コンソールの Getting Started ペインでは、コンソールツアーの実行、クラスター設定に関する情報の検索、Developer パースペクティブを有効にするためのクイックスタートの表示、リンク先を表示して新機能の確認などを行えます。
手順
OpenShift Container Platform Web コンソールの Developer パースペクティブからメトリクスを表示する場合は、次のタスクを実行します。
- Observe をクリックします。
-
特定のプロジェクトのメトリクスを表示するには、Project: リストでプロジェクトを選択します。たとえば、
openshift-nmstateです。 - Metrics タブをクリックします。
プロット上のメトリクスを視覚化するには、Select query リストからクエリーを選択するか、Show PromQL を選択して、選択したクエリーに基づいてカスタム PromQL クエリーを作成します。
注記開発者ロールでは 1 度に 1 つのクエリーのみ実行できます。
管理者として OpenShift Container Platform Web コンソールでメトリクスを表示する場合は、以下のタスクを実行します。
- Observe → Metrics をクリックします。
-
Expression フィールドに
kubernetes_nmstate_features_appliedと入力します。 - Add query をクリックし、Run queries をクリックします。
視覚化されたメトリクスを調べるには、次のいずれかのタスクを実行します。
プロットを拡大して時間範囲を変更するには、次のいずれかのタスクを実行します。
- 時間範囲を視覚的に選択するには、プロットをクリックして水平にドラッグします。
- 時間範囲を選択するには、コンソールの左上にあるメニューを使用します。
- 時間の範囲をリセットするには、Reset zoom を選択します。
- 特定の時点におけるすべてのクエリーの出力を表示するには、その時点でプロット上にマウスカーソルを置きます。クエリー出力がポップアップボックスに表示されます。
1.2. Kubernetes NMState Operator のアンインストール リンクのコピーリンクがクリップボードにコピーされました!
Kubernetes NMState Operator および関連リソースが不要になったら、削除してください。
Operator Lifecycle Manager (OLM) を使用して Kubernetes NMState Operator をアンインストールできますが、設計上、OLM は関連付けられているカスタムリソース定義 (CRD)、カスタムリソース (CR)、API サービスを削除しません。
OLM が使用する Subcription リソースから Kubernetes NMState Operator をアンインストールする前に、削除する Kubernetes NMState Operator リソースを特定します。そうすることで、実行中のクラスターに影響を与えることなくリソースを削除できます。
Kubernetes NMState Operator を再インストールする必要がある場合は、「CLI を使用した Kubernetes NMState Operator のインストール」または「Web コンソールを使用した Kubernetes NMState Operator のインストール」を参照してください。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
jqCLI ツールがインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
次のコマンドを実行して、
Subcriptionリソースに対する Kubernetes NMState Operator のサブスクリプションを解除します。$ oc delete --namespace openshift-nmstate subscription kubernetes-nmstate-operatorKubernetes NMState Operator に関連付けられている
ClusterServiceVersion(CSV) リソースを見つけます。$ oc get --namespace openshift-nmstate clusterserviceversionCSV リソースをリストする出力例
NAME DISPLAY VERSION REPLACES PHASE kubernetes-nmstate-operator.v4.20.0 Kubernetes NMState Operator 4.20.0 SucceededCSV リソースを削除します。ファイルを削除すると、OLM は Operator 用に作成した
RBACなどの特定リソースを削除します。$ oc delete --namespace openshift-nmstate clusterserviceversion kubernetes-nmstate-operator.v4.20.0次のコマンドを実行して、
nmstateCR と関連するDeploymentリソースを削除します。$ oc -n openshift-nmstate delete nmstate nmstate$ oc delete --all deployments --namespace=openshift-nmstatenmstateCR を削除した後、console.operator.openshift.io/clusterCR からnmstate-console-pluginコンソールプラグイン名を削除します。次のコマンドを実行して、有効なプラグインのリスト内に存在する
nmstate-console-pluginエントリーの位置を保存します。次のコマンドは、jqCLI ツールを使用して、エントリーのインデックスをINDEXという名前の環境変数に保存します。INDEX=$(oc get console.operator.openshift.io cluster -o json | jq -r '.spec.plugins | to_entries[] | select(.value == "nmstate-console-plugin") | .key')次のパッチコマンドを実行して、
console.operator.openshift.io/clusterCR からnmstate-console-pluginエントリーを削除します。$ oc patch console.operator.openshift.io cluster --type=json -p "[{\"op\": \"remove\", \"path\": \"/spec/plugins/$INDEX\"}]"-
INDEXは補助変数です。この変数には別の名前を指定できます。
-
オプション:CRD を削除した後でも CR インスタンスを復元できるように CR インスタンスを保持するには、次のコマンドを入力します。
$ oc get -A nncp -o yaml > cluster-nncp.yaml重要NNCP などの保存された CR を再利用するには、Kubernetes NMState Operator をアンインストールし、Kubernetes NMState Operator を再インストールしてから、次のコマンドを実行して CR を復元する必要があります。
$ oc apply -f cluster-nncp.yaml以下のコマンドを実行して、
nmstates.nmstate.ioなどのすべての CRD を削除します。$ oc delete crd nmstates.nmstate.io$ oc delete crd nodenetworkconfigurationenactments.nmstate.io$ oc delete crd nodenetworkstates.nmstate.io$ oc delete crd nodenetworkconfigurationpolicies.nmstate.ionamespace を削除します。
$ oc delete namespace openshift-nmstate
第2章 AWS Load Balancer Operator リンクのコピーリンクがクリップボードにコピーされました!
2.1. AWS Load Balancer Operator リリースノート リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer (ALB) Operator のリリースノートには、すべての新機能と機能強化、注目すべき技術的な変更点、以前のバージョンからの主要な修正点、および一般提供開始時に判明しているバグがまとめられています。
AWS Load Balancer (ALB) Operator は、x86_64 アーキテクチャーでのみサポートされます。
これらのリリースノートは、OpenShift Container Platform での AWS Load Balancer Operator の開発を追跡します。
AWS Load Balancer Operator は現在、AWS GovCloud をサポートしていません。
2.1.1. AWS Load Balancer Operator 1.2.0 リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator 1.2.0 のリリースノートには、すべての新機能と機能強化、注目すべき技術的変更点、前バージョンからの主要な修正点、および一般提供開始時点での既知のバグがまとめられています。
AWS Load Balancer Operator バージョン 1.2.0 では、以下のアドバイザリーを利用できます。
RHEA-2025:0034 Release of AWS Load Balancer Operator 1.2.z on OperatorHub
- 大きな変更
- このリリースでは、AWS Load Balancer Controller バージョン 2.8.2 がサポートされています。
-
今回のリリースでは、
インフラストラクチャーリソースで定義されたプラットフォームタグが、コントローラーによって作成されるすべての AWS オブジェクトに追加されます。
2.1.2. AWS Load Balancer Operator 1.1.1 リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator 1.1.1 のリリースノートには、すべての新機能と機能強化、注目すべき技術的な変更点、以前のバージョンからの主要な修正点、および一般提供開始時点での既知のバグがまとめられています。
AWS Load Balancer Operator バージョン 1.1.1 では、以下のアドバイザリーを利用できます。
2.1.3. AWS Load Balancer Operator 1.1.0 リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator 1.1.0 のリリースノートには、すべての新機能と機能強化、注目すべき技術的な変更点、以前のバージョンからの主要な修正点、および一般提供開始時点での既知のバグがまとめられています。
AWS Load Balancer Operator バージョン 1.1.0 は、AWS Load Balancer Controller バージョン 2.4.4 をサポートします。
AWS Load Balancer Operator バージョン 1.1.0 では、以下のアドバイザリーを利用できます。
RHEA-2023:6218 Release of AWS Load Balancer Operator on OperatorHub Enhancement Advisory Update
- 大きな変更
このリリースでは、Kubernetes API バージョン 0.27.2 を使用します。
- 新機能
AWS Load Balancer Operator は、Cloud Credential Operator を使用して標準化された Security Token Service (STS) フローをサポートするようになりました。
- バグ修正
FIPS 準拠のクラスターでは、TLS バージョン 1.2 を使用する必要があります。以前は、AWS Load Balancer Controller の Webhook は最小バージョンとして TLS 1.3 のみを受け入れていたため、FIPS 準拠のクラスターで次のようなエラーが発生しました。
remote error: tls: protocol version not supported現在、AWS Load Balancer Controller は TLS 1.2 を最小 TLS バージョンとして受け入れ、この問題は解決されています。(OCPBUGS-14846)
2.1.4. AWS Load Balancer Operator 1.0.1 リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator 1.0.1 のリリースノートには、すべての新機能と機能強化、注目すべき技術的な変更点、以前のバージョンからの主要な修正点、および一般提供開始時点での既知のバグがまとめられています。
AWS Load Balancer Operator バージョン 1.0.1 では、以下のアドバイザリーを利用できます。
2.1.5. AWS Load Balancer Operator 1.0.0 リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator 1.0.0 のリリースノートには、すべての新機能と機能強化、注目すべき技術的な変更点、以前のバージョンからの主要な修正点、および一般提供開始時点での既知のバグがまとめられています。
このリリースで、AWS Load Balancer Operator の一般提供が開始されました。AWS Load Balancer Operator バージョン 1.0.0 は、AWS Load Balancer Controller バージョン 2.4.4 をサポートします。
AWS Load Balancer Operator バージョン 1.0.0 では、以下のアドバイザリーを利用できます。
AWS Load Balancer (ALB) Operator バージョン 1.x.x は、テクノロジープレビューバージョン 0.x.x から自動的にアップグレードできません。以前のバージョンからアップグレードするには、ALB オペランドをアンインストールし、aws-load-balancer-operator namespace を削除する必要があります。
- 大きな変更
-
このリリースでは、新しい
v1API バージョンを使用しています。
-
このリリースでは、新しい
- バグ修正
- 以前のバージョンでは、AWS Load Balancer Operator によってプロビジョニングされたコントローラーは、クラスター全体のプロキシー設定を適切に使用しませんでした。これらの設定は、コントローラーに正しく適用されるようになりました。(OCPBUGS-4052、OCPBUGS-5295)
2.1.6. 以前のバージョン リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator を評価するには、テクノロジープレビューとして提供されている最初の 2 つのバージョンを使用してください。これらのバージョンは本番環境のクラスターでは使用しないでください。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
AWS Load Balancer Operator バージョン 0.2.0 では、以下のアドバイザリーを利用できます。
AWS Load Balancer Operator バージョン 0.0.1 では、以下のアドバイザリーを利用できます。
2.2. OpenShift Container Platform の AWS Load Balancer Operator リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Controller をデプロイおよび管理するには、OpenShift Container Platform の Web コンソールまたは CLI を使用して、ソフトウェアカタログから AWS Load Balancer Operator をインストールします。Operator を使用すると、AWS ロードバランサーをクラスターインフラストラクチャーに直接統合できます。
2.2.1. AWS Load Balancer Operator に関する考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
デプロイメントを成功させるためには、AWS ロードバランサーオペレーターの制限事項を確認してください。これらの制約を理解することで、互換性の問題を回避し、インストール前に Operator がお客様のアーキテクチャー要件を満たしていることを確認できます。
AWS Load Balancer Operator をインストールして使用する前に、次の制限事項を確認してください。
- IP トラフィックモードは、AWS Elastic Kubernetes Service (EKS) でのみ機能します。AWS Load Balancer Operator は、AWS Load Balancer Controller の IP トラフィックモードを無効にします。IP トラフィックモードを無効にすると、AWS Load Balancer Controller は Pod readiness ゲートを使用できません。
-
AWS Load Balancer Operator は
--disable-ingress-class-annotationや--disable-ingress-group-name-annotationなどのコマンドラインフラグを AWS Load Balancer Controller に追加します。したがって、AWS Load Balancer Operator では、Ingressリソースでkubernetes.io/ingress.classおよびalb.ingress.kubernetes.io/group.nameアノテーションを使用できません。 -
AWS Load Balancer Operator では、サービスタイプが
NodePort である必要があり、LoadBalancerまたはClusterIP であってはなりません。
2.2.2. AWS Load Balancer Operator のデプロイ リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator をデプロイすると、kubernetes.io/role/ elb タグが存在しない場合、Operator はパブリックサブネットに自動的にタグを付けます。Operator は、クラスター統合が確実に成功するように、基盤となる AWS クラウド内の特定のネットワークリソースを特定します。
AWS Load Balancer Operator は、基盤となる AWS クラウドから以下の情報を検出します。
- Operator をホストするクラスターがデプロイされている仮想プライベートクラウド (VPC) の ID。
- 検出された VPC のパブリックおよびプライベートサブネット。
AWS Load Balancer Operator は、インスタンス ターゲットタイプのみで Network Load Balancer (NLB) を使用することにより、タイプ LoadBalancer の Kubernetes サービスリソースをサポートします。
手順
ソフトウェアカタログからオンデマンドで AWS Load Balancer Operator をデプロイするには、次のコマンドを実行して
Subscriptionオブジェクトを作成します。$ oc -n aws-load-balancer-operator get sub aws-load-balancer-operator --template='{{.status.installplan.name}}{{"\n"}}'次のコマンドを実行して、インストールプランのステータスが
Completeになっているか確認します。$ oc -n aws-load-balancer-operator get ip <install_plan_name> --template='{{.status.phase}}{{"\n"}}'次のコマンドを実行して、
aws-load-balancer-operator-controller-managerデプロイメントのステータスを表示します。$ oc get -n aws-load-balancer-operator deployment/aws-load-balancer-operator-controller-manager出力例
NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-operator-controller-manager 1/1 1 1 23h
2.2.3. Outpost に拡張された AWS VPC クラスターでの AWS Load Balancer Operator の使用 リンクのコピーリンクがクリップボードにコピーされました!
AWS VPC クラスターを Outpost に拡張して AWS Application Load Balancer をプロビジョニングするには、AWS Load Balancer Operator を設定します。AWS Outposts は AWS Network Load Balancer をサポートしていないため、Operator は AWS Network Load Balancer をプロビジョニングできないことに注意してください。
AWS Application Load Balancer は、クラウドサブネットか Outpost サブネットのどちらかに作成できます。
クラウド上のアプリケーションロードバランサーは、クラウドベースのコンピュートノードに接続できます。Outpost 内のアプリケーションロードバランサーは、エッジコンピュートノードに接続できます。
Ingress リソースには Outpost サブネットまたは VPC サブネットのアノテーションを付ける必要がありますが、両方を付けることはできません。
前提条件
- AWS VPC クラスターを Outpost に拡張した。
-
OpenShift CLI (
oc) がインストールされている。 - AWS Load Balancer Operator をインストールし、AWS Load Balancer Controller を作成した。
手順
指定のサブネットを使用するように
Ingressリソースを設定します。Ingressリソース設定の例apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: <application_name> annotations: alb.ingress.kubernetes.io/subnets: <subnet_id> spec: ingressClassName: alb rules: - http: paths: - path: / pathType: Exact backend: service: name: <application_name> port: number: 80ここでは、以下のようになります。
<subnet_id>- 使用するサブネットを指定します。Outpost で Application Load Balancer を使用するには、Outpost のサブネット ID を指定します。クラウドで Application Load Balancer を使用するには、別々のアベイラビリティーゾーンに少なくとも 2 つのサブネットを指定する必要があります。
2.3. AWS Load Balancer Operator 用に AWS STS クラスターを準備する リンクのコピーリンクがクリップボードにコピーされました!
Security Token Service (STS) を使用するクラスターに Amazon Web Services (AWS) ロードバランサー Operator をインストールするには、CredentialsRequest オブジェクトを設定してクラスターを準備します。これにより、Operator は AWS Load Balancer Controller を起動し、必要なシークレットにアクセスできるようになります。
AWS Load Balancer Operator は、必要なシークレットが作成されて利用可能になるまで待機します。
Security Token Service (STS) の手順を開始する前に、以下の前提条件を満たしていることを確認してください。
-
OpenShift CLI (
oc) がインストールされている。 クラスターのインフラストラクチャー ID がわかっている。この ID を表示するには、CLI で次のコマンドを実行します。
$ oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"クラスターの OpenID Connect (OIDC) の DNS 情報がわかっている。この情報を表示するには、CLI で次のコマンドを入力します。
$ oc get authentication.config cluster -o=jsonpath="{.spec.serviceAccountIssuer}"ここでは、以下のようになります。
{.spec.serviceAccountIssuer}-
OIDC DNS URL を指定します。URL の例は
https://rh-oidc.s3.us-east-1.amazonaws.com/28292va7ad7mr9r4he1fb09b14t59t4fです。
-
AWS 管理コンソールにログインし、IAM → アクセス管理 → アイデンティティープロバイダー に移動して、OIDC Amazon Resource Name (ARN) 情報を見つけました。OIDC の ARN の例は、
arn:aws:iam::777777777777:oidc-provider/<oidc_dns_url>です。
2.3.1. AWS Load Balancer Operator の IAM ロール リンクのコピーリンクがクリップボードにコピーされました!
STS を使用してクラスターに Amazon Web Services (AWS) ロードバランサー Operator をインストールするには、追加のアイデンティティーロールとアクセス管理 (IAM) ロールを設定します。このロールにより、Operator はサブネットおよび仮想プライベートクラウド (VPC) と連携できるようになり、オペレーターはブートストラップに必要な CredentialsRequest オブジェクトを生成できます。
IAM ロールは次の方法で作成できます。
-
Cloud Credential Operator ユーティリティー (
ccoctl) と、事前定義されたCredentialsRequestオブジェクトを使用します。 - AWS CLI と事前定義された AWS マニフェストを使用します。
環境が ccoctl コマンドをサポートしていない場合は、AWS CLI を使用します。
2.3.1.1. Cloud Credential Operator ユーティリティーを使用して AWS IAM ロールを作成する リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator がサブネットや VPC とやり取りできるようにするには、Cloud Credential Operator ユーティリティー (ccoctl) を使用して AWS IAM ロールを作成します。この作業を行うことで、オペレーターがクラスター環境内で正しく機能するために必要な認証情報を生成できます。
前提条件
-
ccoctlバイナリーを抽出して準備する必要があります。
手順
次のコマンドを実行して、
CredentialsRequestカスタムリソース (CR) をダウンロードし、ディレクトリーに保存します。$ curl --create-dirs -o <credentials_requests_dir>/operator.yaml https://raw.githubusercontent.com/openshift/aws-load-balancer-operator/main/hack/operator-credentials-request.yamlccoctlユーティリティーを使用して次のコマンドを実行し、AWS IAM ロールを作成します。$ ccoctl aws create-iam-roles \ --name <name> \ --region=<aws_region> \ --credentials-requests-dir=<credentials_requests_dir> \ --identity-provider-arn <oidc_arn>出力例
2023/09/12 11:38:57 Role arn:aws:iam::777777777777:role/<name>-aws-load-balancer-operator-aws-load-balancer-operator created 2023/09/12 11:38:57 Saved credentials configuration to: /home/user/<credentials_requests_dir>/manifests/aws-load-balancer-operator-aws-load-balancer-operator-credentials.yaml 2023/09/12 11:38:58 Updated Role policy for Role <name>-aws-load-balancer-operator-aws-load-balancer-operator createdここでは、以下のようになります。
<name>AWS Load Balancer Operator 用に作成された AWS IAM ロールの Amazon Resource Name (ARN) を指定します。例
: arn:aws:iam::777777777777:role/<name>-aws-load-balancer-operator-aws-load-balancer-operator。注記AWS IAM ロール名の長さは 12 文字以下にする必要があります。
2.3.1.2. AWS CLI を使用して AWS IAM ロールを作成する リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator がサブネットおよび VPC と連携できるようにするには、AWS CLI を使用して AWS IAM ロールを作成します。これにより、Operator はクラスター内の必要なネットワークリソースにアクセスし、管理できるようになります。
前提条件
-
AWS コマンドラインインターフェイス (
aws) にアクセスできる。
手順
次のコマンドを実行して、アイデンティティープロバイダーを使用して信頼ポリシーファイルを生成します。
$ cat <<EOF > albo-operator-trust-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "<oidc_arn>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "<cluster_oidc_endpoint>:sub": "system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-operator-controller-manager" } } } ] } EOFここでは、以下のようになります。
<oidc_arn>-
OIDC アイデンティティープロバイダーの Amazon Resource Name (ARN) (例:
arn:aws:iam::777777777777:oidc-provider/rh-oidc.s3.us-east-1.amazonaws.com/28292va7ad7mr9r4he1fb09b14t59t4f) を指定します。 serviceaccount-
AWS Load Balancer Controller のサービスアカウントを指定します。
<cluster_oidc_endpoint>の例は、rh-oidc.s3.us-east-1.amazonaws.com/28292va7ad7mr9r4he1fb09b14t59t4fです。
次のコマンドを実行して、生成された信頼ポリシーを使用して IAM ロールを作成します。
$ aws iam create-role --role-name albo-operator --assume-role-policy-document file://albo-operator-trust-policy.json出力例
ROLE arn:aws:iam::<aws_account_number>:role/albo-operator 2023-08-02T12:13:22Z1 ASSUMEROLEPOLICYDOCUMENT 2012-10-17 STATEMENT sts:AssumeRoleWithWebIdentity Allow STRINGEQUALS system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-controller-manager PRINCIPAL arn:aws:iam:<aws_account_number>:oidc-provider/<cluster_oidc_endpoint>ここでは、以下のようになります。
<aws_account_number>-
AWS Load Balancer Operator 用に作成された AWS IAM ロールの ARN を指定します。例
: arn:aws:iam::777777777777:role/albo-operator。
次のコマンドを実行して、AWS Load Balancer Operator の権限ポリシーをダウンロードします。
$ curl -o albo-operator-permission-policy.json https://raw.githubusercontent.com/openshift/aws-load-balancer-operator/main/hack/operator-permission-policy.json次のコマンドを実行して、AWS Load Balancer Controller の権限ポリシーを IAM ロールに割り当てます。
$ aws iam put-role-policy --role-name albo-operator --policy-name perms-policy-albo-operator --policy-document file://albo-operator-permission-policy.json
2.3.2. AWS Load Balancer Operator 用の ARN ロールの設定 リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator を認証するには、CLI を使用して Amazon Resource Name (ARN) ロールを環境変数として設定します。これにより、Operator はクラスター内のリソースを管理するために必要な権限を確実に取得できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。
手順
次のコマンドを実行して、
aws-load-balancer-operatorプロジェクトを作成します。$ oc new-project aws-load-balancer-operator以下のコマンドを実行して
OperatorGroupオブジェクトを作成します。$ cat <<EOF | oc apply -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: aws-load-balancer-operator namespace: aws-load-balancer-operator spec: targetNamespaces: [] EOF以下のコマンドを実行して
Subscriptionオブジェクトを作成します。$ cat <<EOF | oc apply -f - apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: aws-load-balancer-operator namespace: aws-load-balancer-operator spec: channel: stable-v1 name: aws-load-balancer-operator source: redhat-operators sourceNamespace: openshift-marketplace config: env: - name: ROLEARN value: "<albo_role_arn>" EOFここでは、以下のようになります。
<albo_role_arn>AWS Load Balancer Operator の AWS 認証情報をプロビジョニングするために
CredentialsRequestで使用する ARN ロールを指定します。<albo_role_arn>の例は、arn:aws:iam::<aws_account_number>:role/albo-operatorです。注記AWS Load Balancer Operator は、シークレットが作成されるまで待機してから、
Availableステータスに移行します。
2.3.3. AWS Load Balancer Controller の IAM ロール リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Controller を認証するには、手動でプロビジョニングした IAM ロールを使用して CredentialsRequest オブジェクトを設定します。これにより、手動プロビジョニングプロセスで定義された特定の権限を使用して、コントローラーが正しく機能することが保証されます。
IAM ロールは次の方法で作成できます。
-
Cloud Credential Operator ユーティリティー (
ccoctl) と、事前定義されたCredentialsRequestオブジェクトを使用します。 - AWS CLI と事前定義された AWS マニフェストを使用します。
お使いの環境が ccoctl command.ws-short CLI をサポートしていない場合は、AWS CLI を使用してください。
2.3.3.1. Cloud Credential Operator ユーティリティーを使用してコントローラー用の AWS IAM ロールを作成する リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Controller がサブネットや VPC とやり取りできるようにするには、Cloud Credential Operator ユーティリティー (ccoctl) を使用して IAM ロールを作成します。このユーティリティーは、コントローラーがクラスター内のネットワークリソースを管理するために必要な特定の権限を持っていることを保証します。
前提条件
-
ccoctlバイナリーを抽出して準備する必要があります。
手順
次のコマンドを実行して、
CredentialsRequestカスタムリソース (CR) をダウンロードし、ディレクトリーに保存します。$ curl --create-dirs -o <credentials_requests_dir>/controller.yaml https://raw.githubusercontent.com/openshift/aws-load-balancer-operator/main/hack/controller/controller-credentials-request.yamlccoctlユーティリティーを使用して次のコマンドを実行し、AWS IAM ロールを作成します。$ ccoctl aws create-iam-roles \ --name <name> \ --region=<aws_region> \ --credentials-requests-dir=<credentials_requests_dir> \ --identity-provider-arn <oidc_arn>出力例
2023/09/12 11:38:57 Role arn:aws:iam::777777777777:role/<name>-aws-load-balancer-operator-aws-load-balancer-controller created 2023/09/12 11:38:57 Saved credentials configuration to: /home/user/<credentials_requests_dir>/manifests/aws-load-balancer-operator-aws-load-balancer-controller-credentials.yaml 2023/09/12 11:38:58 Updated Role policy for Role <name>-aws-load-balancer-operator-aws-load-balancer-controller createdここでは、以下のようになります。
<name>AWS Load Balancer Controller 用に作成された AWS IAM ロールの Amazon Resource Name (ARN) を指定します。例
: arn:aws:iam::777777777777:role/<name>-aws-load-balancer-operator-aws-load-balancer-controller。注記AWS IAM ロール名の長さは 12 文字以下にする必要があります。
2.3.3.2. AWS CLI を使用してコントローラー用の AWS IAM ロールを作成する リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Controller がサブネットおよび仮想プライベートクラウド (VPC) と連携できるようにするには、AWS CLI を使用して IAM ロールを作成します。これにより、コントローラーがクラスター内のネットワークリソースを管理するために必要な特定の権限を確実に取得できます。
前提条件
-
AWS コマンドラインインターフェイス (
aws) にアクセスできる。
手順
次のコマンドを実行して、アイデンティティプロバイダーを使用して信頼ポリシーファイルを生成します。
$ cat <<EOF > albo-controller-trust-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "<oidc_arn>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "<cluster_oidc_endpoint>:sub": "system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-operator-controller-manager" } } } ] } EOFここでは、以下のようになります。
<oidc_arn>-
OIDC アイデンティティープロバイダーの Amazon Resource Name (ARN) (例:
arn:aws:iam::777777777777:oidc-provider/rh-oidc.s3.us-east-1.amazonaws.com/28292va7ad7mr9r4he1fb09b14t59t4f) を指定します。 serviceaccount-
AWS Load Balancer Controller のサービスアカウントを指定します。
<cluster_oidc_endpoint>の例は、rh-oidc.s3.us-east-1.amazonaws.com/28292va7ad7mr9r4he1fb09b14t59t4fです。
次のコマンドを実行して、生成された信頼ポリシーを使用して AWS IAM ロールを作成します。
$ aws iam create-role --role-name albo-controller --assume-role-policy-document file://albo-controller-trust-policy.json出力例
ROLE arn:aws:iam::<aws_account_number>:role/albo-controller 2023-08-02T12:13:22Z1 ASSUMEROLEPOLICYDOCUMENT 2012-10-17 STATEMENT sts:AssumeRoleWithWebIdentity Allow STRINGEQUALS system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-operator-controller-manager PRINCIPAL arn:aws:iam:<aws_account_number>:oidc-provider/<cluster_oidc_endpoint>ここでは、以下のようになります。
<aws_account_number>-
AWS Load Balancer Controller の AWS IAM ロールの ARN を指定します。例
: arn:aws:iam::777777777777:role/albo-controller。
次のコマンドを実行して、AWS Load Balancer Controller の権限ポリシーをダウンロードします。
$ curl -o albo-controller-permission-policy.json https://raw.githubusercontent.com/openshift/aws-load-balancer-operator/main/assets/iam-policy.json次のコマンドを実行して、AWS Load Balancer Controller の権限ポリシーを AWS IAM ロールに割り当てます。
$ aws iam put-role-policy --role-name albo-controller --policy-name perms-policy-albo-controller --policy-document file://albo-controller-permission-policy.jsonAWSLoadBalancerControllerオブジェクトを定義する YAML ファイルを作成します。sample-aws-lb-manual-creds.yamlファイルの例apiVersion: networking.olm.openshift.io/v1 kind: AWSLoadBalancerController metadata: name: cluster spec: credentialsRequestConfig: stsIAMRoleARN: <albc_role_arn>ここでは、以下のようになります。
kind-
AWSLoadBalancerControllerオブジェクトを指定します。 メタデータ名- AWS Load Balancer Controller の名前を指定します。このインスタンス名は、関連するすべてのリソースの接尾辞として使用されます。
stsIAMRoleARN-
AWS Load Balancer Controller の ARN ロールを指定します。
CredentialsRequestオブジェクトは、この ARN ロールを使用して AWS 認証情報をプロビジョニングします。<albc_role_arn>の例は、arn:aws:iam::777777777777:role/albo-controllerです。
2.4. AWS Load Balancer Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator は、AWS Load Balancer Controller をデプロイおよび管理します。OpenShift Container Platform Web コンソールまたは CLI を使用して、ソフトウェアカタログから AWS Load Balancer Operator をインストールできます。
2.4.1. Web コンソールを使用した AWS Load Balancer Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator をデプロイするには、Web コンソールを使用して Operator をインストールします。グラフィカルインターフェイスを使用して、Operator のライフサイクルを管理できます。
前提条件
-
cluster-admin権限を持つユーザーとして OpenShift Container Platform Web コンソールにログインしている。 - クラスターのプラットフォームタイプとクラウドプロバイダーが AWS に設定されている。
- セキュリティートークンサービス (STS) または user-provisioned infrastructure を使用している場合は、関連する準備手順に従います。たとえば、AWS Security Token Service を使用している場合は、「AWS Security Token Service (STS) を使用してクラスター上で AWS Load Balancer Operator を準備する」を参照してください。
手順
- OpenShift Container Platform Web コンソールで、Ecosystem → Software Catalog に移動します。
- AWS Load Balancer Operator を選択します。キーワードによるフィルタリング テキストボックスまたはフィルターリストを使用して、Operator のリストから AWS Load Balancer Operator を検索できます。
-
aws-load-balancer-operatornamespace を選択します。 Install Operator ページで、次のオプションを選択します。
- チャネルを更新する オプションでは、stable-v1 を選択してください。
- インストールモードの オプションでは、クラスター上のすべての名前空間 (デフォルト) を選択します。
-
インストール済み名前空間 必要に応じて、
aws-load-balancer-operatorを選択します。aws-load-balancer-operatornamespace が存在しない場合は、Operator のインストール中に作成されます。 - Update approval で Automatic または Manual を選択します。デフォルトでは、Update approval は Automatic に設定されています。Automatic (自動) 更新を選択した場合、Operator Lifecycle Manager (OLM) は介入なしに、Operator の実行中のインスタンスを自動的にアップグレードします。手動更新を選択した場合、OLM は更新要求を作成します。クラスター管理者として、Operator を新しいバージョンにアップデートするには、そのアップデート要求を手動で承認する必要があります。
- Install をクリックします。
検証
- AWS Load Balancer Operator で、インストール済み Operator ダッシュボードの Status が Succeeded と表示されることを確認します。
2.4.2. CLI を使用した AWS Load Balancer Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Controller をデプロイするには、コマンドラインインターフェイス (CLI) を使用して AWS Load Balancer Operator をインストールします。
前提条件
-
cluster-admin権限を持つユーザーとして OpenShift Container Platform Web コンソールにログインしている。 - クラスターのプラットフォームタイプとクラウドプロバイダーが AWS に設定されている。
-
OpenShift CLI (
oc) にログインしている。
手順
Namespaceオブジェクトを作成します。Namespaceオブジェクトを定義する YAML ファイルを作成します。namespace.yamlファイルの例apiVersion: v1 kind: Namespace metadata: name: aws-load-balancer-operator # ...次のコマンドを実行して、
Namespaceオブジェクトを作成します。$ oc apply -f namespace.yaml
OperatorGroupオブジェクトを作成します。OperatorGroupオブジェクトを定義する YAML ファイルを作成します。operatorgroup.yamlファイルの例apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: aws-lb-operatorgroup namespace: aws-load-balancer-operator spec: upgradeStrategy: Default以下のコマンドを実行して
OperatorGroupオブジェクトを作成します。$ oc apply -f operatorgroup.yaml
Subscriptionオブジェクトを作成します。Subscriptionオブジェクトを定義する YAML ファイルを作成します。subscription.yamlファイルの例apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: aws-load-balancer-operator namespace: aws-load-balancer-operator spec: channel: stable-v1 installPlanApproval: Automatic name: aws-load-balancer-operator source: redhat-operators sourceNamespace: openshift-marketplace以下のコマンドを実行して
Subscriptionオブジェクトを作成します。$ oc apply -f subscription.yaml
検証
サブスクリプションからインストールプランの名前を取得します。
$ oc -n aws-load-balancer-operator \ get subscription aws-load-balancer-operator \ --template='{{.status.installplan.name}}{{"\n"}}'インストールプランのステータスを確認します。
$ oc -n aws-load-balancer-operator \ get ip <install_plan_name> \ --template='{{.status.phase}}{{"\n"}}'出力は
Completeでなければなりません。
2.4.3. AWS Load Balancer Controller の作成 リンクのコピーリンクがクリップボードにコピーされました!
クラスターにインストールできる AWSLoadBalancerController オブジェクトのインスタンスは 1 つだけです。CLI を使用して AWS Load Balancer Controller を作成できます。AWS Load Balancer Operator は、cluster という名前のリソースのみを調整します。
前提条件
-
echoservernamespace を作成している。 -
OpenShift CLI (
oc) にアクセスできる。
手順
AWSLoadBalancerControllerオブジェクトを定義する YAML ファイルを作成します。sample-aws-lb.yamlファイルの例apiVersion: networking.olm.openshift.io/v1 kind: AWSLoadBalancerController metadata: name: cluster spec: subnetTagging: Auto additionalResourceTags: - key: example.org/security-scope value: staging ingressClass: alb config: replicas: 2 enabledAddons: - AWSWAFv2ここでは、以下のようになります。
kind-
AWSLoadBalancerControllerオブジェクトを指定します。 metadata.name- AWS Load Balancer Controller の名前を指定します。Operator は、このインスタンス名を関連するすべてのリソースの接尾辞として追加します。
仕様サブネットタグ付けAWS Load Balancer Controller のサブネットタグ付け方法を指定します。次の値が有効です。
-
Auto: AWS Load Balancer Operator は、クラスターに属するサブネットを決定し、適切にタグ付けします。内部サブネットタグが内部サブネットに存在しない場合、Operator はロールを正しく判別できません。 -
Manual: クラスターに属するサブネットに適切なロールタグを手動でタグ付けします。ユーザー提供のインフラストラクチャーにクラスターをインストールした場合は、このオプションを使用します。
-
spec.additionalResourceTags- AWS Load Balancer Controller が AWS リソースをプロビジョニングする際に使用するタグを指定します。
ingressClass-
Ingress クラス名を指定します。デフォルト値は
albです。 config.replicas- AWS Load Balancer Controller のレプリカの数を指定します。
有効なアドオン- AWS Load Balancer Controller のアドオンとしてアノテーションを指定します。
AWSWAFv2-
alb.ingress.kubernetes.io/wafv2-acl-arnアノテーションの有効化を指定します。
次のコマンドを実行して、
AWSLoadBalancerControllerオブジェクトを作成します。$ oc create -f sample-aws-lb.yamlDeploymentリソースを定義する YAML ファイルを作成します。sample-aws-lb.yamlファイルの例apiVersion: apps/v1 kind: Deployment metadata: name: <echoserver> namespace: echoserver spec: selector: matchLabels: app: echoserver replicas: 3 template: metadata: labels: app: echoserver spec: containers: - image: openshift/origin-node command: - "/bin/socat" args: - TCP4-LISTEN:8080,reuseaddr,fork - EXEC:'/bin/bash -c \"printf \\\"HTTP/1.0 200 OK\r\n\r\n\\\"; sed -e \\\"/^\r/q\\\"\"' imagePullPolicy: Always name: echoserver ports: - containerPort: 8080ここでは、以下のようになります。
kind- デプロイメントリソースを指定します。
metadata.name- デプロイメント名を指定します。
spec.replicas- デプロイメントのレプリカの数を指定します。
Serviceリソースを定義する YAML ファイルを作成します。service-albo.yamlファイルの例apiVersion: v1 kind: Service metadata: name: <echoserver> namespace: echoserver spec: ports: - port: 80 targetPort: 8080 protocol: TCP type: NodePort selector: app: echoserverここでは、以下のようになります。
apiVersion- サービスリソースを指定します。
metadata.name- サービス名を指定します。
Ingressリソースを定義する YAML ファイルを作成します。Ingress-albo.yamlファイルの例apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: <name> namespace: echoserver annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: instance spec: ingressClassName: alb rules: - http: paths: - path: / pathType: Exact backend: service: name: <echoserver> port: number: 80ここでは、以下のようになります。
metadata.name-
Ingressリソースの名前を指定します。 service.name- サービス名を指定します。
検証
次のコマンドを実行して、
IngressリソースのステータスをHOST変数に保存します。$ HOST=$(oc get ingress -n echoserver echoserver --template='{{(index .status.loadBalancer.ingress 0).hostname}}')次のコマンドを実行して、
Ingressリソースのステータスを確認します。$ curl $HOST
2.5. AWS Load Balancer Operator の設定 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーション用の AWS ロードバランサーのプロビジョニングを自動化するには、AWS Load Balancer Operator を設定します。この設定により、Operator がイングレスリソースとクラスターへの外部アクセスを正しく管理することが保証されます。
2.5.1. クラスター全体のプロキシーの認証局を信頼する リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator でクラスター全体のプロキシーを設定できます。クラスター全体のプロキシーを設定すると、Operator Lifecycle Manager (OLM) は環境変数を使用して、Operator のすべてのデプロイメントを自動的に更新します。
環境変数には 、HTTP_PROXY、HTTPS_PROXY、および NO_PROXY が含まれます。これらの変数は、AWS Load Balancer Operator によってマネージドコントローラーに入力されます。
手順
次のコマンドを実行して、
aws-load-balancer-operatornamespace に認証局 (CA) バンドルを含める config map を作成します。$ oc -n aws-load-balancer-operator create configmap trusted-ca信頼できる CA バンドルを config map に挿入するには、次のコマンドを実行して、
config.openshift.io/inject-trusted-cabundle=trueラベルを config map に追加します。$ oc -n aws-load-balancer-operator label cm trusted-ca config.openshift.io/inject-trusted-cabundle=true次のコマンドを実行して、AWS Load Balancer Operator デプロイメントの config map にアクセスできるように AWS Load Balancer Operator サブスクリプションを更新します。
$ oc -n aws-load-balancer-operator patch subscription aws-load-balancer-operator --type='merge' -p '{"spec":{"config":{"env":[{"name":"TRUSTED_CA_CONFIGMAP_NAME","value":"trusted-ca"}],"volumes":[{"name":"trusted-ca","configMap":{"name":"trusted-ca"}}],"volumeMounts":[{"name":"trusted-ca","mountPath":"/etc/pki/tls/certs/albo-tls-ca-bundle.crt","subPath":"ca-bundle.crt"}]}}}'AWS Load Balancer Operator がデプロイされたら、次のコマンドを実行して、CA バンドルが
aws-load-balancer-operator-controller-managerデプロイメントに追加されていることを確認します。$ oc -n aws-load-balancer-operator exec deploy/aws-load-balancer-operator-controller-manager -c manager -- bash -c "ls -l /etc/pki/tls/certs/albo-tls-ca-bundle.crt; printenv TRUSTED_CA_CONFIGMAP_NAME"出力例
-rw-r--r--. 1 root 1000690000 5875 Jan 11 12:25 /etc/pki/tls/certs/albo-tls-ca-bundle.crt trusted-caオプション: config-map が変更されるたびに、次のコマンドを実行して、AWS Load Balancer Operator のデプロイを再開します。
$ oc -n aws-load-balancer-operator rollout restart deployment/aws-load-balancer-operator-controller-manager
2.5.2. AWS Load Balancer への TLS Termination の追加 リンクのコピーリンクがクリップボードにコピーされました!
ドメインのトラフィックを保護するには、AWS ロードバランサーで TLS 終端を設定してください。この設定では、トラフィックをサービスの Pod にルーティングすると同時に、暗号化された接続がロードバランサーのレベルで復号化されることを保証します。
前提条件
-
OpenShift CLI (
oc) にアクセスできる。
手順
AWSLoadBalancerControllerリソースを定義する YAML ファイルを作成します。add-tls-termination-albc.yamlファイルの例apiVersion: networking.olm.openshift.io/v1 kind: AWSLoadBalancerController metadata: name: cluster spec: subnetTagging: Auto ingressClass: tls-termination # ...ここでは、以下のようになります。
spec.ingressClass-
Ingress クラス名を指定します。クラスター内に Ingress クラスが存在しない場合は、AWS Load Balancer Controller によって作成されます。
spec.controllerがingress.k8s.aws/albに設定されている場合、AWS Load Balancer Controller は追加の Ingress クラス値を調整します。
Ingressリソースを定義する YAML ファイルを作成します。add-tls-termination-ingress.yamlファイルの例apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: <example> annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:xxxxx spec: ingressClassName: tls-termination rules: - host: example.com http: paths: - path: / pathType: Exact backend: service: name: <example_service> port: number: 80 # ...ここでは、以下のようになります。
metadata.name- Ingress 名を指定します。
annotations.alb.ingress.kubernetes.io/scheme- Ingress 用のロードバランサーをプロビジョニングするコントローラーを指定します。プロビジョニングは、インターネット経由でロードバランサーにアクセスするためのパブリックサブネットで行われます。
annotations.alb.ingress.kubernetes.io/certificate-arn- ロードバランサーにアタッチする証明書の Amazon Resource Name (ARN) を指定します。
spec.ingressClassName- Ingress クラス名を指定します。
ルールホスト- トラフィックルーティングのドメインを指定します。
バックエンドサービス- トラフィックルーティングに使用するサービスを指定します。
2.5.3. 1 つの AWS ロードバランサーを介して複数の Ingress リソースを作成する リンクのコピーリンクがクリップボードにコピーされました!
単一ドメイン内の異なるサービスにトラフィックをルーティングするには、単一の AWS ロードバランサー上に複数のイングレスリソースを設定します。この設定により、各リソースは同じ負荷分散インフラストラクチャーを共有しながら、異なるエンドポイントを提供できるようになります。
前提条件
-
OpenShift CLI (
oc) にアクセスできる。
手順
次のように、
IngressClassParamsリソースの YAML ファイル (例:sample-single-lb-params.yaml) を作成します。apiVersion: elbv2.k8s.aws/v1beta1 kind: IngressClassParams metadata: name: single-lb-params spec: group: name: single-lbここでは、以下のようになります。
apiVersion-
IngressClassParamsリソースの API グループとバージョンを指定します。 metadata.name-
IngressClassParamsリソース名を指定します。 仕様グループ名-
IngressGroupリソース名を指定します。このクラスのすべてのIngressリソースは、このIngressGroupに属します。
次のコマンドを実行して、
IngressClassParamsリソースを作成します。$ oc create -f sample-single-lb-params.yaml次のように、
IngressClassリソースの YAML ファイル (例:sample-single-lb-class.yaml) を作成します。apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: single-lb spec: controller: ingress.k8s.aws/alb parameters: apiGroup: elbv2.k8s.aws kind: IngressClassParams name: single-lb-paramsここでは、以下のようになります。
apiVersion-
IngressClassリソースの API グループとバージョンを指定します。 metadata.name- Ingress クラス名を指定します。
仕様コントローラー-
コントローラー名を指定します。
ingress.k8s.aws/albという値は、このクラスのすべての Ingress リソースを AWS Load Balancer Controller によって管理することを意味します。 パラメーター.apiGroup-
IngressClassParamsリソースの API グループを指定します。 パラメーターの種類-
IngressClassParamsリソースのリソースタイプを指定します。 パラメーター名-
IngressClassParamsリソース名を指定します。
次のコマンドを実行して
IngressClassリソースを作成します。$ oc create -f sample-single-lb-class.yaml次のように、
AWSLoadBalancerControllerリソース YAML ファイル (例:sample-single-lb.yaml) を作成します。apiVersion: networking.olm.openshift.io/v1 kind: AWSLoadBalancerController metadata: name: cluster spec: subnetTagging: Auto ingressClass: single-lbここでは、以下のようになります。
spec.ingressClass-
IngressClassリソースの名前を指定します。
次のコマンドを実行して、
AWSLoadBalancerControllerリソースを作成します。$ oc create -f sample-single-lb.yaml次のように、
Ingressリソースの YAML ファイル (例:sample-multiple-ingress.yaml) を作成します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-1 annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/group.order: "1" alb.ingress.kubernetes.io/target-type: instance spec: ingressClassName: single-lb rules: - host: example.com http: paths: - path: /blog pathType: Prefix backend: service: name: example-1 port: number: 80 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-2 annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/group.order: "2" alb.ingress.kubernetes.io/target-type: instance spec: ingressClassName: single-lb rules: - host: example.com http: paths: - path: /store pathType: Prefix backend: service: name: example-2 port: number: 80 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-3 annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/group.order: "3" alb.ingress.kubernetes.io/target-type: instance spec: ingressClassName: single-lb rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: example-3 port: number: 80ここでは、以下のようになります。
metadata.name- Ingress 名を指定します。
alb.ingress.kubernetes.io/scheme- インターネットにアクセスするために、パブリックサブネットにプロビジョニングするロードバランサーを指定します。
alb.ingress.kubernetes.io/group.order- ロードバランサーで要求を受信したときに、複数の Ingress リソースからのルールをマッチする順序を指定します。
alb.ingress.kubernetes.io/target-type- ロードバランサーがサービスに到達するために、OpenShift Container Platform ノードをターゲットにすることを指定します。
spec.ingressClassName- この Ingress に属する Ingress クラスを指定します。
ルールホスト- リクエストルーティングに使用するドメイン名を指定します。
http.paths.path- サービスへのルーティングに必要なパスを指定します。
バックエンドサービス名-
Ingressリソースで設定されたエンドポイントにサービスを提供するサービス名を指定します。 ポート番号- エンドポイントを提供するサービスのポートを指定します。
次のコマンドを実行して
Ingressリソースを作成します。$ oc create -f sample-multiple-ingress.yaml
2.5.4. AWS Load Balancer Operator ログ リンクのコピーリンクがクリップボードにコピーされました!
AWS Load Balancer Operator のトラブルシューティングを行うには、oc logs コマンドを使用してログを表示します。ログを確認することで、問題の診断や Operator の活動状況の監視が可能になります。
手順
次のコマンドを実行して、AWS Load Balancer Operator のログを表示します。
$ oc logs -n aws-load-balancer-operator deployment/aws-load-balancer-operator-controller-manager -c manager
第3章 eBPF マネージャー Operator リンクのコピーリンクがクリップボードにコピーされました!
3.1. eBPF Manager Operator について リンクのコピーリンクがクリップボードにコピーされました!
eBPF Manager Operator を使用すると、Kubernetes クラスターにおける eBPF プログラムのデプロイメントを一元化し、セキュリティーを確保できます。eBPF Manager Operator は、ライフサイクル管理を効率化し、システム全体の可視性を提供することで、手動設定ではなくプログラムとの連携に集中できるようにします。
eBPF Manager Operator はテクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
3.1.1. eBPF (Extended Berkeley Packet Filter) について リンクのコピーリンクがクリップボードにコピーされました!
eBPF は、高度なネットワークトラフィックフィルタリングを実現するために、オリジナルの Berkeley Packet Filter を拡張します。これは Linux カーネル内の仮想マシンとして機能し、ネットワークパケット、システムコール、カーネル関数などのイベントに応じてサンドボックス化されたプログラムを実行できるようにします。
3.1.2. eBPF Manager Operator について リンクのコピーリンクがクリップボードにコピーされました!
eBPF Manager は、Kubernetes 内での eBPF プログラムの管理とデプロイメントを簡素化し、eBPF プログラムの使用に関するセキュリティーを強化します。Kubernetes カスタムリソース定義 (CRD) を使用して、OCI コンテナーイメージとしてパッケージ化された eBPF プログラムを管理します。このアプローチは、特定のユーザーが展開できるプログラムの種類を制限することで、デプロイメント権限を明確にし、セキュリティーを強化するのに役立ちます。
eBPF Manager は、Kubernetes 内で eBPF プログラムを管理するために設計されたソフトウェアスタックです。Kubernetes クラスター内の eBPF プログラムのロード、アンロード、変更、監視を容易にします。デーモン、CRD、エージェント、Operator が含まれます。
- bpfman
- gRPC API を介して eBPF プログラムを管理するシステムデーモン。
- eBPF CRDs
- eBPF プログラムをロードするための XdpProgram や TcProgram などの CRD のセットと、ロードされたプログラムの状態を表すための bpfman によって生成された CRD (BpfProgram)。
- bpfman-agent
- デーモンセットコンテナー内で実行し、各ノード上の eBPF プログラムが目的の状態にあることを確認する。
- bpfman-operator
- Operator SDK を使用して、クラスター内の bpfman-agent と CRD のライフサイクルを管理します。
eBPF Manager Operator は次の機能を提供します。
- 制御されたデーモンを通じて eBPF プログラムのロードを一元化することで、セキュリティーを強化します。eBPF Manager には昇格された権限があるため、アプリケーションに昇格された権限は必要ありません。eBPF プログラム制御は、標準の Kubernetes ロールベースアクセス制御 (RBAC) によって規制され、eBPF プログラムのロードとアンロードを管理するさまざまな eBPF マネージャー CRD へのアプリケーションのアクセスを許可または拒否できます。
- アクティブな eBPF プログラムの詳細な可視性を提供し、システム全体の問題をデバッグする能力を向上させます。
- XDP および TC プログラム用の libxdp などのプロトコルを使用して、異なるソースからの複数の eBPF プログラムの共存を容易にし、相互運用性を強化します。
- Kubernetes での eBPF プログラムのデプロイメントとライフサイクル管理を合理化します。Cilium、libbpf、Aya などの既存の eBPF ライブラリーをサポートしているため、開発者はライフサイクル管理ではなくプログラムのやり取りに集中できます。
3.2. eBPF Manager Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
クラスターノード全体で eBPF プログラムを管理するには、OpenShift Container Platform CLI または Web コンソールを使用して eBPF Manager Operator をインストールできます。このオペレータは、eBPF ベースのネットワークツールとオブザーバビリティーツールの展開、監視、およびセキュリティー確保のための標準化された方法を提供します。
eBPF Manager Operator はテクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
3.2.1. CLI を使用して eBPF Manager Operator をインストールする リンクのコピーリンクがクリップボードにコピーされました!
クラスターノード全体で eBPF プログラムを管理するには、OpenShift Container Platform CLI を使用して eBPF Manager Operator をインストールできます。このプロセスでは、専用のネームスペースを作成し、Operator に登録することで、ノードレベルのネットワーク機能とオブザーバビリティーツールを有効にします。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - 管理者権限を持つアカウントがある。
手順
bpfmannamespace を作成するには、次のコマンドを入力します。$ cat << EOF| oc create -f - apiVersion: v1 kind: Namespace metadata: labels: pod-security.kubernetes.io/enforce: privileged pod-security.kubernetes.io/enforce-version: v1.24 name: bpfman EOFOperatorGroupCR を作成するには、以下のコマンドを実行します。$ cat << EOF| oc create -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: bpfman-operators namespace: bpfman EOFeBPF Manager Operator にサブスクライブします。
eBPF Manager Operator の
SubscriptionCR を作成するには、次のコマンドを実行します。$ cat << EOF| oc create -f - apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: bpfman-operator namespace: bpfman spec: name: bpfman-operator channel: alpha source: community-operators sourceNamespace: openshift-marketplace EOF
Operator がインストールされていることを確認するには、以下のコマンドを入力します。
$ oc get ip -n bpfman出力例
NAME CSV APPROVAL APPROVED install-ppjxl security-profiles-operator.v0.8.5 Automatic trueOperator のバージョンを確認するには、次のコマンドを入力します。
$ oc get csv -n bpfman出力例
NAME DISPLAY VERSION REPLACES PHASE bpfman-operator.v0.5.0 eBPF Manager Operator 0.5.0 bpfman-operator.v0.4.2 Succeeded
3.2.2. Web コンソールを使用して eBPF Manager Operator をインストールする リンクのコピーリンクがクリップボードにコピーされました!
クラスターノード全体で eBPF プログラムを管理するには、OpenShift Container Platform の Web コンソールを使用して eBPF Manager Operator をインストールできます。eBPF Manager Operator を使用すると、OperatorHub インターフェイスを介してノードレベルのネットワークおよびオブザーバビリティーツールを有効にできます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - 管理者権限を持つアカウントがある。
手順
eBPF Manager Operator をインストールします。
- OpenShift Container Platform Web コンソールで、Ecosystem → Software Catalog をクリックします。
- 利用可能な Operator のリストから eBPF Manager Operator を選択し、コミュニティー Operator を表示する ように求められたら、Continue をクリックします。
- Install をクリックします。
- Install Operator ページの Installed Namespace で、Operator recommended Namespace を選択します。
- Install をクリックします。
eBPF Manager Operator が正常にインストールされていることを確認します。
- Ecosystem → Installed Operators ページに移動します。
eBPF Manager Operator が、Status が InstallSucceeded で openshift-ingress-node-firewall プロジェクトにリストされていることを確認します。
注記インストール時に、Operator は Failed ステータスを表示する可能性があります。インストールが後に InstallSucceeded メッセージを出して正常に実行される場合は、Failed メッセージを無視できます。
Operator の Status が InstallSucceeded でない場合は、次の手順を使用してトラブルシューティングを行います。
- Operator Subscriptions および Install Plans タブで、Status の下の失敗またはエラーの有無を確認します。
-
Workloads → Pods ページに移動し、
bpfmanプロジェクト内の Pod のログを確認します。
3.3. eBPF プログラムのデプロイ リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者として、eBPF Manager Operator を使用してコンテナー化された eBPF アプリケーションをデプロイできます。このプロセスでは、カスタムリソースを介して eBPF プログラムをロードし、特権権限を必要とせずに eBPF マップにアクセスするユーザー空間デーモンセットをデプロイします。
クラスター管理者は、eBPF Manager Operator を使用してコンテナー化された eBPF アプリケーションをデプロイできます。
この手順でデプロイされるサンプル eBPF プログラムの場合、サンプルマニフェストは次のことを実行します。
まず、Namespace、ServiceAccount、ClusterRoleBinding などの基本的な Kubernetes オブジェクトを作成します。また、eBPF Manager が提供するカスタムリソース定義 (CRD) である XdpProgram オブジェクトも作成し、eBPF XDP プログラムをロードします。各プログラムタイプには独自の CRD がありますが、その機能は似ています。詳細は、Kubernetes での eBPF プログラムのロード を参照してください。
次に、eBPF プログラムが作成する eBPF マップを読み取るユーザー空間プログラムを実行するデーモンセットを作成します。この eBPF マップは、Container Storage Interface (CSI) ドライバーを使用してボリュームマウントされます。ホスト上でアクセスする代わりにコンテナー内の eBPF マップをボリュームマウントすることで、アプリケーション Pod は権限なしで eBPF マップにアクセスできます。CSI の設定方法の詳細は、Kubernetes での eBPF 対応アプリケーションのデプロイ を参照してください。
eBPF Manager Operator はテクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
3.3.1. コンテナー化された eBPF プログラムの導入 リンクのコピーリンクがクリップボードにコピーされました!
クラスターノード上でカスタムのネットワークロジックやセキュリティーロジックを実行するには、コンテナー化された eBPF プログラムをデプロイできます。コンテナー化された eBPF プログラムを使用すると、カーネルイベントを監視し、ノードレベルでネットワークトラフィックを効率的に管理できます。
クラスター管理者は、クラスター上のノードに eBPF プログラムをデプロイできます。この手順では、サンプルのコンテナー化された eBPF プログラムが go-xdp-counter namespace にインストールされます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - 管理者権限を持つアカウントがある。
- eBPF Manager Operator をインストールしている。
手順
マニフェストをダウンロードするには、次のコマンドを入力します。
$ curl -L https://github.com/bpfman/bpfman/releases/download/v0.5.1/go-xdp-counter-install-selinux.yaml -o go-xdp-counter-install-selinux.yamlサンプル eBPF アプリケーションをデプロイするには、次のコマンドを実行します。
$ oc create -f go-xdp-counter-install-selinux.yaml出力例
namespace/go-xdp-counter created serviceaccount/bpfman-app-go-xdp-counter created clusterrolebinding.rbac.authorization.k8s.io/xdp-binding created daemonset.apps/go-xdp-counter-ds created xdpprogram.bpfman.io/go-xdp-counter-example created selinuxprofile.security-profiles-operator.x-k8s.io/bpfman-secure createdeBPF サンプルアプリケーションが正常にデプロイされたことを確認するには、次のコマンドを実行します。
$ oc get all -o wide -n go-xdp-counter出力例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/go-xdp-counter-ds-4m9cw 1/1 Running 0 44s 10.129.0.92 ci-ln-dcbq7d2-72292-ztrkp-master-1 <none> <none> pod/go-xdp-counter-ds-7hzww 1/1 Running 0 44s 10.130.0.86 ci-ln-dcbq7d2-72292-ztrkp-master-2 <none> <none> pod/go-xdp-counter-ds-qm9zx 1/1 Running 0 44s 10.128.0.101 ci-ln-dcbq7d2-72292-ztrkp-master-0 <none> <none> NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR daemonset.apps/go-xdp-counter-ds 3 3 3 3 3 <none> 44s go-xdp-counter quay.io/bpfman-userspace/go-xdp-counter:v0.5.0 name=go-xdp-counterサンプル XDP プログラムが実行していることを確認するには、次のコマンドを実行します。
$ oc get xdpprogram go-xdp-counter-example出力例
NAME BPFFUNCTIONNAME NODESELECTOR STATUS go-xdp-counter-example xdp_stats {} ReconcileSuccessXDP プログラムがデータを収集していることを確認するには、次のコマンドを実行します。
$ oc logs <pod_name> -n go-xdp-counter<pod_name>を、go-xdp-counter-ds-4m9cwなどの XDP プログラム Pod の名前に置き換えます。出力例
2024/08/13 15:20:06 15016 packets received 2024/08/13 15:20:06 93581579 bytes received ...
第4章 External DNS Operator リンクのコピーリンクがクリップボードにコピーされました!
4.1. External DNS Operator のリリースノート リンクのコピーリンクがクリップボードにコピーされました!
External DNS Operator は、サービスとルートの名前解決を提供するために、外部 DNS を導入および管理します。これにより、外部 DNS プロバイダーはホスト名を OpenShift Container Platform リソースに直接解決できるようになります。
External DNS Operator は、x86_64 アーキテクチャーでのみサポートされます。
これらのリリースノートでは、OpenShift Container Platform の External DNS Operator の開発を追跡しています。
4.1.1. External DNS Operator1.3 リンクのコピーリンクがクリップボードにコピーされました!
External DNS Operator 1.3 のリリースノートには、すべての新機能と機能強化、注目すべき技術的変更点、以前のバージョンからの主要な修正点、および一般提供開始時点での既知のバグがまとめられています。
- External DNS Operator 1.3.2
External DNS Operator バージョン 1.3.2 では、以下のアドバイザリーを利用できます。
- External DNS Operator 1.3.1
External DNS Operator バージョン 1.3.1 では、以下のアドバイザリーを利用できます。
RHEA-2025:15598 Product Enhancement Advisory
この更新により、コンテナーのセキュリティーが強化されました。
- External DNS Operator 1.3.0
External DNS Operator バージョン 1.3.0 では、以下のアドバイザリーを利用できます。
RHEA-2024:8550 Product Enhancement Advisory
この更新には、アップストリームプロジェクトの 0.14.2 バージョンへのリベースが含まれています。
バグ修正:
- 以前は、ExternalDNS Operator が HCP クラスターにオペランドをデプロイできませんでした。今回のリリースでは、Operator はオペランドを実行可能かつ準備完了の状態でデプロイします。(リンク:https://issues.redhat.com/browse/OCPBUGS-37059[OCPBUGS-37059])
- 以前は、ExternalDNS Operator が RHEL 9 をビルドイメージまたはベースイメージとして使用していませんでした。このリリースでは、RHEL9 がベースです。(OCPBUGS-41683)
- 以前、godoc の Infoblox プロバイダーへのリンクが壊れていました。このリリースでは、godoc が改訂され正確になりました。リンクは削除されるか、GitHub のパーマリンクに置き換えられました。(OCPBUGS-36797)
4.1.2. External DNS Operator1.2 リンクのコピーリンクがクリップボードにコピーされました!
External DNS Operator 1.2 のリリースノートには、すべての新機能と機能強化、注目すべき技術的変更点、以前のバージョンからの主要な修正点、および一般提供開始時点での既知のバグがまとめられています。
- External DNS Operator 1.2.0
External DNS Operator バージョン 1.2.0 では、以下のアドバイザリーを利用できます。
RHEA-2022:5867 ExternalDNS Operator 1.2 Operator またはオペランドコンテナー
新機能:
External DNS Operator が AWS 共有 VPC をサポートするようになりました。詳細は、共有 VPC を使用して別の AWS アカウントに DNS レコードを作成するを参照してください。
バグ修正:
-
オペランドの更新ストラテジーが、
RollingからRecreateに変更されました。(OCPBUGS-3630)
4.1.3. External DNS Operator1.1 リンクのコピーリンクがクリップボードにコピーされました!
External DNS Operator 1.1 のリリースノートには、すべての新機能と機能強化、注目すべき技術的変更点、以前のバージョンからの主要な修正点、および一般提供開始時点での既知のバグがまとめられています。
- External DNS Operator 1.1.1
External DNS Operator バージョン 1.1.1 では、以下のアドバイザリーを利用できます。利用できます。
- External DNS Operator 1.1.0
このリリースには、アップストリームプロジェクトバージョン 0.13.1 からのオペランドのリベースが含まれていました。External DNS Operator バージョン 1.1.0 では、以下のアドバイザリーを利用できます。
RHEA-2022:9086-01 ExternalDNS Operator 1.1 Operator またはオペランドコンテナー
バグ修正:
-
以前は、ExternalDNS Operator がボリュームに空の
defaultMode値を強制していたため、OpenShift API との競合により更新が随時行われていました。現在は、defaultMode値は強制されず、オペランドのデプロイは随時更新されなくなりました。(OCPBUGS-2793)
4.1.4. External DNS Operator1.0 リンクのコピーリンクがクリップボードにコピーされました!
External DNS Operator 1.0 のリリースノートには、すべての新機能と機能強化、注目すべき技術的変更点、以前のバージョンからの主要な修正点、および一般提供開始時点での既知のバグがまとめられています。
- External DNS Operator 1.0.1
External DNS Operator バージョン 1.0.1 では、以下のアドバイザリーを利用できます。
- External DNS Operator 1.0.0
External DNS Operator バージョン 1.0.0 では、以下のアドバイザリーを利用できます。
RHEA-2022:5867 ExternalDNS Operator 1.0 Operator またはオペランドコンテナー
バグ修正:
- 以前は、External DNS Operator は、ExternalDNS オペランド Pod のデプロイメント中に制限付き SCC ポリシーの違反に関する警告を発していました。この問題は解決されています。(BZ#2086408)
4.2. External DNS Operator について リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform への外部 DNS プロバイダーからのサービスおよびルートの名前解決を提供するには、External DNS Operator を使用します。この Operator は、外部プロバイダーとクラスターリソースを同期するために、ExternalDNS をデプロイおよび管理します。
4.2.1. External DNS Operator のドメイン名の制限 リンクのコピーリンクがクリップボードにコピーされました!
ExternalDNS リソースをデプロイする際の設定エラーを防ぐため、External DNS Operator によって適用されるドメイン名の制限事項を確認してください。これらの制約を理解することで、要求したホスト名とドメインが、基盤となる DNS プロバイダーと互換性があることが保証されます。
External DNS Operator は、TXT レコードのプレフィックスを追加する TXT レジストリーを使用します。これにより、TXT レコードのドメイン名の最大長が短くなります。DNS レコードは対応する TXT レコードなしでは存在できないため、DNS レコードのドメイン名は TXT レコードと同じ制限に従う必要があります。たとえば、DNS レコードが <domain_name_from_source> の場合、TXT レコードは external-dns-<record_type>-<domain_name_from_source> になります。
External DNS Operator によって生成される DNS レコードのドメイン名には、次の制限があります。
| レコードの種類 | 文字数 |
|---|---|
| CNAME | 44 |
| AzureDNS のワイルドカード CNAME レコード | 42 |
| A | 48 |
| AzureDNS のワイルドカード A レコード | 46 |
生成されたドメイン名がドメイン名の制限事項のいずれかを超えた場合、External DNS Operator のログに次のエラーが表示されます。
time="2022-09-02T08:53:57Z" level=error msg="Failure in zone test.example.io. [Id: /hostedzone/Z06988883Q0H0RL6UMXXX]"
time="2022-09-02T08:53:57Z" level=error msg="InvalidChangeBatch: [FATAL problem: DomainLabelTooLong (Domain label is too long) encountered with 'external-dns-a-hello-openshift-aaaaaaaaaa-bbbbbbbbbb-ccccccc']\n\tstatus code: 400, request id: e54dfd5a-06c6-47b0-bcb9-a4f7c3a4e0c6"
4.2.2. External DNS Operator の展開 リンクのコピーリンクがクリップボードにコピーされました!
External DNS Operator は、ソフトウェアカタログからオンデマンドでデプロイできます。External DNS Operator をデプロイすると、Subscription オブジェクトが作成されます。
External DNS Operator は、olm.openshift.io API グループから External DNS API を実装します。External DNS Operator は、サービス、ルート、外部 DNS プロバイダーを更新します。
前提条件
-
yqCLI ツールがインストールされている。
手順
次のコマンドを実行して、
install-zcvlrなどのインストールプランの名前を確認します。$ oc -n external-dns-operator get sub external-dns-operator -o yaml | yq '.status.installplan.name'次のコマンドを実行して、インストールプランのステータスが
Completeになっているか確認します。$ oc -n external-dns-operator get ip <install_plan_name> -o yaml | yq '.status.phase'次のコマンドを実行して、
external-dns-operatorデプロイメントのステータスを表示します。$ oc get -n external-dns-operator deployment/external-dns-operator出力例
NAME READY UP-TO-DATE AVAILABLE AGE external-dns-operator 1/1 1 1 23h
4.2.3. External DNS Operator のログの表示 リンクのコピーリンクがクリップボードにコピーされました!
DNS 設定の問題をトラブルシューティングするには、External DNS Operator のログを確認してください。oc logs コマンドを使用して、OperatorPod から診断情報を直接取得します。
手順
次のコマンドを実行して、External DNS Operator のログを表示します。
$ oc logs -n external-dns-operator deployment/external-dns-operator -c external-dns-operator
4.3. External DNS Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
クラウドインフラストラクチャー上の DNS レコードを管理するには、External DNS Operator をインストールしてください。この Operator は、Amazon Web Services (AWS)、Microsoft Azure、Google Cloud など、主要なクラウドプロバイダー上でデプロイメントをサポートしています。
4.3.1. ソフトウェアカタログを使用して External DNS Operator をインストールする リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform ソフトウェアカタログを使用して、External DNS Operator をインストールできます。その後、Web コンソールから直接 Operator のライフサイクルを管理できます。
手順
- OpenShift Container Platform Web コンソールで、Ecosystem → Software Catalog をクリックします。
- External DNS Operator をクリックします。Filter by keyword のテキストボックスまたはフィルターリストを使用して、Operator のリストから External DNS Operator を検索できます。
-
external-dns-operatornamespace を選択します。 - External DNS Operator ページで Install をクリックします。
Install Operator ページで、次のオプションを選択していることを確認してください。
- Update the channel で stable-v1.0 を選択します。
- Installation mode で A specific name on the cluster を選択します。
-
Installed namespace で
external-dns-operatorを選択します。名前空間external-dns-operator が存在しない場合、Operator は Operator のインストール中に作成されます。 - Approval Strategy で Automatic または Manual を選択します。承認ストラテジーはデフォルトで 自動 に設定されています。
Install をクリックします。
Automatic (自動) 更新を選択した場合、Operator Lifecycle Manager (OLM) は介入なしに、Operator の実行中のインスタンスを自動的にアップグレードします。
Manual 更新を選択した場合、OLM は更新要求を作成します。クラスター管理者は、Operator が新規バージョンに更新されるように更新要求を手動で承認する必要があります。
検証
- Installed Operators ダッシュボードで、External DNS Operator の Status が Succeeded と表示されることを確認します。
4.3.2. CLI を使用した External DNS Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
OpenShift CLI (oc) を使用して External DNS Operator をインストールできます。Operator は、Web コンソールを使用する必要なく、端末から直接インストールプロセスを管理します。
前提条件
-
OpenShift CLI (
oc) にログインしました。
手順
Namespaceオブジェクトを作成します。Namespaceオブジェクトを定義する YAML ファイルを作成します。namespace.yamlファイルの例apiVersion: v1 kind: Namespace metadata: name: external-dns-operator # ...次のコマンドを実行して、
Namespaceオブジェクトを作成します。$ oc apply -f namespace.yaml
OperatorGroupオブジェクトを作成します。OperatorGroupオブジェクトを定義する YAML ファイルを作成します。operatorgroup.yamlファイルの例apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: external-dns-operator namespace: external-dns-operator spec: upgradeStrategy: Default targetNamespaces: - external-dns-operator # ...以下のコマンドを実行して
OperatorGroupオブジェクトを作成します。$ oc apply -f operatorgroup.yaml
Subscriptionオブジェクトを作成します。Subscriptionオブジェクトを定義する YAML ファイルを作成します。subscription.yamlファイルの例apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: external-dns-operator namespace: external-dns-operator spec: channel: stable-v1 installPlanApproval: Automatic name: external-dns-operator source: redhat-operators sourceNamespace: openshift-marketplace # ...以下のコマンドを実行して
Subscriptionオブジェクトを作成します。$ oc apply -f subscription.yaml
検証
次のコマンドを実行して、サブスクリプションからインストールプランの名前を取得します。
$ oc -n external-dns-operator \ get subscription external-dns-operator \ --template='{{.status.installplan.name}}{{"\n"}}'次のコマンドを実行して、インストールプランのステータスが
Completeであることを確認します。$ oc -n external-dns-operator \ get ip <install_plan_name> \ --template='{{.status.phase}}{{"\n"}}'次のコマンドを実行して、
external-dns-operatorPod のステータスがRunningであることを確認します。$ oc -n external-dns-operator get pod出力例
NAME READY STATUS RESTARTS AGE external-dns-operator-5584585fd7-5lwqm 2/2 Running 0 11m次のコマンドを実行して、サブスクリプションのカタログソースが
redhat-operatorsであることを確認します。$ oc -n external-dns-operator get subscription次のコマンドを実行して、
external-dns-operatorのバージョンを確認します。$ oc -n external-dns-operator get csv
4.4. External DNS Operator の設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
External DNS Operator の動作をカスタマイズするには、ExternalDNS カスタムリソース (CR) で使用可能なパラメーターを設定します。パラメーターを設定することで、Operator が外部 DNS プロバイダーとサービスやルートを同期する方法を制御できます。
4.4.1. External DNS Operator の設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
External DNS Operator の動作をカスタマイズするには、ExternalDNS カスタムリソース (CR) で使用可能なパラメーターを設定します。パラメーターを設定することで、Operator が外部 DNS プロバイダーとサービスやルートを同期する方法を制御できます。
| パラメーター | 説明 |
|---|---|
|
| クラウドプロバイダーのタイプを有効にします。
|
|
|
ドメインごとに DNS ゾーンを指定できます。ゾーンを指定しない場合、
|
|
|
ドメインごとに AWS ゾーンを指定できます。ドメインを指定しない場合、
|
|
|
DNS レコードのソース (
|
4.5. AWS での DNS レコードの作成 リンクのコピーリンクがクリップボードにコピーされました!
AWS および AWS GovCloud で DNS レコードを作成するには、External DNS Operator を使用します。Operator は、クラスターサービスの外部名前解決を Operator を通じて直接管理します。
AWS Government (AWS GovCloud) リージョンで実行される STS 対応クラスターでの External DNS Operator の使用はサポートされていません。
4.5.1. Red Hat External DNS Operator を使用して AWS のパブリックホストゾーンに DNS レコードを作成する リンクのコピーリンクがクリップボードにコピーされました!
Red Hat External DNS Operator を使用して、AWS のパブリックホストゾーンに DNS レコードを作成できます。同じ手順を使用して、AWS GovCloud のホストゾーンに DNS レコードを作成できます。
手順
以下のコマンドを実行して、ユーザープロファイルを確認してください。
system:adminなどのプロファイルは、kube-system名前空間へのアクセス権を持っている必要があります。認証情報がない場合は、次のコマンドを実行して、kube-systemnamespace から認証情報を取得し、クラウドプロバイダークライアントを使用できます。$ oc whoamikube-system名前空間に存在するaws-credsシークレットから値を取得します。$ export AWS_ACCESS_KEY_ID=$(oc get secrets aws-creds -n kube-system --template={{.data.aws_access_key_id}} | base64 -d)$ export AWS_SECRET_ACCESS_KEY=$(oc get secrets aws-creds -n kube-system --template={{.data.aws_secret_access_key}} | base64 -d)ルートを取得して、ドメインを確認します。
$ oc get routes --all-namespaces | grep console出力例
openshift-console console console-openshift-console.apps.testextdnsoperator.apacshift.support console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.testextdnsoperator.apacshift.support downloads http edge/Redirect NoneDNS ゾーンのリストを取得し、以前にクエリーしたルートのドメインに対応する DNS ゾーンを見つけます。
$ aws route53 list-hosted-zones | grep testextdnsoperator.apacshift.support出力例
HOSTEDZONES terraform /hostedzone/Z02355203TNN1XXXX1J6O testextdnsoperator.apacshift.support. 5ルートソースの外部 DNSCR を作成します。$ cat <<EOF | oc create -f - apiVersion: externaldns.olm.openshift.io/v1beta1 kind: ExternalDNS metadata: name: sample-aws spec: domains: - filterType: Include matchType: Exact name: testextdnsoperator.apacshift.support provider: type: AWS source: type: OpenShiftRoute openshiftRouteOptions: routerName: default EOFここでは、以下のようになります。
metadata.name- 外部 DNS リソースの名前を指定します。
仕様ドメイン- デフォルトでは、すべてのホストゾーンがターゲット候補として選択されます。必要なホストゾーンを追加できます。
ドメインのマッチタイプ- 対象ゾーンのドメインとの一致が完全に一致する必要があることを指定します。正規表現による一致ではなく、完全一致。
ドメイン名- 更新するゾーンの正確なドメインを指定します。ルートのホスト名は、指定されたドメインのサブドメインである必要があります。
プロバイダータイプ-
AWS Route53DNS プロバイダーを指定します。 source- DNS レコードのソースに関するオプションを指定します。
ソースタイプ-
OpenShiftRouteリソースを、以前に指定した DNS プロバイダーで作成される DNS レコードのソースとして指定します。 openshiftRouteOptions.routerName-
ソースが
OpenShiftRouteの場合に、OpenShift Ingress Controller 名を指定できます。External DNS Operator は、CNAME レコードを作成する際に、そのルーターの正規ホスト名をターゲットとして選択します。
以下のコマンドを使用して、OpenShift Container Platform ルート用に作成されたレコードを確認してください。
$ aws route53 list-resource-record-sets --hosted-zone-id Z02355203TNN1XXXX1J6O --query "ResourceRecordSets[?Type == 'CNAME']" | grep console
4.5.2. 共有 VPC を使用して別の AWS アカウントに DNS レコードを作成する リンクのコピーリンクがクリップボードにコピーされました!
別の AWS アカウントに DNS レコードを作成するには、ExternalDNS Operator を設定して、共有 Virtual Private Cloud (VPC) を使用するようにします。これにより、組織は単一の Route 53 インスタンスを使用して、複数のアカウントやプロジェクトにわたる名前解決を行うことができます。
前提条件
- 2 つの Amazon AWS アカウントを作成している。1 つは VPC と Route 53 プライベートホストゾーンが設定されたもの (アカウント A)、もう 1 つはクラスターをインストールするためのもの (アカウント B) です。
- アカウント B でアカウント A の Route 53 ホストゾーンに DNS レコードを作成するために、適切な権限を持つ IAM ポリシーと IAM ロールをアカウント A に作成している。
- アカウント B のクラスターをアカウント A の既存の VPC にインストールしている。
- アカウント B のクラスターに ExternalDNS Operator がインストールされている。
手順
次のコマンドを実行して、アカウント B からアカウント A の Route 53 ホストゾーンにアクセスできるように作成した IAM ロールのロール ARN を取得します。
$ aws --profile account-a iam get-role --role-name user-rol1 | head -1出力例
ROLE arn:aws:iam::1234567890123:role/user-rol1 2023-09-14T17:21:54+00:00 3600 / AROA3SGB2ZRKRT5NISNJN user-rol1次のコマンドを実行して、アカウント A の認証情報で使用するプライベートホストゾーンを特定します。
$ aws --profile account-a route53 list-hosted-zones | grep testextdnsoperator.apacshift.support出力例
HOSTEDZONES terraform /hostedzone/Z02355203TNN1XXXX1J6O testextdnsoperator.apacshift.support. 5次のコマンドを実行して、
ExternalDNSオブジェクトを作成します。$ cat <<EOF | oc create -f - apiVersion: externaldns.olm.openshift.io/v1beta1 kind: ExternalDNS metadata: name: sample-aws spec: domains: - filterType: Include matchType: Exact name: testextdnsoperator.apacshift.support provider: type: AWS aws: assumeRole: arn: arn:aws:iam::12345678901234:role/user-rol1 source: type: OpenShiftRoute openshiftRouteOptions: routerName: default EOFここでは、以下のようになります。
arn- アカウント A に DNS レコードを作成するロール ARN を指定します。
以下のコマンドを入力して、OpenShift Container Platform ルート用に作成されたレコードを確認してください。
$ aws --profile account-a route53 list-resource-record-sets --hosted-zone-id Z02355203TNN1XXXX1J6O --query "ResourceRecordSets[?Type == 'CNAME']" | grep console-openshift-console
4.6. Azure での DNS レコードの作成 リンクのコピーリンクがクリップボードにコピーされました!
Microsoft Azure で DNS レコードを作成するには、External DNS Operator を使用します。この Operator を使用すると、クラスターサービスの外部名前解決を管理できます。
Microsoft Entra Workload ID 対応クラスターまたは Microsoft Azure Government (MAG) リージョンで実行されるクラスターで External DNS Operator を使用することはサポートされていません。
4.6.1. Azure DNS ゾーンに DNS レコードを作成する リンクのコピーリンクがクリップボードにコピーされました!
Azure のパブリック DNS ゾーンまたはプライベート DNS ゾーンに DNS レコードを作成するには、External DNS Operator を使用します。Operator は、クラスターの外部名前解決を管理します。
前提条件
- 管理者権限を持っている。
-
adminユーザーの場合、kube-systemnamespace にアクセスできる。
手順
クラウドプロバイダークライアントを使用するために、次のコマンドを実行して
kube-systemnamespace から認証情報を取得します。$ CLIENT_ID=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_client_id}} | base64 -d)$ CLIENT_SECRET=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_client_secret}} | base64 -d)$ RESOURCE_GROUP=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_resourcegroup}} | base64 -d)$ SUBSCRIPTION_ID=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_subscription_id}} | base64 -d)$ TENANT_ID=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_tenant_id}} | base64 -d)次のコマンドを実行して、Azure にログインします。
$ az login --service-principal -u "${CLIENT_ID}" -p "${CLIENT_SECRET}" --tenant "${TENANT_ID}"次のコマンドを実行して、ルートのリストを取得します。
$ oc get routes --all-namespaces | grep console出力例
openshift-console console console-openshift-console.apps.test.azure.example.com console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.test.azure.example.com downloads http edge/Redirect NoneDNS ゾーンのリストを取得します。
パブリック DNS ゾーンの場合は、次のコマンドを入力してください。
$ az network dns zone list --resource-group "${RESOURCE_GROUP}"プライベート DNS ゾーンの場合は、次のコマンドを入力してください。
$ az network private-dns zone list -g "${RESOURCE_GROUP}"
ExternalDNSオブジェクトを定義する YAML ファイル (例:external-dns-sample-azure.yaml) を作成します。external-dns-sample-azure.yamlファイルの例apiVersion: externaldns.olm.openshift.io/v1beta1 kind: ExternalDNS metadata: name: sample-azure spec: zones: - "/subscriptions/1234567890/resourceGroups/test-azure-xxxxx-rg/providers/Microsoft.Network/dnszones/test.azure.example.com" provider: type: Azure source: openshiftRouteOptions: routerName: default type: OpenShiftRoute # ...ここでは、以下のようになります。
metadata.name- 外部 DNS 名を指定します。
仕様ゾーン-
ゾーン ID を指定します。プライベート DNS ゾーンの場合は、
dnszonesをprivateDnsZonesに変更します。 プロバイダータイプ- プロバイダーの種類を指定します。
source.openshiftRouteOptions- DNS レコードのソースに関するオプションを指定します。
routerName-
ソースタイプが
OpenShiftRouteの場合、OpenShift Ingress Controller 名を渡すことができます。External DNS Operator は、CNAME レコードを作成する際に、そのルーターの正規ホスト名をターゲットとして選択します。 ソースタイプ-
Azure DNS レコードのソースとして、
ルートリソースを指定します。
トラブルシューティング
ルートに対して作成されたレコードを確認します。
パブリック DNS ゾーンの場合は、次のコマンドを入力してください。
$ az network dns record-set list -g "${RESOURCE_GROUP}" -z "${ZONE_NAME}" | grep consoleプライベート DNS ゾーンの場合は、次のコマンドを入力してください。
$ az network private-dns record-set list -g "${RESOURCE_GROUP}" -z "${ZONE_NAME}" | grep console
4.7. Google Cloud Platform で DNS レコードを作成する リンクのコピーリンクがクリップボードにコピーされました!
Google Cloud で DNS レコードを作成するには、External DNS Operator を使用します。DNSOperator は、クラスターサービスの外部名前解決を管理します。
Google Cloud Workload Identity が有効なクラスターで External DNS Operator を使用することはサポートされていません。Google Cloud Workload Identity の詳細は、Google Cloud Workload Identity を参照してください。
4.7.1. Google Cloud のパブリックマネージドゾーンに DNS レコードを作成する リンクのコピーリンクがクリップボードにコピーされました!
Google Cloud で DNS レコードを作成するには、External DNS Operator を使用します。DNSOperator は、クラスターサービスの外部名前解決を管理します。
前提条件
- 管理者権限を持っている。
手順
次のコマンドを実行して、
encoded-gcloud.jsonファイル内のgcp-credentialsシークレットをコピーします。$ oc get secret gcp-credentials -n kube-system --template='{{$v := index .data "service_account.json"}}{{$v}}' | base64 -d - > decoded-gcloud.json次のコマンドを実行して、Google の認証情報をエクスポートします。
$ export GOOGLE_CREDENTIALS=decoded-gcloud.json次のコマンドを使用して、アカウントをアクティブ化します。
$ gcloud auth activate-service-account <client_email as per decoded-gcloud.json> --key-file=decoded-gcloud.json次のコマンドを実行して、プロジェクトを設定します。
$ gcloud config set project <project_id as per decoded-gcloud.json>次のコマンドを実行して、ルートのリストを取得します。
$ oc get routes --all-namespaces | grep console出力例
openshift-console console console-openshift-console.apps.test.gcp.example.com console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.test.gcp.example.com downloads http edge/Redirect None次のコマンドを実行して、
qe-cvs4g-private-zone test.gcp.example.comなどのマネージドゾーンのリストを取得します。$ gcloud dns managed-zones list | grep test.gcp.example.comExternalDNSオブジェクトを定義する YAML ファイル (例:external-dns-sample-gcp.yaml) を作成します。external-dns-sample-gcp.yamlファイルの例apiVersion: externaldns.olm.openshift.io/v1beta1 kind: ExternalDNS metadata: name: sample-gcp spec: domains: - filterType: Include matchType: Exact name: test.gcp.example.com provider: type: GCP source: openshiftRouteOptions: routerName: default type: OpenShiftRoute # ...ここでは、以下のようになります。
metadata.name- 外部 DNS 名を指定します。
spec.domains.filterType- デフォルトでは、すべてのホストされたゾーンがターゲット候補として選択されます。ホストされたゾーンを含めることができます。
spec.domains.matchType-
名前キーで定義された文字列と一致する必要があるターゲットのドメインを指定します。 仕様ドメイン名- 更新するゾーンの正確なドメインを指定します。ルートのホスト名は、指定されたドメインのサブドメインである必要があります。
仕様プロバイダータイプ- プロバイダーの種類を指定します。
source.openshiftRouteOptions- DNS レコードのソースに関するオプションを指定します。
openshiftRouteOptions.routerName-
ソースタイプが
OpenShiftRouteの場合、OpenShift Ingress Controller 名を渡すことができます。外部 DNS は、CNAME レコードを作成する際に、そのルーターの正規ホスト名をターゲットとして選択します。 type-
ルートリソースを、Google Cloud DNS レコードのソースとして指定します。
次のコマンドを実行して、OpenShift Container Platform ルートに対して作成された DNS レコードを確認します。
$ gcloud dns record-sets list --zone=qe-cvs4g-private-zone | grep console
4.8. Infoblox での DNS レコードの作成 リンクのコピーリンクがクリップボードにコピーされました!
Infoblox で DNS レコードを作成するには、External DNS Operator を使用します。Operator は、クラスターサービスの外部名前解決を管理します。
4.8.1. Infoblox のパブリック DNS ゾーンに DNS レコードを作成する リンクのコピーリンクがクリップボードにコピーされました!
Infoblox で DNS レコードを作成するには、External DNS Operator を使用します。Operator は、クラスターサービスの外部名前解決を管理します。
前提条件
-
OpenShift CLI (
oc) にアクセスできる。 - Infoblox UI にアクセスできる。
手順
次のコマンドを実行して、Infoblox クレデンシャルを使用して
secretオブジェクトを作成します。$ oc -n external-dns-operator create secret generic infoblox-credentials --from-literal=EXTERNAL_DNS_INFOBLOX_WAPI_USERNAME=<infoblox_username> --from-literal=EXTERNAL_DNS_INFOBLOX_WAPI_PASSWORD=<infoblox_password>次のコマンドを実行して、ルートのリストを取得します。
$ oc get routes --all-namespaces | grep console出力例
openshift-console console console-openshift-console.apps.test.example.com console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.test.example.com downloads http edge/Redirect NoneExternalDNSオブジェクトを定義する YAML ファイル (例:external-dns-sample-infoblox.yaml) を作成します。external-dns-sample-infoblox.yamlファイルの例apiVersion: externaldns.olm.openshift.io/v1beta1 kind: ExternalDNS metadata: name: sample-infoblox spec: provider: type: Infoblox infoblox: credentials: name: infoblox-credentials gridHost: ${INFOBLOX_GRID_PUBLIC_IP} wapiPort: 443 wapiVersion: "2.3.1" domains: - filterType: Include matchType: Exact name: test.example.com source: type: OpenShiftRoute openshiftRouteOptions: routerName: defaultここでは、以下のようになります。
metadata.name- 外部 DNS 名を指定します。
プロバイダータイプ- プロバイダーの種類を指定します。
ソースタイプ- DNS レコードのソースに関するオプションを指定します。
routerName-
ソースタイプが
OpenShiftRouteの場合、OpenShift Ingress Controller 名を渡すことができます。外部 DNS は、CNAME レコードを作成する際に、そのルーターの正規ホスト名をターゲットとして選択します。
次のコマンドを実行して、Infoblox に
ExternalDNSリソースを作成します。$ oc create -f external-dns-sample-infoblox.yamlInfoblox UI から、
consoleルート用に作成された DNS レコードを確認します。- Data Management → DNS → Zones をクリックします。
- ゾーン名を選択します。
4.9. External DNS Operator でクラスター全体のプロキシーを設定する リンクのコピーリンクがクリップボードにコピーされました!
デプロイ済みの Operator にプロキシー設定を反映させるには、クラスター全体のプロキシーを設定します。オペレーターライフサイクルマネージャー (OLM) は、これらの Operator を新しい HTTP_PROXY、HTTPS_PROXY、および NO_PROXY 環境変数で自動的に更新します。
4.9.1. クラスター全体のプロキシーの認証局を信頼する リンクのコピーリンクがクリップボードにコピーされました!
External DNS Operator がクラスター全体のプロキシーで認証できるようにするには、Operator がプロキシーの認証局 (CA) を信頼するように設定します。これにより、DNS トラフィックをプロキシー経由でルーティングする際の安全な通信が確保されます。
手順
次のコマンドを実行して、
external-dns-operatornamespace に CA バンドルを含める config map を作成します。$ oc -n external-dns-operator create configmap trusted-ca信頼できる CA バンドルを config map に挿入するには、次のコマンドを実行して、
config.openshift.io/inject-trusted-cabundle=trueラベルを config map に追加します。$ oc -n external-dns-operator label cm trusted-ca config.openshift.io/inject-trusted-cabundle=true次のコマンドを実行して、External DNS Operator のサブスクリプションを更新します。
$ oc -n external-dns-operator patch subscription external-dns-operator --type='json' -p='[{"op": "add", "path": "/spec/config", "value":{"env":[{"name":"TRUSTED_CA_CONFIGMAP_NAME","value":"trusted-ca"}]}}]'
検証
External DNS Operator をデプロイした後、次のコマンドを実行して、信頼済み CA 環境変数が追加されていることを確認してください。出力には
、外部 DNS オペレーターのデプロイメントに対してtrusted-caが表示される必要があります。$ oc -n external-dns-operator exec deploy/external-dns-operator -c external-dns-operator -- printenv TRUSTED_CA_CONFIGMAP_NAME
第5章 MetalLB Operator リンクのコピーリンクがクリップボードにコピーされました!
5.1. MetalLB および MetalLB Operator について リンクのコピーリンクがクリップボードにコピーされました!
ベアメタル上で動作する、またはクラウドロードバランサーを使用しない OpenShift Container Platform クラスターでは、MetalLB Operator を使用して外部 IP アドレスをロードバランサーサービスに割り当てることができます。これらのサービスは、ホストネットワーク上で外部 IP アドレスを取得します。
5.1.1. MetalLB を使用するタイミング リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform のベアメタル上で、外部 IP を介してアプリケーションへの耐障害性アクセスを実現するには、MetalLB を使用できます。
MetalLB の使用は、ベアメタルクラスター、またはベアメタルのようなインフラストラクチャーがある場合や、外部 IP アドレスを使用したアプリケーションへのフォールトトレラントがあるアクセスが必要な場合に役立ちます。
ネットワークインフラストラクチャーを設定し、外部 IP アドレスのネットワークトラフィックがクライアントからクラスターのホストネットワークにルーティングされるようにする必要があります。
MetalLB Operator を使用して MetalLB をデプロイした後、タイプ LoadBalancer のサービスを追加すると、MetalLB はプラットフォームネイティブなロードバランサーを提供します。
外部トラフィックが MetalLB LoadBalancer サービスを通じて OpenShift Container Platform クラスターに入ると、クライアントへの戻りトラフィックに、ロードバランサーの外部 IP アドレスがソース IP として含まれます。
レイヤ 2 モードで動作する MetalLB は、IP フェイルオーバーと同様のメカニズムを利用してフェイルオーバーをサポートします。ただし、仮想ルーター冗長プロトコル (VRRP) とキープアライブに依存する代わりに、MetalLB はゴシップベースのプロトコルを利用してノード障害のインスタンスを識別します。フェイルオーバーが検出されると、別のノードがリーダーノードのロールを引き継ぎ、Gratuitous ARP メッセージがディスパッチされて、この変更がブロードキャストされます。
レイヤ 3 またはボーダーゲートウェイプロトコル (BGP) モードで動作する MetalLB は、障害検出をネットワークに委任します。OpenShift Container Platform ノードが接続を確立した BGP ルーターは、ノードの障害を識別し、そのノードへのルートを終了します。
Pod とサービスの高可用性を確保するには、IP フェイルオーバーの代わりに MetalLB を使用することを推奨します。
5.1.2. MetalLB Operator カスタムリソース リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform では、MetalLB Operator が監視するカスタムリソースを通じて、MetalLB のデプロイメントと IP アドレスのアドバタイズメントを設定します。リソースには 、MetalLB、IPAddressPool、L2Advertisement、BGPAdvertisement、BGPPeer、および BFDProfile が含まれます。
MetalLB-
MetalLBカスタムリソースをクラスターに追加する際に、MetalLB Operator は MetalLB をクラスターにデプロイします。Operator はカスタムリソースの単一インスタンスのみをサポートします。インスタンスが削除されると、Operator はクラスターから MetalLB を削除します。 IPAddressPoolMetalLB には、タイプ
LoadBalancerのサービスを追加する際にサービスに割り当てることができる IP アドレスの 1 つ以上のプールが必要です。IPAddressPoolには、IP アドレスのリストが含まれています。リストは、1.1.1.1-1.1.1.1 などの範囲を使用して設定された単一の IP アドレス、CIDR 表記で指定された範囲、ハイフンで区切られた開始アドレスと終了アドレスとして指定された範囲、またはこの 3 つの組み合わせにすることができます。IPAddressPoolには名前が必要です。ドキュメントは、doc-example、doc-example-reserved、doc-example-ipv6などの名前を使用します。MetalLBcontrollerは、IPAddressPool内のアドレスのプールから IP アドレスを割り当てます。L2AdvertisementおよびBGPAdvertisementカスタムリソースは、指定されたプールからの指定された IP のアドバタイズメントを有効にします。IPAddressPoolカスタムリソースのIPAddressPool仕様を使用して、spec.serviceAllocationからサービスと namespace に IP アドレスを割り当てることができます。注記単一の
IPAddressPoolは、L2 アドバタイズメントと BGP アドバタイズメントによって参照できます。BGPPeer- BGP ピアカスタムリソースは、通信する MetalLB の BGP ルーター、ルーターの AS 番号、MetalLB の AS 番号、およびルートアドバタイズメントのカスタマイズを識別します。MetalLB は、サービスロードバランサーの IP アドレスのルートを 1 つ以上の BGP ピアにアドバタイズします。
BFDProfile- BFD プロファイルカスタムリソースは、BGP ピアの双方向フォワーディング検出 (BFD) を設定します。BFD は、BGP のみよりも、パスの障害検出が高速になります。
L2Advertisement-
L2Advertisement カスタムリソースは、L2 プロトコルを使用して
IPAddressPoolからの IP をアドバタイズします。 BGPAdvertisement-
BGPAdvertisement カスタムリソースは、BGP プロトコルを使用して
IPAddressPoolからの IP をアドバタイズします。
MetalLB カスタムリソースをクラスターに追加し、Operator が MetalLB をデプロイすると、controller および speaker MetalLB ソフトウェアコンポーネントは実行を開始します。
MetalLB は、関連するすべてのカスタムリソースを検証します。
5.1.3. MetalLB ソフトウェアコンポーネント リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform では、ロードバランサーサービスの外部 IP アドレスは、2 つの MetalLB コンポーネントから取得されます。コントローラーはアドレスプールから IP アドレスを割り当て、スピーカーはレイヤ 2 または BGP を介してそれらをアドバタイズする。
MetalLB Operator のインストール時に、metallb-operator-controller-manager デプロイメントは Pod を起動します。Pod は Operator の実装です。Pod は、関連するすべてのリソースへの変更を監視します。
Operator が MetalLB のインスタンスを起動すると、controller デプロイメントと speaker のデーモンセットが開始します。
MetalLB カスタムリソースでデプロイメント仕様を設定して、controller および speaker Pod がクラスターへのデプロイおよび実行方法を管理できます。これらの展開仕様の詳細は、関連情報 セクションを参照してください。
controllerOperator はデプロイメントおよび単一の Pod を起動します。
LoadBalancerタイプのサービスを追加する場合、Kubernetes はcontrollerを使用してアドレスプールから IP アドレスを割り当てます。サービスに障害が発生した場合は、controllerPod のログに次のエントリーがあることを確認します。出力例
"event":"ipAllocated","ip":"172.22.0.201","msg":"IP address assigned by controllerspeakerOperator は、
speakerPod 用に設定されたデーモンを起動します。デフォルトでは、Pod はクラスター内の各ノードで起動されます。MetalLB の起動時にMetalLBカスタムリソースでノードセレクターを指定して、Pod を特定のノードに制限できます。controllerがサービスに IP アドレスを割り当てても、サービスがまだ利用できない場合は、speakerPod のログを確認してください。スピーカーPod が使用できない場合は、oc describe pod -nコマンドを実行します。レイヤー 2 モードの場合には、
controllerがサービスに IP アドレスを割り当てた後に、speakerPod はアルゴリズムを使用して、どのノードの、どのspeakerPod がロードバランサーの IP アドレスをアナウンスするかを決定します。このアルゴリズムには、ノード名とロードバランサーの IP アドレスのハッシュが含まれます。詳細は、「MetalLB と外部トラフィックポリシー」を参照してください。speakerは、Address Resolution Protocol (ARP) を使用して IPv4 アドレスと Neighbor Discovery Protocol (NDP) を公開して、IPv6 アドレスにアナウンスします。
Border Gateway Protocol (BGP) モードの場合、コントローラー がサービスに IP アドレスを割り当てた後に、各 speaker Pod はロードバランサーの IP アドレスを BGP ピアにアドバタイズします。どのノードが BGP ピアとの BGP セッションを開始するかを設定できます。
ロードバランサーの IP アドレスの要求は、IP アドレスを通知する speaker でノードにルーティングされます。ノードがパケットを受信した後に、サービスプロキシーはパケットをサービスのエンドポイントにルーティングします。エンドポイントは、最適なケースでは同じノードに配置することも、別のノードに配置することもできます。サービスプロキシーは、接続が確立されるたびにエンドポイントを選択します。
5.1.4. MetalLB と外部トラフィックポリシー リンクのコピーリンクがクリップボードにコピーされました!
MetalLB LoadBalancer サービスの外部トラフィックポリシーは、サービスプロキシーがトラフィックを Pod にどのように分散するかを決定します。均一な分散を実現するにはポリシーを クラスタリング に設定し、クライアントの IP アドレスを保持するには ローカル に設定してください。
レイヤー 2 モードでは、クラスター内のノードはサービス IP アドレスのすべてのトラフィックを受信します。
BGP モードでは、ホストネットワーク上のルーターが、新しいクライアントが接続を確立できるように、クラスター内のノードの 1 つに接続を開きます。
クラスターがノードに入った後にトラフィックを処理する方法は、外部トラフィックポリシーの影響を受けます。
clusterこれは
spec.externalTrafficPolicyのデフォルト値です。clusterトラフィックポリシーでは、ノードがトラフィックを受信した後に、サービスプロキシーはトラフィックをサービスのすべての Pod に分散します。このポリシーは、Pod 全体に均一なトラフィック分散を提供しますが、クライアントの IP アドレスを覆い隠し、トラフィックがクライアントではなくノードから発信されているように Pod 内のアプリケーションに表示される可能性があります。locallocalトラフィックポリシーでは、ノードがトラフィックを受信した後に、サービスプロキシーはトラフィックを同じノードの Pod にのみ送信します。たとえば、ノード A のspeakerPod が外部サービス IP をアナウンスすると、すべてのトラフィックがノード A に送信されます。トラフィックがノード A に入った後、サービスプロキシーはノード A にあるサービスの Pod にのみトラフィックを送信します。追加のノードにあるサービスの Pod は、ノード A からトラフィックを受信しません。追加のノードにあるサービスの Pod は、フェイルオーバーが必要な場合にレプリカとして機能します。このポリシーは、クライアントの IP アドレスには影響しません。アプリケーション Pod は、受信接続からクライアント IP アドレスを判別できます。
次の情報は、BGP モードで外部トラフィックポリシーを設定する場合に重要です。
MetalLB は、適格なすべてのノードからロードバランサーの IP アドレスをアドバタイズしますが、サービスのロードバランシングを行うノードの数は、等コストマルチパス (ECMP) ルートを確立するルーターの容量によって制限される場合があります。IP をアドバタイズするノードの数がルーターの ECMP グループ制限よりも多い場合、ルーターは IP をアドバタイズするノードよりも少ないノードを使用します。
たとえば、外部トラフィックポリシーが local に設定され、ルーターの ECMP グループ制限が 16 に設定され、LoadBalancer サービスを実装する Pod が 30 ノードにデプロイされている場合、14 ノードにデプロイされた Pod はトラフィックを受信しません。この状況では、サービスの外部トラフィックポリシーを cluster に設定することを推奨します。
5.1.5. レイヤー 2 モードの MetalLB の概念 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB はレイヤー 2 モードで、ARP または NDP を介して、あるノードからロードバランサーサービスの外部 IP アドレスを通知します。サービスのすべてのトラフィックはそのノードを経由し、ノードが利用不能になった場合は自動的に別のノードにフェイルオーバーされます。
レイヤ 2 モードでは、MetalLB は ARP と NDP に依存します。これらのプロトコルは、特定のサブネット内でローカルアドレス解決を実装します。このコンテキストでは、MetalLB が機能するために、クライアントは、サービスをアナウンスするノードと同じサブネット上に存在する MetalLB によって割り当てられた VIP に到達できなければなりません。
speaker Pod は、IPv4 サービスの ARP 要求と IPv6 の NDP 要求に応答します。
レイヤー 2 モードでは、サービス IP アドレスのすべてのトラフィックは 1 つのノードを介してルーティングされます。トラフィックがノードに入ると、CNI ネットワークプロバイダーのサービスプロキシーはトラフィックをサービスのすべての Pod に配信します。
サービスのすべてのトラフィックがレイヤー 2 モードで単一のノードを通過するので、より厳密な意味で、MetalLB はレイヤー 2 のロードバランサーを実装しません。むしろ、MetalLB はレイヤー 2 のフェイルオーバーメカニズムを実装しているため、speaker Pod が利用できなくなったときに、別のノードの speaker Pod がサービス IP アドレスをアナウンスできます。
ノードが使用できなくなると、フェイルオーバーが自動的に行われます。他のノードの speaker Pod は、ノードが使用できないことを検出し、障害が発生したノードから、新しい speaker Pod とノードがサービス IP アドレスの所有権を取得します。
前述のグラフは、MetalLB に関する以下の概念を示しています。
-
アプリケーションは、
172.130.0.0/16サブネットのクラスター IP を持つサービスで利用できます。その IP アドレスはクラスター内からアクセスできます。サービスには、MetalLB がサービス192.168.100.200に割り当てられている外部 IP アドレスもあります。 - ノード 1 および 3 には、アプリケーションの Pod があります。
-
speakerデーモンセットは、各ノードで Pod を実行します。MetalLB Operator はこれらの Pod を起動します。 -
各
speakerPod はホストネットワークを使用する Pod です。Pod の IP アドレスは、ホストネットワーク上のノードの IP アドレスと同じです。 -
ノード 1 の
speakerPod は ARP を使用して、サービスの外部 IP アドレスに192.168.100.200を認識します。外部 IP アドレスをアナウンスするspeakerPod は、サービスのエンドポイントと同じノード上にあり、エンドポイントはReady状態である必要があります。 クライアントトラフィックはホストネットワークにルーティングされ、
192.168.100.200の IP アドレスに接続します。トラフィックがノードに入ると、サービスプロキシーは、サービスに設定した外部トラフィックポリシーに従って、同じノードまたは別のノードのアプリケーション Pod にトラフィックを送信します。-
サービスの外部トラフィックポリシーが
clusterに設定されている場合、speakerPod が実行されているノードから192.168.100.200ロードバランサーの IP アドレスをアドバタイズするノードが選択されます。そのノードのみがサービスのトラフィックを受信できます。 -
サービスの外部トラフィックポリシーが
localに設定されている場合、speakerPod が実行されているノードと少なくとも 1 つのサービスエンドポイントから192.168.100.200ロードバランサーの IP アドレスをアドバタイズするノードが選択されます。そのノードのみがサービスのトラフィックを受信できます。前の図では、ノード 1 または 3 のいずれかが192.168.100.200をアドバタイズします。
-
サービスの外部トラフィックポリシーが
-
ノード 1 が利用できない場合、外部 IP アドレスは別のノードにフェイルオーバーします。アプリケーション Pod およびサービスエンドポイントのインスタンスを持つ別のノードでは、
speakerPod は外部 IP アドレス192.168.100.200になり、新規ノードがクライアントトラフィックを受信します。図では、唯一の候補はノード 3 です。
5.1.6. BGP モードの MetalLB の概念 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB は、ボーダーゲートウェイプロトコル (BGP) モードで、各 スピーカー Pod からロードバランサーの IP アドレスを BGP ピアにアドバタイズします。ルーターはトラフィックをいずれかのノードに送信するため、負荷はノード間で分散され、いずれかのノードが利用不能になった場合は、ルーターは別のノードに切り替わります。
オプションの BGP ピアのリストを追加すると、指定されたプールからの IP を指定されたピアセットにアドバタイズすることもできます。
BGP ピアは通常、BGP プロトコルを使用するように設定されたネットワークルーターです。ルーターがロードバランサーの IP アドレスのトラフィックを受信すると、ルーターは IP アドレスをアドバタイズした speaker Pod が含まれるノードの 1 つを選択します。ルーターはトラフィックをそのノードに送信します。トラフィックがノードに入ると、CNI ネットワークプラグインのサービスプロキシーはトラフィックをサービスのすべての Pod に配信します。
クラスターノードと同じレイヤー 2 のネットワークセグメントに直接接続されたルーターは、BGP ピアとして設定できます。直接接続されたルーターが BGP ピアとして設定されていない場合は、ロードバランサーの IP アドレスのパケットが BGP ピアと speaker Pod を実行するクラスターノードの間でルーティングされるようにネットワークを設定する必要があります。
ルーターは、ロードバランサーの IP アドレスの新しいトラフィックを受信するたびに、ノードへの新しい接続を作成します。各ルーターのメーカーには、接続開始ノードを選択する実装固有のアルゴリズムがあります。ただし、アルゴリズムは通常、ネットワーク負荷のバランスをとるために、使用可能なノード間でトラフィックを分散するように設計されています。
ノードが使用できなくなった場合に、ルーターは、ロードバランサーの IP アドレスをアドバタイズする speaker Pod が含まれる別のノードとの新しい接続を開始します。
図5.1 BGP モードの MetalLB トポロジーの図
前述のグラフは、MetalLB に関する以下の概念を示しています。
-
アプリケーションは、
172.130.0.0/16サブネットの IPv4 クラスター IP を持つサービスで利用できます。その IP アドレスはクラスター内からアクセスできます。サービスには、MetalLB がサービス203.0.113.200に割り当てられている外部 IP アドレスもあります。 - ノード 2 および 3 には、アプリケーションの Pod があります。
-
speakerデーモンセットは、各ノードで Pod を実行します。MetalLB Operator はこれらの Pod を起動します。MetalLB を設定して、speakerPod を実行するノードを指定できます。 -
各
speakerPod はホストネットワークを使用する Pod です。Pod の IP アドレスは、ホストネットワーク上のノードの IP アドレスと同じです。 -
各
speakerPod は、すべての BGP ピアとの BGP セッションを開始し、ロードバランサーの IP アドレスまたは集約されたルートを BGP ピアにアドバタイズします。speakerPod は、Autonomous System 65010 の一部であることをアドバタイズします。この図ではルーター R1 を示しており、これは同じ Autonomous System 内の BGP ピアです。ただし、他の Autonomous System に属するピアとの BGP セッションを開始するように MetalLB を設定できます。 ノードに、ロードバランサーの IP アドレスをアドバタイズする
speakerPod がある場合にはすべて、サービスのトラフィックを受信できます。-
サービスの外部トラフィックポリシーが
clusterに設定されている場合、スピーカー Pod が実行されているすべてのノードが203.0.113.200ロードバランサーの IP アドレスをアドバタイズし、speakerPod を持つすべてのノードがサービスのトラフィックを受信できます。ホストの接頭辞は、外部トラフィックポリシーが cluster に設定されている場合にのみ、ルーターピアにアドバタイズされます。 -
サービスの外部トラフィックポリシーが
localに設定されている場合、speakerPod が実行されているノードとサービスが実行されている少なくとも 1 つのエンドポイントが、203.0.113.200ロードバランサーの IP アドレスをアドバタイズできます。これらのノードのみがサービスのトラフィックを受信できます。前の図では、ノード 2 と 3 は203.0.113.200をアドバタイズします。
-
サービスの外部トラフィックポリシーが
-
BGP ピアカスタムリソースの追加時にノードセレクターを指定して、特定の BGP ピアとの BGP セッションを開始する
speakerPod を制御するように MetalLB を設定できます。 - BGP を使用するように設定されている R1 などのルーターは、BGP ピアとして設定できます。
- クライアントトラフィックは、ホストネットワーク上のノードの 1 つにルーティングされます。トラフィックがノードに入ると、サービスプロキシーは、サービスに設定した外部トラフィックポリシーに従って、同じノードまたは別のノードのアプリケーション Pod にトラフィックを送信します。
- ノードが使用できなくなった場合に、ルーターは障害を検出し、別のノードとの新しい接続を開始します。BGP ピアに双方向フォワーディング検出 (BFD) プロファイルを使用するように MetalLB を設定できます。BFD は、リンク障害検出がより高速であるため、ルーターは BFD がない場合よりも早く新しい接続を開始できます。
5.1.7. 制限および制限 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB は、OpenShift Container Platform におけるインフラストラクチャー、レイヤー 2 モード、および BGP モードに関して制限があります。デプロイメントを立てる際には、インフラストラクチャーの適合性、レイヤ 2 のシングルノード帯域幅とフェイルオーバー、BGP 接続のリセット、およびシングル ASN を考慮してください。
5.1.7.1. MetalLB のインフラストラクチャーに関する考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB は、ネイティブのロードバランサーを備えていないベアメタル環境やオンプレミス環境で使用できます。
ベアメタル環境へのインストールに加え、一部のインフラストラクチャーにおける OpenShift Container Platform のインストールでは、ネイティブのロードバランサー機能が含まれていない場合があります。たとえば、以下のインフラストラクチャーは MetalLB Operator を追加するのに役立ちます。
- ベアメタル
- VMware vSphere
- IBM Z® および IBM® LinuxONE
- IBM Z® および IBM® LinuxONE for Red Hat Enterprise Linux (RHEL) KVM
- IBM Power®
5.1.7.2. レイヤー 2 モードの制限 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform では、MetalLB のレイヤ 2 モードはシングルノードの帯域幅に制限されており、フェイルオーバーはクライアントの ARP 処理に依存します。接続障害を防ぐため、MetalLB と別のネットワークに同じ VLAN を使用することは避けてください。
5.1.7.2.1. 単一ノードのボトルネック リンクのコピーリンクがクリップボードにコピーされました!
MetalLB は、1 つのノードを介してサービス内のすべてのトラフィックをルーティングします。この際、ノードはボトルネックとなり、パフォーマンスを制限する可能性があります。
レイヤー 2 モードは、サービスの Ingress 帯域幅を単一ノードの帯域幅に制限します。これは、ARP および NDP を使用してトラフィックを転送するための基本的な制限です。
5.1.7.2.2. フェイルオーバーのパフォーマンスの低下 リンクのコピーリンクがクリップボードにコピーされました!
ノード間のフェイルオーバーは、クライアントからの操作によって異なります。フェイルオーバーが発生すると、MetalLB は Gratuitous ARP パケットを送信して、サービス IP に関連付けられた MAC アドレスが変更されたことをクライアントに通知します。
ほとんどのクライアントオペレーティングシステムは、Gratuitous ARP パケットを正しく処理し、隣接キャッシュを迅速に更新します。クライアントがキャッシュを迅速に更新すると、フェイルオーバーは数秒以内に完了します。通常、クライアントは新しいノードに 10 秒以内にフェイルオーバーします。しかし、一部のクライアントオペレーティングシステムは Gratuitous ARP パケットをまったく処理しないか、キャッシュの更新を遅延させる古い実装があります。
Windows、macOS、Linux などの一般的なオペレーティングシステムの新しいバージョンは、レイヤー 2 フェイルオーバーを正しく実装します。フェイルオーバーが遅いという問題は、古くてあまり一般的ではないクライアントオペレーティングシステムを除いて、予期されていません。
古いクライアントで予定されているフェイルオーバーの影響を最小限にするには、リーダーシップをフラップした後に、古いノードを数分にわたって実行したままにします。古いノードは、キャッシュが更新されるまで、古いクライアントのトラフィックを転送することができます。
予定外のフェイルオーバー時に、古いクライアントがキャッシュエントリーを更新するまでサービス IP に到達できません。
5.1.7.2.3. 追加ネットワークと MetalLB は同じネットワークを使用できない リンクのコピーリンクがクリップボードにコピーされました!
MetalLB とソース Pod 上に設定された追加のネットワークインターフェイスの両方に同じ VLAN を使用すると、接続エラーが発生する可能性があります。これは、MetalLB IP とソース Pod が同じノード上に存在する場合に発生します。
接続エラーを回避するには、ソース Pod が存在するサブネットとは異なるサブネットに MetalLB IP を配置します。この設定により、ソース Pod からのトラフィックがデフォルトゲートウェイを経由するようになります。その結果、トラフィックは OVN オーバーレイネットワークを使用して宛先に到達でき、接続が確実に意図したとおりに機能するようになります。
5.1.7.3. BGP モードの制限 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform の MetalLB ボーダーゲートウェイプロトコル (BGP) モードでは、BGP セッションが終了したときにアクティブな接続をリセットすることができ、すべての BGP ピアに対して単一の ASN とルーター ID を必要とします。BGP ピアを追加する際は、ノードセレクターを使用して BGP セッションを実行するノードを制限し、ノード障害の影響を軽減してください。
5.1.7.3.1. ノードに障害が発生すると、アクティブなすべての接続が切断される可能性があります リンクのコピーリンクがクリップボードにコピーされました!
MetalLB には、BGP ベースのロードバランシングに共通する制限があります。ノードに障害が発生した場合や speaker Pod が再起動した場合など、BGP セッションが中断されると、すべてのアクティブな接続がリセットされる可能性があります。エンドユーザーに、Connection reset by peer のメッセージが表示される可能性があります。
BGP セッションが中断された場合にどうなるかは、各ルーターの製造元の実装によります。ただし、speaker Pod の数を変更すると、BGP セッションの数に影響し、BGP ピアとのアクティブな接続が切断されることが予想されます。
サービスの中断の可能性を回避または低減するために、BGP ピアの追加時にノードセレクターを指定できます。BGP セッションを開始するノードの数を制限すると、BGP セッションのないノードでの障害が発生しても、サービスへの接続に影響はありません。
5.1.7.3.2. 単一の ASN とルーター ID のみのサポート リンクのコピーリンクがクリップボードにコピーされました!
BGP ピアカスタムリソースを追加するときは、spec.myASN フィールドを指定して、MetalLB が属する AS 番号 (ASN) を特定します。OpenShift Container Platform は、MetalLB を使用した BGP の実装を使用しますが、この実装は MetalLB が単一の ASN に所属する必要があります。BGP ピアを追加し、spec.myASN に既存の BGP ピアカスタムリソースとは異なる値を指定しようとするとエラーが発生します。
同様に、BGP ピアカスタムリソースを追加する場合には、spec.routerID フィールドはオプションです。このフィールドに値を指定する場合は、追加する他の BGP ピアカスタムリソースすべてに、同じ値を指定する必要があります。
単一の ASN と単一のルーター ID のサポートに制限がある点が、コミュニティーがサポートする MetalLB の実装との違いです。
5.2. MetalLB Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、MetalLB Operator を追加して、クラスター上の MetalLB インスタンスのライフサイクルを Operator によって管理できます。
MetalLB および IP フェイルオーバーは互換性がありません。クラスターに IP フェイルオーバーを設定した場合は、Operator をインストールする前に IP フェイルオーバーを削除する 手順を実行してください。
5.2.1. Web コンソールを使用したソフトウェアカタログからの MetalLB Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、OpenShift Container Platform Web コンソールを使用して MetalLB Operator をインストールできます。
前提条件
-
cluster-admin権限を持つユーザーとしてログインしている。
手順
- OpenShift Container Platform Web コンソールで、Ecosystem → Software Catalog に移動します。
キーワードを Filter by keyword ボックスに入力するか、目的の Operator までスクロールします。たとえば、
metallbと入力して MetalLB Operator を見つけます。また、インフラストラクチャー機能 でオプションをフィルターすることもできます。たとえば、非接続環境 (ネットワークが制限された環境ともしても知られる) で機能する Operator を表示するには、Disconnected を選択します。
- Install Operator ページで、デフォルトを受け入れて Install をクリックします。
検証
インストールが正常に行われたことを確認するには、以下を実行します。
- Ecosystem → Installed Operators ページに移動します。
-
Operator が
openshift-operatorsの namespace 内に設置されていることと、その状態がSucceededとなっていることを確認してください。
Operator が正常にインストールされない場合は、Operator のステータスを確認し、ログを確認してください。
-
Ecosystem → Installed Operators ページに移動し、
Status列でエラーまたは失敗の有無を確認します。 -
Workloads → Pods ページにナビゲートし、問題を報告している
openshift-operatorsプロジェクトの Pod のログを確認します。
-
Ecosystem → Installed Operators ページに移動し、
5.2.2. CLI を使用してソフトウェアカタログからインストールする リンクのコピーリンクがクリップボードにコピーされました!
Web コンソールを使用せずに OpenShift Container Platform のソフトウェアカタログから MetalLB Operator をインストールするには、OpenShift CLI(oc) を使用できます。
CLI を使用する場合は、metallb-system namespace に Operator をインストールすることを推奨します。
前提条件
- ベアメタルハードウェアにインストールされたクラスター。
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
次のコマンドを入力して、MetalLB Operator の namespace を作成します。
$ cat << EOF | oc apply -f - apiVersion: v1 kind: Namespace metadata: name: metallb-system EOFnamespace に Operator グループのカスタムリソースを作成します。
$ cat << EOF | oc apply -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: metallb-operator namespace: metallb-system EOFOperator グループが namespace にインストールされていることを確認します。
$ oc get operatorgroup -n metallb-system出力例
NAME AGE metallb-operator 14mSubscriptionCR を作成します。SubscriptionCR を定義し、YAML ファイルを保存します (例:metallb-sub.yaml)。apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: metallb-operator-sub namespace: metallb-system spec: channel: stable name: metallb-operator source: redhat-operators sourceNamespace: openshift-marketplace-
spec.sourceパラメーターには、redhat-operators の値を指定する必要があります。
-
SubscriptionCR を作成するには、次のコマンドを実行します。$ oc create -f metallb-sub.yaml
オプション: BGP および BFD メトリックが Prometheus に表示されるようにするには、次のコマンドのように namespace にラベルを付けることができます。
$ oc label ns metallb-system "openshift.io/cluster-monitoring=true"
検証
この検証手順は、MetalLB Operator が metallb-system namespace にインストールされていることを前提としています。
インストール計画が namespace にあることを確認します。
$ oc get installplan -n metallb-system出力例
NAME CSV APPROVAL APPROVED install-wzg94 metallb-operator.4.20.0-nnnnnnnnnnnn Automatic true注記Operator のインストールには数秒かかる場合があります。
Operator がインストールされていることを確認するには、次のコマンドを入力し、Operator に対して出力に
Succeededと表示されていることを確認します。$ oc get clusterserviceversion -n metallb-system \ -o custom-columns=Name:.metadata.name,Phase:.status.phase
5.2.3. クラスターでの MetalLB の起動 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform に MetalLB Operator をインストールした後、クラスター上で MetalLB を起動するには、単一の MetalLB カスタムリソースを作成します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - MetalLB Operator がインストールされている。
手順
MetalLB カスタムリソースの単一のインスタンスを作成します。
$ cat << EOF | oc apply -f - apiVersion: metallb.io/v1beta1 kind: MetalLB metadata: name: metallb namespace: metallb-system EOF-
metdata.namespaceパラメーターについては、Web コンソールを使用して MetalLB Operator をインストールした場合は、metallb-system をopenshift-operatorsに置き換えてください。
-
検証
MetalLB コントローラーのデプロイメントと、MetalLB スピーカーのデーモンセットが実行していることを確認します。
コントローラーのデプロイメントが稼働していることを検証します。
$ oc get deployment -n metallb-system controller出力例
NAME READY UP-TO-DATE AVAILABLE AGE controller 1/1 1 1 11mスピーカーに設定されているデーモンが実行されていることを検証します。
$ oc get daemonset -n metallb-system speaker出力例
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE speaker 6 6 6 6 6 kubernetes.io/os=linux 18mこの出力例は、6 つの speaker Pod を示しています。クラスターの speaker Pod の数は出力例とは異なる場合があります。出力で各ノードの 1 つの Pod が表示されることを確認します。
5.2.4. MetalLB のデプロイメント仕様 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB カスタムリソースのデプロイメント仕様は、OpenShift Container Platform 上で MetalLB コントローラー および スピーカー Pod がどのようにデプロイおよび実行されるかを制御します。
デプロイメント仕様を使用して、以下のタスクを管理します。
- MetalLB Pod デプロイメントのノードの選択
- Pod の優先順位および Pod のアフィニティーを使用したケジューリングの管理
- MetalLB Pod の CPU 制限の割り当て
- MetalLB Pod のコンテナー RuntimeClass の割り当て
- MetalLB Pod のメタデータの割り当て
5.2.4.1. speaker Pod の特定のノードへの限定 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB カスタムリソースでノードセレクターを設定することで、OpenShift Container Platform 内の特定のノードに MetalLB スピーカー Pod を限定できます。スピーカー Pod を実行しているノードのみがロードバランサーの IP アドレスを公開するため、MetalLB トラフィックを処理するノードを制御できます。
speaker Pod を特定のノードに制限する最も一般的な理由として、特定のネットワークにネットワークインターフェイスがあるノードのみがロードバランサーの IP アドレスをアドバタイズするようにすることが挙げられます。
speaker Pod を特定のノードに制限し、サービスの外部トラフィックポリシーに local を指定する場合は、サービスのアプリケーション Pod が同じノードにデプロイされていることを確認する必要があります。
スピーカー Pod をワーカーノードに制限するための設定例
apiVersion: metallb.io/v1beta1
kind: MetalLB
metadata:
name: metallb
namespace: metallb-system
spec:
nodeSelector:
node-role.kubernetes.io/worker: ""
speakerTolerations:
- key: "Example"
operator: "Exists"
effect: "NoExecute"
-
この設定例では、
spec.nodeSelectorフィールドによってスピーカーPod がワーカーノードに割り当てられます。ノードに割り当てたラベル、または有効なノードセレクターを指定できます。 -
この設定例では、この許容範囲が関連付けられている
spec.speakerTotolerationspod は、オペレーター値を使用して、キーと効果の値に一致するすべての taint を許容します。
spec.nodeSelector フィールドを使用してマニフェストを適用した後、oc get daemonset -n metallb-system speaker コマンドを使用して、Operator がデプロイした Pod の数を確認できます。同様に、oc get nodes -l node-role.kubernetes.io/worker= のようなコマンドを使用して、ラベルに一致するノードを表示できます。
オプションで、アフィニティールールを使用して、ノードがどの speaker Pod をスケジュールするか、スケジュールしないかを制御することができます。また、toleration の一覧を適用してこれらの Pod を制限することもできます。アフィニティールール、テイント、および容認の詳細は、追加のリソースを参照してください。
5.2.4.2. MetalLB デプロイメントでの Pod の優先順位および Pod アフィニティーの設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で MetalLB コントローラーおよび スピーカー Pod のスケジューリングを制御するには、MetalLB カスタムリソースで Pod の優先度と Pod アフィニティーを割り当てることができます。MetalLB 仕様で PriorityClass を作成し、priorityClassName と affinity を設定してから、その設定を適用します。
Pod の優先順位は、ノード上の Pod の相対的な重要度を示し、この優先順位に基づいて Pod をスケジュールします。controller または speaker Pod に高い優先順位を設定して、ノード上の他の Pod よりも優先的にスケジューリングされるようにします。
Pod のアフィニティーは Pod 間の関係を管理します。Pod のアフィニティーを controller または speaker Pod に割り当て、スケジューラーが Pod 関係のコンテキストで Pod を配置するノードを制御します。たとえば、Pod アフィニティールールを使用して、複数の特定 Pod を同じノードまたは別のノードに配置するようにできます。これにより、ネットワーク通信が改善され、これらのコンポーネント間の遅延が縮小されます。
前提条件
-
cluster-admin権限を持つユーザーとしてログインしている。 - MetalLB Operator がインストールされている。
- クラスター上で MetalLB Operator を開始している。
手順
myPriorityClass.yamlなどのPriorityClassカスタムリソースを作成して、優先度レベルを設定します。この例では、high-priorityという名前のPriorityClassを、値1000000で定義します。この優先クラスが割り当てられた Pod は、スケジューリングにおいて、それより低い優先クラスの Pod より優先順位が高いとみなされます。apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000PriorityClassカスタムリソース設定を適用します。$ oc apply -f myPriorityClass.yamlMetalLBPodConfig.yamlなどのMetalLBカスタムリソースを作成して、priorityClassNameとpodAffinityの値を指定します。apiVersion: metallb.io/v1beta1 kind: MetalLB metadata: name: metallb namespace: metallb-system spec: logLevel: debug controllerConfig: priorityClassName: high-priority affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: metallb topologyKey: kubernetes.io/hostname speakerConfig: priorityClassName: high-priority affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: metallb topologyKey: kubernetes.io/hostnameここでは、以下のようになります。
spec.controllerConfig.priorityClassName-
MetalLB コントローラー Pod の優先クラスを指定します。この場合、
high-priorityに設定されます。 spec.controllerConfig.affinity.podAffinity-
Pod アフィニティールールを設定していることを指定します。これらのルールは、他の Pod またはノードに関連して Pod がどのようにスケジュールされるかを決定します。この設定は、
app: metallbラベルを持つ Pod を同じホスト名を共有するノードにスケジュールするようにスケジューラーに指示します。これは、MetalLB 関連の Pod を同じノード上に配置するのに役立ち、これらの Pod 間のネットワーク通信、遅延、リソース使用量を最適化できる可能性があります。
以下のコマンドを実行して、
MetalLB のカスタムリソース設定を適用します。$ oc apply -f MetalLBPodConfig.yaml
検証
metallb-systemnamespace の Pod に割り当てた優先クラスを表示するには、次のコマンドを実行します。$ oc get pods -n metallb-system -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName出力例
NAME PRIORITY controller-584f5c8cd8-5zbvg high-priority metallb-operator-controller-manager-9c8d9985-szkqg <none> metallb-operator-webhook-server-c895594d4-shjgx <none> speaker-dddf7 high-priorityスケジューラーが Pod のアフィニティールールに従って Pod を配置したことを確認するには、Pod のノードのメタデータを表示します。以下に例を示します。
$ oc get pod -o=custom-columns=NODE:.spec.nodeName,NAME:.metadata.name -n metallb-system
5.2.4.3. MetalLB デプロイメントでの Pod CPU 制限の設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で MetalLB を実行しているノード上のコンピュートリソースを管理するには、MetalLB カスタムリソースで コントローラー Pod と スピーカー Pod に CPU 制限を割り当てることができます。これにより、ノード上のすべての Pod が、ワークロードの管理とクラスターの保守に必要なコンピュートリソースを確実に確保できます。
前提条件
-
cluster-admin権限を持つユーザーとしてログインしている。 - MetalLB Operator がインストールされている。
手順
CPULimits.yamlなどのMetalLBカスタムリソースファイルを作成し、コントローラーおよびspeakerPod のcpu値を指定します。apiVersion: metallb.io/v1beta1 kind: MetalLB metadata: name: metallb namespace: metallb-system spec: logLevel: debug controllerConfig: resources: limits: cpu: "200m" speakerConfig: resources: limits: cpu: "300m"MetalLBカスタムリソース設定を適用します。$ oc apply -f CPULimits.yaml
検証
Pod のコンピューティングリソースを表示するには、次のコマンドを実行し、
<pod_name>をターゲット Pod に置き換えます。$ oc describe pod <pod_name>
5.3. MetalLB Operator のアップグレード リンクのコピーリンクがクリップボードにコピーされました!
MetalLBOperator の サブスクリプション カスタムリソース (CR) は、Operator を自動的にアップグレードするか手動でアップグレードするかを管理するために使用されます。
デフォルトでは、Subscription CR は名前空間を metallb-system に割り当て、installPlanApproval パラメーターを自動的に Automatic に設定します。そのため、Red Hat が提供する Operator カタログに MetalLB Operator の新しいバージョンが含まれている場合、その MetalLB Operator は自動的にアップグレードされます。
MetalLB Operator のアップグレードを手動で制御する必要がある場合は、installPlanApproval パラメーターを Manual に設定します。
5.3.1. MetalLB Operator の手動アップグレード リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で MetalLB Operator のアップグレードを手動で制御するには、Subscription カスタムリソースで installPlanApproval を Manual に設定し、インストールプランを承認します。次に、ClusterServiceVersion の ステータスを使用してアップグレードを確認します。
前提条件
- クラスターを最新の z-stream リリースに更新した。
- ソフトウェアカタログを使用して MetalLB Operator をインストールした。
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスします。
手順
次のコマンドを入力して、
metallb-systemnamespace 内のmetallb-operatorサブスクリプションの YAML 定義を取得します。$ oc -n metallb-system get subscription metallb-operator -o yamlinstallPlanApprovalパラメーターをManualに設定して、SubscriptionCR を編集します。apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: metallb-operator namespace: metallb-system # ... spec: channel: stable installPlanApproval: Manual name: metallb-operator source: redhat-operators sourceNamespace: openshift-marketplace # ...次のコマンドを入力して、最新の OpenShift Container Platform 4.20 バージョンの MetalLB Operator を見つけます。
$ oc -n metallb-system get csv次のコマンドを入力して、namespace に存在するインストールプランを確認します。
$ oc -n metallb-system get installplan手動インストールプランとして install-tsz2g が表示された出力例
NAME CSV APPROVAL APPROVED install-shpmd metallb-operator.v4.20.0-202502261233 Automatic true install-tsz2g metallb-operator.v4.20.0-202503102139 Manual false次のコマンドを入力して、namespace に存在するインストールプランを編集します。
<name_of_installplan>は、install-tsz2gなどのインストールプランの名前に置き換えてください。$ oc edit installplan <name_of_installplan> -n metallb-systemエディターでインストールプランを開いた状態で、
spec.approvalパラメーターをManualに設定し、spec.approvedパラメーターをtrueに設定します。注記インストールプランを編集すると、アップグレード操作が開始します。アップグレード操作中に
oc -n metallb-system get csvコマンドを入力すると、出力にReplacingまたはPendingステータスが表示される場合があります。
検証
Operator がアップグレードされたことを確認するには、次のコマンドを入力し、、Operator に対して出力に
Succeededと表示されていることを確認します。$ oc -n metallb-system get csv
5.3.2. 関連情報 リンクのコピーリンクがクリップボードにコピーされました!
第6章 OpenShift Container Platform における Cluster Network Operator リンクのコピーリンクがクリップボードにコピーされました!
Cluster Network Operator を使用すると、OpenShift Container Platform のネットワークを管理できます。これには、ステータスの表示方法、IP 転送の有効化、ログの収集方法などが含まれます。
Cluster Network Operator (CNO) を使用すると、インストール時にクラスター用に選択された Container Network Interface (CNI) ネットワークプラグインを含む、OpenShift Container Platform クラスター上のクラスターネットワークコンポーネントをデプロイおよび管理できます。
6.1. Cluster Network Operator リンクのコピーリンクがクリップボードにコピーされました!
Cluster Network Operator は、operator.openshift.io API グループから network API を実装します。Operator は、デーモンセットを使用して、クラスターのインストール中に選択した OVN-Kubernetes ネットワークプラグインまたはネットワークプロバイダープラグインをデプロイします。
Cluster Network Operator は、インストール時に Kubernetes Deployment としてデプロイされます。
手順
以下のコマンドを実行して Deployment のステータスを表示します。
$ oc get -n openshift-network-operator deployment/network-operator出力例
NAME READY UP-TO-DATE AVAILABLE AGE network-operator 1/1 1 1 56m以下のコマンドを実行して、Cluster Network Operator の状態を表示します。
$ oc get clusteroperator/network出力例
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE network 4.16.1 True False False 50m以下のフィールドは、Operator のステータス (
AVAILABLE、PROGRESSING、およびDEGRADED) に関する情報を提供します。AVAILABLEフィールドは、Cluster Network Operator が Available ステータス条件を報告する場合にTrueになります。
6.2. クラスターネットワーク設定の表示 リンクのコピーリンクがクリップボードにコピーされました!
ネットワーク設定ファイル network.config/cluster リソースに対して oc describe コマンドを実行すると、OpenShift Container Platform クラスターのネットワーク設定を表示できます。
手順
oc describeコマンドを使用して、クラスターネットワーク設定を表示します。$ oc describe network.config/cluster出力例
Name: cluster Namespace: Labels: <none> Annotations: <none> API Version: config.openshift.io/v1 Kind: Network Metadata: Creation Timestamp: 2024-08-08T11:25:56Z Generation: 3 Resource Version: 29821 UID: 808dd2be-5077-4ff7-b6bb-21b7110126c7 Spec: Cluster Network: Cidr: 10.128.0.0/14 Host Prefix: 23 External IP: Policy: Network Diagnostics: Mode: Source Placement: Target Placement: Network Type: OVNKubernetes Service Network: 172.30.0.0/16 Status Cluster Network: Cidr: 10.128.0.0/14 Host Prefix: 23 Cluster Network MTU: 1360 Conditions: Last Transition Time: 2024-08-08T11:51:50Z Message: Observed Generation: 0 Reason: AsExpected Status: True Type: NetworkDiagnosticsAvailable Network Type: OVNKubernetes Service Network: 172.30.0.0/16 Events: <none>ここでは、以下のようになります。
spec- クラスターネットワークの設定状態を表示するフィールドを指定します。
ステータス- クラスターネットワーク設定の現在の状態を表示します。
6.3. Cluster Network Operator のステータス表示 リンクのコピーリンクがクリップボードにコピーされました!
oc describe コマンドを使用すると、Cluster Network Operator の状態を確認したり、詳細を表示したりできます。
手順
以下のコマンドを実行して、Cluster Network Operator のステータスを表示します。
$ oc describe clusteroperators/network
6.4. IP 転送をグローバルに有効にする リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform 4.14 以降、OVN-Kubernetes はデフォルトでグローバル IP フォワーディングを無効にします。Cluster Network Operator の gatewayConfig.ipForwarding 仕様を Global に設定することで、クラスター全体での転送を有効にできます。
手順
次のコマンドを実行して、既存のネットワーク設定をバックアップします。
$ oc get network.operator cluster -o yaml > network-config-backup.yaml次のコマンドを実行して、既存のネットワーク設定を変更します。
$ oc edit network.operator cluster次の例に示すように、
specの下に次のブロックを追加または更新します。spec: clusterNetwork: - cidr: 10.128.0.0/14 hostPrefix: 23 serviceNetwork: - 172.30.0.0/16 networkType: OVNKubernetes clusterNetworkMTU: 8900 defaultNetwork: ovnKubernetesConfig: gatewayConfig: ipForwarding: Global- ファイルを保存してから閉じます。
変更を適用した後、OpenShift Cluster Network Operator (CNO) によってクラスター全体に更新が適用されます。次のコマンドを使用して進行状況を監視できます。
$ oc get clusteroperators network最終的に、ステータスに
Available、Progressing=False、Degraded=Falseと報告されるはずです。または、次のコマンドを実行して、IP 転送をグローバルに有効にすることもできます。
$ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}' --type=merge注記この変更を元に戻す必要がある場合は、このパラメーターのもう 1 つの有効なオプションである
Restrictedを設定します。デフォルトではRestrictedに設定されており、グローバル IP アドレス転送は無効です。
6.5. Cluster Network Operator ログの表示 リンクのコピーリンクがクリップボードにコピーされました!
oc logs コマンドを使用して、Cluster Network Operator ログを表示できます。
手順
以下のコマンドを実行して、Cluster Network Operator のログを表示します。
$ oc logs --namespace=openshift-network-operator deployment/network-operator
6.6. Cluster Network Operator の設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスターネットワークを管理するには、Cluster Network Operator (CNO) ネットワーク カスタムリソース (CR) の cluster という名前を設定し、クラスターが適切な IP 範囲とネットワークプラグイン設定を使用して、Pod とサービスの信頼性の高い接続を実現するようにします。一部の設定とフィールドは、インストール時または デフォルトの Network.type プラグイン、OVN-Kubernetes によって継承されます。
CNO 設定は、Network.config.openshift.io API グループの Network API からクラスターのインストール時に以下のフィールドを継承します。
clusterNetwork- Pod IP アドレスの割り当てに使用する IP アドレスプール。
serviceNetwork- サービスの IP アドレスプール。
defaultNetwork.type-
クラスターネットワークプラグイン。
OVNKubernetesは、インストール時にサポートされる唯一のプラグインです。
クラスターをインストールした後は、clusterNetwork IP アドレス範囲のみ変更できます。
defaultNetwork オブジェクトのフィールドを cluster という名前の CNO オブジェクトに設定することにより、クラスターのクラスターネットワークプラグイン設定を指定できます。
6.6.1. Cluster Network Operator 設定オブジェクト リンクのコピーリンクがクリップボードにコピーされました!
Cluster Network Operator (CNO) のフィールドは以下の表で説明されています。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
CNO オブジェクトの名前。この名前は常に |
|
|
| Pod IP アドレスの割り当て、サブネット接頭辞の長さのクラスター内の個別ノードへの割り当てに使用される IP アドレスのブロックを指定するリストです。以下に例を示します。
|
|
|
| サービスの IP アドレスのブロック。OVN-Kubernetes ネットワークプラグインは、サービスネットワークに対して単一の IP アドレスブロックのみをサポートします。以下に例を示します。
この値は読み取り専用であり、クラスターのインストール時に |
|
|
| クラスターネットワークのネットワークプラグインを設定します。 |
|
|
|
この設定により、動的ルーティングプロバイダーが有効になります。ルートアドバタイズ機能には、FRR ルーティング機能プロバイダーが必要です。サポートされている値は
|
複数のネットワークにオブジェクトをデプロイする必要があるクラスターの場合は、install-config.yaml ファイルで定義されている各ネットワークタイプの clusterNetwork.hostPrefix パラメーターに、必ず同じ値を指定してください。clusterNetwork.hostPrefix パラメーターにそれぞれ異なる値を設定すると、OVN-Kubernetes ネットワークプラグインに影響が及び、異なるノード間のオブジェクトトラフィックをプラグインが効果的にルーティングできなくなる可能性があります。
6.6.2. defaultNetwork オブジェクト設定 リンクのコピーリンクがクリップボードにコピーされました!
defaultNetwork オブジェクトの値は、以下の表で定義されます。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
注記 OpenShift Container Platform は、デフォルトで OVN-Kubernetes ネットワークプラグインを使用します。 |
|
|
| このオブジェクトは、OVN-Kubernetes ネットワークプラグインに対してのみ有効です。 |
6.6.3. OVN-Kubernetes ネットワークプラグインの設定 リンクのコピーリンクがクリップボードにコピーされました!
次の表では、OVN-Kubernetes ネットワークプラグインの設定フィールドを説明します。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
| Geneve (Generic Network Virtualization Encapsulation) オーバーレイネットワークの MTU (maximum transmission unit)。通常、この値は自動的に設定されます。 |
|
|
| Geneve オーバーレイネットワークの UDP ポート。 |
|
|
| クラスターの IPsec モードを示すオブジェクト。 |
|
|
| IPv4 設定の設定オブジェクトを指定します。 |
|
|
| IPv6 設定の設定オブジェクトを指定します。 |
|
|
| ネットワークポリシー監査ロギングをカスタマイズする設定オブジェクトを指定します。指定されていない場合は、デフォルトの監査ログ設定が使用されます。 |
|
|
|
クラスターネットワークルートをアドバタイズするかどうかを指定します。デフォルト値は、
|
|
|
|
オプション: Egress トラフィックのノードゲートウェイへの送信方法をカスタマイズするための設定オブジェクトを指定します。有効な値は 注記 Egress トラフィックの移行中は、Cluster Network Operator (CNO) が変更を正常にロールアウトするまで、ワークロードとサービストラフィックに多少の中断が発生することが予想されます。 |
| フィールド | 型 | 説明 |
|---|---|---|
|
| string |
既存のネットワークインフラストラクチャーが
デフォルト値は |
|
| string |
既存のネットワークインフラストラクチャーが
デフォルト値は |
| フィールド | 型 | 説明 |
|---|---|---|
|
| string |
既存のネットワークインフラストラクチャーが
デフォルト値は |
|
| string |
既存のネットワークインフラストラクチャーが
デフォルト値は |
| フィールド | 型 | 説明 |
|---|---|---|
|
| integer |
ノードごとに毎秒生成されるメッセージの最大数。デフォルト値は、1 秒あたり |
|
| integer |
監査ログの最大サイズ (バイト単位)。デフォルト値は |
|
| integer | 保持されるログファイルの最大数。 |
|
| string | 以下の追加の監査ログターゲットのいずれかになります。
|
|
| string |
RFC5424 で定義される |
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
Pod からホストネットワークスタックへの Egress トラフィックを送信するには、このフィールドを
このフィールドで、Open vSwitch ハードウェアオフロード機能との対話が可能になりました。このフィールドを |
|
|
|
注記
デフォルト値の |
|
|
| オプション: IPv4 アドレスのホストからサービスへのトラフィック用の内部 OVN-Kubernetes マスカレードアドレスを設定するオブジェクトを指定します。 |
|
|
| オプション: IPv6 アドレスのホストからサービスへのトラフィックの内部 OVN-Kubernetes マスカレードアドレスを設定するオブジェクトを指定します。 |
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
ホストからサービスへのトラフィックを有効にするために内部的に使用されるマスカレード IPv4 アドレス。ホストは、これらの IP アドレスと共有ゲートウェイブリッジインターフェイスを使用して設定されます。デフォルト値は 重要
OpenShift Container Platform 4.17 以降のバージョンでは、クラスターはデフォルトのマスカレードサブネットとして |
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
ホストからサービスへのトラフィックを有効にするために内部的に使用されるマスカレード IPv6 アドレス。ホストは、これらの IP アドレスと共有ゲートウェイブリッジインターフェイスを使用して設定されます。デフォルト値は 重要
OpenShift Container Platform 4.17 以降のバージョンでは、クラスターはデフォルトのマスカレードサブネットとして |
| フィールド | 型 | 説明 |
|---|---|---|
|
|
| IPsec 実装の動作を指定します。次の値のいずれかである必要があります。
|
クラスターのインストール中にのみクラスターネットワークプラグインの設定を変更できます。ただし、インストール後のアクティビティーとして実行時に変更できる gatewayConfig フィールドは除きます。
IPSec が有効な OVN-Kubernetes 設定の例
defaultNetwork:
type: OVNKubernetes
ovnKubernetesConfig:
mtu: 1400
genevePort: 6081
ipsecConfig:
mode: Full
6.6.4. Cluster Network Operator の設定例 リンクのコピーリンクがクリップボードにコピーされました!
以下の例では、詳細な CNO 設定が指定されています。
Cluster Network Operator オブジェクトのサンプル
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
clusterNetwork:
- cidr: 10.128.0.0/14
hostPrefix: 23
serviceNetwork:
- 172.30.0.0/16
networkType: OVNKubernetes
第7章 OpenShift Container Platform の DNS Operator リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform の DNS Operator は、CoreDNS インスタンスをデプロイおよび管理して、クラスター内の Pod に名前解決サービスを提供し、DNS ベースの Kubernetes Service 検出を有効にし、内部の cluster.local 名を解決します。
7.1. DNS Operator のステータスの確認 リンクのコピーリンクがクリップボードにコピーされました!
DNS Operator のデプロイメントとクラスター Operator ーのステータスを確認できます。DNS Operator は、インストール時に Deployment オブジェクトを使用してデプロイされます。
DNS Operator は、operator.openshift.io API グループから dns API を実装します。この Operator は、デーモンセットを使用して CoreDNS をデプロイし、デーモンセットのサービスを作成し、kubelet を Pod に対して名前解決に CoreDNS サービス IP を使用するように指示するように設定します。
手順
oc getコマンドを使用してデプロイメントのステータスを表示します。$ oc get -n openshift-dns-operator deployment/dns-operator出力例
NAME READY UP-TO-DATE AVAILABLE AGE dns-operator 1/1 1 1 23hoc getコマンドを使用して DNS Operator の状態を表示します。$ oc get clusteroperator/dns出力例
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE dns 4.1.15-0.11 True False False 92mAVAILABLE、PROGRESSING、およびDEGRADEDは、Operator のステータスに関する情報を示します。AVAILABLEがTrueになるのは、CoreDNS デーモンセットの 1 つ以上の Pod がAVAILABLEステータス条件を報告し、DNS サービスがクラスター IP アドレスを持っている場合です。
7.2. デフォルト DNS の表示 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトの DNS リソースとクラスター DNS の設定を表示して、DNS 設定を確認したり、DNS の問題をトラブルシューティングしたりできます。
すべての新規 OpenShift Container Platform インストールには、default という名前の dns.operator があります。
手順
oc describeコマンドを使用してデフォルトのdnsを表示します。$ oc describe dns.operator/default出力例
Name: default Namespace: Labels: <none> Annotations: <none> API Version: operator.openshift.io/v1 Kind: DNS ... Status: Cluster Domain: cluster.local Cluster IP: 172.30.0.10 ...ここでは、以下のようになります。
ステータス.クラスタードメイン- 完全修飾された Pod およびサービスドメイン名を構築するために使用されるベース DNS ドメインを指定します。
ステータス。クラスター IP- Pod が名前解決のために照会するアドレスを指定します。IP は、サービス CIDR 範囲の 10 番目のアドレスで定義されます。
クラスターのサービス CIDR 範囲 (
172.30.0.0/16など) を確認するには、oc getコマンドを使用します。$ oc get networks.config/cluster -o jsonpath='{$.status.serviceNetwork}'
7.3. DNS 転送の使用 リンクのコピーリンクがクリップボードにコピーされました!
クラスターの DNS 転送サーバーとアップストリームリゾルバーを設定します。
次の方法で、DNS 転送を使用して /etc/resolv.conf ファイル内のデフォルトの転送設定をオーバーライドできます。
-
すべてのゾーンにネームサーバー (
spec.servers) を指定します。転送されるゾーンが OpenShift Container Platform によって管理される Ingress ドメインである場合、そのドメインに対してアップストリームのネームサーバーが許可されている必要があります。 -
アップストリーム DNS サーバーのリスト (
spec.upstreamResolvers) を指定します。 - デフォルトの転送ポリシーを変更します。
デフォルトドメインの DNS 転送設定には、/etc/resolv.conf ファイルおよびアップストリーム DNS サーバーで指定されたデフォルトのサーバーの両方を設定できます。
手順
defaultという名前の DNS Operator オブジェクトを変更します。$ oc edit dns.operator/default上記のコマンドを実行すると、Operator が、
spec.serversに基づく追加のサーバー設定ブロックを使用してdns-defaultという名前の config map を作成および更新します。クエリーに一致するゾーンがサーバーにない場合には、名前解決はアップストリーム DNS サーバーにフォールバックします。DNS 転送の設定
apiVersion: operator.openshift.io/v1 kind: DNS metadata: name: default spec: cache: negativeTTL: 0s positiveTTL: 0s logLevel: Normal nodePlacement: {} operatorLogLevel: Normal servers: - name: example-server zones: - example.com forwardPlugin: policy: Random upstreams: - 1.1.1.1 - 2.2.2.2:5353 upstreamResolvers: policy: Random protocolStrategy: "" transportConfig: {} upstreams: - type: SystemResolvConf - type: Network address: 1.2.3.4 port: 53 status: clusterDomain: cluster.local clusterIP: x.y.z.10 conditions: ...ここでは、以下のようになります。
spec.servers.name-
rfc6335サービス名の構文に準拠する必要があります。 仕様サーバーゾーン-
RFC1123 のサブドメイン構文に準拠する必要があります。クラスタードメインcluster.localはゾーンに対して無効です。 spec.servers.forwardPlugin.policy-
上流選択ポリシーを指定します。デフォルトは
Randomです。指定可能な値はRoundRobinとSequentialです。 spec.servers.forwardPlugin.upstreams-
forwardPluginごとに 15 個を超えるアップストリームエントリーを指定しないでください。 spec.upstreamResolvers.upstreams-
デフォルトの転送ポリシーを上書きし、デフォルトドメインの DNS 解決を指定された DNS リゾルバー (アップストリームリゾルバー) に転送するために、
upstreamResolvers を指定します。カスタムのアップストリームリゾルバーが必要な場合にこのフィールドを使用できます。それ以外の場合は、クエリーは/etc/resolv.confで宣言されているサーバーを使用します。 spec.upstreamResolvers.policy-
上流の選択順序を指定します。デフォルトは
Sequentialです。許可される値はRandom、RoundRobin、Sequentialです。 spec.upstreamResolvers.protocolStrategy-
リクエストが UDP を使用している場合でも、アップストリーム DNS リクエストに使用するプロトコルとして TCP を指定すると、強制的に
TCP が使用されます。有効な値はTCPと省略された値です。省略すると、デフォルト (通常は元のクライアント要求のプロトコル) が選択されます。 spec.upstreamResolvers.transportConfig- DNS リクエストをアップストリームのリゾルバーに転送する際に使用するトランスポートタイプ、サーバー名、およびオプションのカスタム CA または CA バンドルを指定します。
spec.upstreamResolvers.upstreams.type-
2 種類の
アップストリームを指定します:SystemResolvConfまたはNetwork。SystemResolvConfで、アップストリームが/etc/resolv.confを使用するように設定して、NetworkでNetworkresolverを定義します。1 つまたは両方を指定できます。 spec.upstreamResolvers.upstreams.address-
タイプが
ネットワークの場合、有効な IPv4 または IPv6 アドレスを指定します。 spec.upstreamResolvers.upstreams.port-
ポート番号を指定するためのオプションフィールドを指定します。有効な値は
1-65535です。省略した場合はデフォルト値として 853 が使用されます。
7.4. DNS Operator のステータスの確認 リンクのコピーリンクがクリップボードにコピーされました!
oc describe コマンドを使用すると、DNSOperator の状態を確認したり、詳細を表示したりできます。
手順
DNS Operator のステータスを表示します。
$ oc describe clusteroperators/dnsメッセージとスペルはリリースによって異なる場合がありますが、期待されるステータス出力は次のようになります。
Status: Conditions: Last Transition Time: <date> Message: DNS "default" is available. Reason: AsExpected Status: True Type: Available Last Transition Time: <date> Message: Desired and current number of DNSes are equal Reason: AsExpected Status: False Type: Progressing Last Transition Time: <date> Reason: DNSNotDegraded Status: False Type: Degraded Last Transition Time: <date> Message: DNS default is upgradeable: DNS Operator can be upgraded Reason: DNSUpgradeable Status: True Type: Upgradeable
7.5. DNS Operator のログの表示 リンクのコピーリンクがクリップボードにコピーされました!
oc logs コマンドを使用すると、DNS Operator のログを表示して、DNS の問題のトラブルシューティング、設定変更の確認、アクティビティーの監視を行うことができます。
手順
以下のコマンドを実行して、DNSOperator のログを表示します。
$ oc logs -n openshift-dns-operator deployment/dns-operator -c dns-operator
7.6. CoreDNS ログレベルの設定 リンクのコピーリンクがクリップボードにコピーされました!
CoreDNS のログレベルを設定することで、DNS エラーログの詳細を制御できます。
CoreDNS と CoreDNS Operator のログレベルは、それぞれ異なる方法を使用して設定します。CoreDNS ログレベルを設定して、ログに記録されたエラーメッセージの情報量を決定できます。CoreDNS ログレベルの有効な値は、Normal、Debug、および Trace です。デフォルトの logLevel は Normal です。
CoreDNS のエラーログレベルは常に有効です。次のログレベル設定では、それぞれ異なるエラー応答が報告されます。
-
logLevel:Normalは "errors" class:log . { class error }を有効にします。 -
logLevel:Debugは "denial" class:log . { class denial error }を有効にします。 -
logLevel:Traceは "all" class:log . { class all }を有効にします。
手順
logLevelをDebugに設定するには、次のコマンドを入力します。$ oc patch dnses.operator.openshift.io/default -p '{"spec":{"logLevel":"Debug"}}' --type=mergelogLevelをTraceに設定するには、次のコマンドを入力します。$ oc patch dnses.operator.openshift.io/default -p '{"spec":{"logLevel":"Trace"}}' --type=merge
検証
目的のログレベルが設定されていることを確認するには、config map を確認します。
$ oc get configmap/dns-default -n openshift-dns -o yamlたとえば、
logLevelをTraceに設定すると、各サーバーブロックに次のスタンザが表示されます。errors log . { class all }
7.7. CoreDNS ログの表示 リンクのコピーリンクがクリップボードにコピーされました!
oc logs コマンドを使用すると、CoreDNSPod のログを表示して DNS の問題をトラブルシューティングできます。
手順
特定の CoreDNS Pod のログを表示するには、次のコマンドを入力します。
$ oc -n openshift-dns logs -c dns <core_dns_pod_name>すべての CoreDNS Pod のログを追跡するには、次のコマンドを入力します。
$ oc -n openshift-dns logs -c dns -l dns.operator.openshift.io/daemonset-dns=default -f --max-log-requests=<number>1 -
<number>: ログをストリーミングする DNS Pod の数を指定します。最大は 6 です。
-
7.8. CoreDNS Operator のログレベルの設定 リンクのコピーリンクがクリップボードにコピーされました!
Operator のログレベルを設定することで、OpenShift の DNS に関する問題を迅速に特定できます。
operatorLogLevel の有効な値は、Normal、Debug、および Trace です。Trace には最も詳細にわたる情報が含まれます。デフォルトの operatorlogLevel は Normal です。Operator の問題に関するログレベルは、トレース、デバッグ、情報、警告、エラー、回復不能、パニックの 7 段階です。ログレベルの設定後に、その重大度またはそれを超える重大度のログエントリーがログに記録されます。
-
operatorLogLevel: "Normal"はlogrus.SetLogLevel("Info")を設定します。 -
operatorLogLevel: "Debug"はlogrus.SetLogLevel("Debug")を設定します。 -
operatorLogLevel: "Trace"はlogrus.SetLogLevel("Trace")を設定します。
手順
operatorLogLevelをDebugに設定するには、次のコマンドを入力します。$ oc patch dnses.operator.openshift.io/default -p '{"spec":{"operatorLogLevel":"Debug"}}' --type=mergeoperatorLogLevelをTraceに設定するには、次のコマンドを入力します。$ oc patch dnses.operator.openshift.io/default -p '{"spec":{"operatorLogLevel":"Trace"}}' --type=merge
検証
結果の変更を確認するには、次のコマンドを入力します。
$ oc get dnses.operator -A -oyaml2 つのログレベルのエントリーが表示されるはずです。
operatorLogLevelは OpenShift DNS Operator の問題に適用され、logLevelは CoreDNS Pod のデーモンセットに適用されます。logLevel: Trace operatorLogLevel: Debugデーモンセットのログを確認するには、次のコマンドを入力します。
$ oc logs -n openshift-dns ds/dns-default
7.9. CoreDNS キャッシュのチューニング リンクのコピーリンクがクリップボードにコピーされました!
CoreDNS の場合、成功または失敗したキャッシュ (それぞれポジティブキャッシュまたはネガティブキャッシュとも呼ばれます) の最大期間を設定できます。DNS クエリー応答のキャッシュ期間をチューニングすると、アップストリーム DNS リゾルバーの負荷を軽減できます。
TTL フィールドを低い値に設定すると、クラスター、上流のリゾルバー、またはその両方の負荷が増加する可能性があります。
手順
次のコマンドを実行して、
defaultという名前の DNS Operator オブジェクトを編集します。$ oc edit dns.operator.openshift.io/defaultTime-to-Live (TTL) キャッシュ値を変更します。
DNS キャッシングの設定
apiVersion: operator.openshift.io/v1 kind: DNS metadata: name: default spec: cache: positiveTTL: 1h negativeTTL: 0.5h10mここでは、以下のようになります。
spec.cache.positiveTTL-
CoreDNS によって秒数に変換される文字列値を指定します。このフィールドを省略した場合、値は
0と見なされ、クラスターはフォールバックとして内部デフォルト値の900を使用します。 spec.cache.negativeTTL-
CoreDNS によって秒数に変換される文字列値を指定します。このフィールドを省略した場合、値は
0と見なされ、クラスターはフォールバックとして内部デフォルト値の30を使用します。
検証
変更を確認するには、次のコマンドを実行して config map を再度確認します。
$ oc get configmap/dns-default -n openshift-dns -o yaml次の例のようなエントリーが表示されていることを確認します。
cache 3600 { denial 9984 2400 }
7.9.1. DNS Operator managementState の変更 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトの 管理対象 状態から 管理対象外 状態に変更することで、DNS Operator がリソースを管理するのを停止し、回避策を適用したり、設定変更をテストしたりすることができます。
DNS Operator は、CoreDNS コンポーネントを管理し、クラスター内の Pod とサービスに名前解決サービスを提供します。DNS Operator の managementState は、デフォルトで Managed に設定されます。これは、DNS Operator がそのリソースをアクティブに管理していることを意味します。これを Unmanaged に変更できます。つまり、DNS Operator がそのリソースを管理していないことを意味します。
以下は、DNS Operator managementState を変更するためのユースケースです。
-
開発者は、CoreDNS の問題が修正されているかどうかを確認するために、設定変更をテストする必要があります。
managementStateをUnmanagedに設定することで、DNS Operator による設定変更の上書きを防止できます。 -
クラスター管理者は、CoreDNS の問題を報告していますが、問題が修正されるまで回避策を適用する必要があります。DNS Operator の
managementStateフィールドをUnmanagedに設定して、回避策を適用できます。
managementState が Unmanaged に設定されている間はアップグレードできません。
手順
以下のコマンドを実行して、DNSOperator の
管理状態を管理対象外に変更してください。oc patch dns.operator.openshift.io default --type merge --patch '{"spec":{"managementState":"Unmanaged"}}'jsonpathコマンドライン JSON パーサーを使用して DNS Operator のmanagementStateを確認します。$ oc get dns.operator.openshift.io default -ojsonpath='{.spec.managementState}'
7.9.2. DNS Pod 配置の制御 リンクのコピーリンクがクリップボードにコピーされました!
taint、toleration、セレクターを使用して、CoreDNS および node-resolverPod の実行場所を制御します。
DNS Operator には 2 つのデーモンセットがあります。1 つは CoreDNS 用の dns-default という名前のデーモンセットで、もう 1 つは /etc/hosts ファイルの管理用の node-resolver という名前のデーモンセットです。
指定したノードに CoreDNS Pod を割り当て、そのノード上で実行できます。たとえば、クラスター管理者がノードペア間の通信を禁止するセキュリティーポリシーを設定している場合は、制限されたノードセットで実行するように CoreDNS Pod を設定できます。
次の状況が当てはまる場合、すべての Pod で DNS サービスを使用できます。
- クラスター内の一部のノードで DNS Pod が実行されている。
- DNS Pod が実行されていないノードに、DNS Pod が実行されているノードとのネットワーク接続がある。
node-resolver デーモンセットは、すべてのノードホストで実行する必要があります。このデーモンセットにより、イメージのプルをサポートするクラスターイメージレジストリーのエントリーが追加されるためです。node-resolver Pod には、1 つのジョブのみがあります。コンテナーランタイムがサービス名を解決できるように、image-registry.openshift-image-registry.svc サービスのクラスター IP アドレスを検索し、それをノードホストの /etc/hosts に追加するジョブです。
クラスター管理者は、カスタムノードセレクターを使用して、CoreDNS のデーモンセットを特定のノードで実行するか、実行しないように設定できます。
前提条件
-
ocCLI がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 -
DNS Operator の
managementStateがManagedに設定されている。
手順
CoreDNS のデーモンセットを特定のノードで実行できるようにするために、taint と toleration を設定します。
次のコマンドを入力して、DNS Pod の配置を制御するノードに taint を設定します。
$ oc adm taint nodes <node_name> dns-only=abc:NoExecute-
<node_name>は、ノードの実際の名前に置き換えます。
-
次のコマンドを入力して、
defaultという名前の DNS Operator オブジェクトを、対応する toleration が含まれるように変更します。$ oc edit dns.operator/defaulttaint の taint キーと toleration を指定します。次の toleration は、ノードに設定された taint と一致します。
apiVersion: operator.openshift.io/v1 kind: DNS metadata: name: default spec: nodePlacement: tolerations: - effect: NoExecute key: "dns-only" operator: Equal value: abc tolerationSeconds: 3600-
keyフィールドがdns-onlyに設定されている場合、永久的に許容されます。 -
tolerationSecondsフィールドはオプションです。
-
オプション: ノードセレクターを使用してノードの配置を指定するには、デフォルトの DNS Operator を変更します。
defaultという名前の DNS Operator オブジェクトを編集して、ノードセレクターを含めます。apiVersion: operator.openshift.io/v1 kind: DNS metadata: name: default spec: nodePlacement: nodeSelector: node-role.kubernetes.io/control-plane: ""-
例にある
spec.nodePlacement.nodeSelectorフィールドは、CoreDNS Pod がコントロールプレーンノード上でのみ実行されることを保証します。
-
例にある
7.9.3. TLS を使用した DNS 転送の設定 リンクのコピーリンクがクリップボードにコピーされました!
TLS を使用した DNS 転送を設定することで、アップストリームのリゾルバーへのクエリーを安全に保護できます。
高度に規制された環境で作業する場合は、要求をアップストリームリゾルバーに転送する際に DNS トラフィックのセキュリティーを確保して、追加の DNS トラフィックおよびデータのプライバシーを確保できるようにする必要がある場合があります。
CoreDNS は転送された接続を 10 秒間キャッシュすることに注意してください。要求が発行されない場合、CoreDNS はその 10 秒間、TCP 接続を開いたままにします。
大規模なクラスターでは、ノードごとに接続を開始できるため、DNS サーバーが多くの新しい接続を開いたまま保持する可能性があることを認識しているか確認してください。パフォーマンスの問題を回避するために、それに応じて DNS 階層を設定します。
手順
defaultという名前の DNS Operator オブジェクトを変更します。$ oc edit dns.operator/defaultクラスター管理者は、転送された DNS クエリーに Transport Layer Security (TLS) を設定できるようになりました。
TLS を使用した DNS 転送の設定
apiVersion: operator.openshift.io/v1 kind: DNS metadata: name: default spec: servers: - name: example_server zones: - example.com forwardPlugin: transportConfig: transport: TLS tls: caBundle: name: mycacert serverName: dnstls.example.com policy: Random upstreams: - 1.1.1.1 - 2.2.2.2:5353 upstreamResolvers: transportConfig: transport: TLS tls: caBundle: name: mycacert serverName: dnstls.example.com upstreams: - type: Network address: 1.2.3.4 port: 53ここでは、以下のようになります。
spec.servers.name-
rfc6335サービス名の構文に準拠する必要があります。 仕様サーバーゾーン-
RFC1123 のサブドメイン構文に準拠する必要があります。クラスタードメインcluster.localはゾーンに対して無効です。 spec.servers.forwardPlugin.transportConfig.transport-
TLS 転送を設定する際は、必ず
TLSに設定してください。 spec.servers.forwardPlugin.transportConfig.tls.serverName- 上流の TLS 証明書を検証するために使用されるサーバー名表示 (SNI) サーバー名に設定する必要があります。
spec.servers.forwardPlugin.policy-
上流選択ポリシーを指定します。デフォルトは
Randomです。有効な値はRoundRobinとSequentialです。 spec.servers.forwardPlugin.upstreams-
アップストリームリゾルバーを提供する必要があります
。forwardPluginごとに最大 15 エントリー。 spec.upstreamResolvers.upstreams-
デフォルトドメインのデフォルトポリシーを上書きするためのオプションフィールドを指定します。TLS が有効になっている場合にのみ
ネットワークタイプを使用し、IP アドレスを指定してください。省略した場合、クエリーは/etc/resolv.confを使用します。 spec.upstreamResolvers.upstreams.address- 有効な IPv4 または IPv6 アドレスである必要があります。
spec.upstreamResolvers.upstreams.portポート番号を指定するためのオプションフィールドを指定します。有効な値は
1-65535です。省略した場合はデフォルト値として 853 が使用されます。注記serversが定義されていないか無効な場合、config map にはデフォルトサーバーのみが含まれます。
検証
config map を表示します。
$ oc get configmap/dns-default -n openshift-dns -o yamlTLS 転送の例に基づく DNS ConfigMap のサンプル
apiVersion: v1 data: Corefile: | example.com:5353 { forward . 1.1.1.1 2.2.2.2:5353 } bar.com:5353 example.com:5353 { forward . 3.3.3.3 4.4.4.4:5454 } .:5353 { errors health kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure upstream fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf 1.2.3.4:53 { policy Random } cache 30 reload } kind: ConfigMap metadata: labels: dns.operator.openshift.io/owning-dns: default name: dns-default namespace: openshift-dns-
data.Corefileキーには、DNS サーバーの Corefile 設定が含まれています。forwardPluginへの変更により、CoreDNS デーモンセットのローリング更新がトリガーされます。
-
第8章 OpenShift Container Platform の Ingress Operator リンクのコピーリンクがクリップボードにコピーされました!
Ingress Operator は IngressController API を実装し、OpenShift Container Platform クラスターサービスへの外部アクセスを可能にするコンポーネントです。
8.1. OpenShift Container Platform Ingress Operator リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform クラスターを作成すると、クラスターで実行している Pod およびサービスにはそれぞれ独自の IP アドレスが割り当てられます。IP アドレスは、近くで実行されている他の Pod やサービスからアクセスできますが、外部クライアントの外部からはアクセスできません。
Ingress Operator を使用すると、ルーティングを処理する 1 つ以上の HAProxy ベースの Ingress Controller をデプロイおよび管理することにより、外部クライアントがサービスにアクセスできるようになります。OpenShift Container Platform Route および Kubernetes Ingress リソースを指定して、トラフィックをルーティングするために Ingress Operator を使用します。endpointPublishingStrategy タイプおよび内部負荷分散を定義する機能などの Ingress Controller 内の設定は、Ingress Controller エンドポイントを公開する方法を提供します。
8.2. Ingress 設定アセット リンクのコピーリンクがクリップボードにコピーされました!
インストールプログラムでは、config.openshift.io API グループの Ingress リソースでアセットを生成します (cluster-ingress-02-config.yml)。
Ingress リソースの YAML 定義
apiVersion: config.openshift.io/v1
kind: Ingress
metadata:
name: cluster
spec:
domain: apps.openshiftdemos.com
インストールプログラムは、このアセットを manifests/ ディレクトリーの cluster-ingress-02-config.yml ファイルに保存します。この Ingress リソースは、Ingress のクラスター全体の設定を定義します。この Ingress 設定は、以下のように使用されます。
- Ingress Operator は、クラスター Ingress 設定のドメインを、デフォルト Ingress Controller のドメインとして使用します。
-
OpenShift API Server Operator は、クラスター Ingress 設定からのドメインを使用します。このドメインは、明示的なホストを指定しない
Routeリソースのデフォルトホストを生成する際にも使用されます。
8.3. Ingress Controller 設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
IngressController カスタムリソース (CR) には、組織の特定のニーズを満たすように設定できる任意の設定パラメーターが含まれています。
| パラメーター | 説明 |
|---|---|
|
|
空の場合、デフォルト値は |
|
|
|
|
|
クラウド環境の場合、
Google Cloud、AWS、および Azure では、次の
設定されていない場合、デフォルト値は
ほとんどのプラットフォームでは、
ベアメタルプラットフォームなどの非クラウド環境の場合は、
これらのフィールドのいずれかで値を設定しない場合のデフォルト値は、
クラスターのデプロイ後に、
|
|
|
シークレットには以下のキーおよびデータが含まれる必要があります: *
設定されていない場合、ワイルドカード証明書は自動的に生成され、使用されます。証明書は Ingress コントーラーの 使用中の証明書 (生成されるか、ユーザー指定の場合かを問わない) は OpenShift Container Platform のビルトイン OAuth サーバーに自動的に統合されます。 |
|
|
|
|
|
|
|
|
設定されていない場合は、デフォルト値が使用されます。 注記
|
|
|
これが設定されていない場合、デフォルト値は
Ingress Controller の最小 TLS バージョンは 注記
設定されたセキュリティープロファイルの暗号および最小 TLS バージョンが 重要
Ingress Operator は TLS |
|
|
|
|
|
|
|
|
|
|
|
デフォルトでは、ポリシーは
これらの調整は、クリアテキスト、edge-terminated、および re-encrypt ルートにのみ適用され、HTTP/1 を使用する場合にのみ適用されます。
要求ヘッダーの場合、これらの調整は
|
|
|
|
|
|
|
|
|
キャプチャーするすべての Cookie について、次のパラメーターが
以下に例を示します。
|
|
|
|
|
|
|
|
|
|
|
|
これらの接続は、ロードバランサーのヘルスプローブまたは Web ブラウザーの投機的接続 (事前接続) から取得され、無視しても問題はありません。ただし、これらの要求はネットワークエラーによって引き起こされる可能性があります。そのため、このフィールドを |
8.3.1. Ingress Controller の TLS セキュリティープロファイル リンクのコピーリンクがクリップボードにコピーされました!
TLS セキュリティープロファイルは、サーバーに接続する際に接続クライアントが使用できる暗号を規制する方法をサーバーに提供します。
8.3.1.1. TLS セキュリティープロファイルについて リンクのコピーリンクがクリップボードにコピーされました!
このセクションで説明するように、TLS(Transport Layer Security) セキュリティープロファイルを使用して、OpenShift Container Platform のさまざまなコンポーネントで必要とされる TLS 暗号を定義できます。
OpenShift Container Platform の TLS セキュリティープロファイルは、Mozilla が推奨する設定 に基づいています。
コンポーネントごとに、以下の TLS セキュリティープロファイルのいずれかを指定できます。
| プロファイル | 説明 |
|---|---|
|
| このプロファイルは、レガシークライアントまたはライブラリーでの使用を目的としています。このプロファイルは、Old 後方互換性 の推奨設定に基づいています。
注記 Ingress Controller の場合、TLS の最小バージョンは 1.0 から 1.1 に変換されます。 |
|
| このプロファイルは、Ingress Controller、kubelet、およびコントロールプレーンのデフォルトの TLS セキュリティープロファイルです。このプロファイルは、Intermediate 互換性 の推奨設定に基づいています。
注記 このプロファイルは、大多数のクライアントに推奨される設定です。 |
|
| このプロファイルは、下位互換性を必要としない最新のクライアントで使用することを目的としています。このプロファイルは、Modern compatibility の推奨設定に基づいています。
|
|
| このプロファイルを使用すると、使用する TLS バージョンと暗号を定義できます。 警告
無効な設定により問題が発生する可能性があるため、 |
事前定義されたプロファイルタイプのいずれかを使用する場合、有効なプロファイル設定はリリース間で変更される可能性があります。たとえば、リリース X.Y.Z にデプロイされた Intermediate プロファイルを使用する仕様がある場合、リリース X.Y.Z+1 へのアップグレードにより、新規のプロファイル設定が適用され、ロールアウトが生じる可能性があります。
8.3.1.2. Ingress Controller の TLS セキュリティープロファイルの設定 リンクのコピーリンクがクリップボードにコピーされました!
Ingress Controller の TLS セキュリティープロファイルを設定するには、IngressController カスタムリソース (CR) を編集して、事前定義済みまたはカスタムの TLS セキュリティープロファイルを指定します。TLS セキュリティープロファイルが設定されていない場合、デフォルト値は API サーバーに設定された TLS セキュリティープロファイルに基づいています。
Old TLS のセキュリティープロファイルを設定するサンプル IngressController CR
apiVersion: operator.openshift.io/v1
kind: IngressController
...
spec:
tlsSecurityProfile:
old: {}
type: Old
...
TLS セキュリティープロファイルは、Ingress Controller の TLS 接続の最小 TLS バージョンと TLS 暗号を定義します。
設定された TLS セキュリティープロファイルの暗号と最小 TLS バージョンは、Status.Tls Profile 配下の IngressController カスタムリソース (CR) と Spec.Tls Security Profile 配下の設定された TLS セキュリティープロファイルで確認できます。Custom TLS セキュリティープロファイルの場合、特定の暗号と最小 TLS バージョンは両方のパラメーターの下に一覧表示されます。
HAProxy Ingress Controller イメージは、TLS 1.3 と Modern プロファイルをサポートしています。
また、Ingress Operator は TLS 1.0 の Old または Custom プロファイルを 1.1 に変換します。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。
手順
openshift-ingress-operatorプロジェクトのIngressControllerCR を編集して、TLS セキュリティープロファイルを設定します。$ oc edit IngressController default -n openshift-ingress-operatorspec.tlsSecurityProfileフィールドを追加します。CustomプロファイルのサンプルIngressControllerCRapiVersion: operator.openshift.io/v1 kind: IngressController ... spec: tlsSecurityProfile: type: Custom1 custom:2 ciphers:3 - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 - ECDHE-RSA-AES128-GCM-SHA256 - ECDHE-ECDSA-AES128-GCM-SHA256 minTLSVersion: VersionTLS11 ...- 変更を適用するためにファイルを保存します。
検証
IngressControllerCR にプロファイルが設定されていることを確認します。$ oc describe IngressController default -n openshift-ingress-operator出力例
Name: default Namespace: openshift-ingress-operator Labels: <none> Annotations: <none> API Version: operator.openshift.io/v1 Kind: IngressController ... Spec: ... Tls Security Profile: Custom: Ciphers: ECDHE-ECDSA-CHACHA20-POLY1305 ECDHE-RSA-CHACHA20-POLY1305 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-ECDSA-AES128-GCM-SHA256 Min TLS Version: VersionTLS11 Type: Custom ...
8.3.1.3. 相互 TLS 認証の設定 リンクのコピーリンクがクリップボードにコピーされました!
spec.clientTLS 値を設定して、相互 TLS (mTLS) 認証を有効にするように Ingress Controller を設定できます。clientTLS 値は、クライアント証明書を検証するように Ingress Controller を設定します。この設定には、config map の参照である clientCA 値の設定が含まれます。config map には、クライアントの証明書を検証するために使用される PEM でエンコードされた CA 証明書バンドルが含まれます。必要に応じて、証明書サブジェクトフィルターのリストも設定できます。
clientCA 値が X509v3 証明書失効リスト (CRL) ディストリビューションポイントを指定している場合、Ingress Operator は、提供された各証明書で指定されている HTTP URI X509v3 CRL Distribution Point に基づいて CRL config map をダウンロードおよび管理します。Ingress Controller は、mTLS/TLS ネゴシエーション中にこの config map を使用します。有効な証明書を提供しない要求は拒否されます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 - PEM でエンコードされた CA 証明書バンドルがある。
CA バンドルが CRL ディストリビューションポイントを参照する場合は、エンドエンティティーまたはリーフ証明書もクライアント CA バンドルに含める必要があります。この証明書には、RFC 5280 で説明されているとおり、この証明書の
CRL Distribution Pointsに HTTP URI が含まれている必要があります。以下に例を示します。Issuer: C=US, O=Example Inc, CN=Example Global G2 TLS RSA SHA256 2020 CA1 Subject: SOME SIGNED CERT X509v3 CRL Distribution Points: Full Name: URI:http://crl.example.com/example.crl
手順
openshift-confignamespace で、CA バンドルから config map を作成します。$ oc create configmap \ router-ca-certs-default \ --from-file=ca-bundle.pem=client-ca.crt \1 -n openshift-config- 1
- config map データキーは
ca-bundle.pemで、data の値は PEM 形式の CA 証明書である必要があります。
openshift-ingress-operatorプロジェクトでIngressControllerリソースを編集します。$ oc edit IngressController default -n openshift-ingress-operatorspec.clientTLSフィールドおよびサブフィールドを追加して相互 TLS を設定します。フィルタリングパターンを指定する
clientTLSプロファイルのサンプルIngressControllerCRapiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: clientTLS: clientCertificatePolicy: Required clientCA: name: router-ca-certs-default allowedSubjectPatterns: - "^/CN=example.com/ST=NC/C=US/O=Security/OU=OpenShift$"オプションで、次のコマンドを入力して、
allowedSubjectPatternsの識別名 (DN) を取得します。$ openssl x509 -in custom-cert.pem -noout -subject出力例
subject=C=US, ST=NC, O=Security, OU=OpenShift, CN=example.com
8.4. デフォルト Ingress Controller の表示 リンクのコピーリンクがクリップボードにコピーされました!
Ingress Operator は、OpenShift Container Platform の中核となる機能であり、追加の設定なしに有効にできます。
すべての新規 OpenShift Container Platform インストールには、ingresscontroller の名前付きのデフォルトがあります。これは、追加の Ingress Controller で補足できます。デフォルトの ingresscontroller が削除される場合、Ingress Operator は 1 分以内にこれを自動的に再作成します。
手順
デフォルト Ingress Controller を表示します。
$ oc describe --namespace=openshift-ingress-operator ingresscontroller/default
8.5. Ingress Operator ステータスの表示 リンクのコピーリンクがクリップボードにコピーされました!
Ingress Operator のステータスを表示し、検査することができます。
手順
Ingress Operator ステータスを表示します。
$ oc describe clusteroperators/ingress
8.6. Ingress Controller ログの表示 リンクのコピーリンクがクリップボードにコピーされました!
Ingress Controller ログを表示できます。
手順
Ingress Controller ログを表示します。
$ oc logs --namespace=openshift-ingress-operator deployments/ingress-operator -c <container_name>
8.7. Ingress Controller ステータスの表示 リンクのコピーリンクがクリップボードにコピーされました!
特定の Ingress Controller のステータスを表示できます。
手順
Ingress Controller のステータスを表示します。
$ oc describe --namespace=openshift-ingress-operator ingresscontroller/<name>
8.8. カスタム Ingress Controller の作成 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、新規のカスタム Ingress Controller を作成できます。デフォルトの Ingress Controller は OpenShift Container Platform の更新時に変更される可能性があるため、クラスターの更新後も保持される設定を手動で維持する場合は、カスタム Ingress Controller を作成すると便利です。
この例では、カスタム Ingress Controller の最小限の仕様を提供します。カスタム Ingress Controller をさらにカスタマイズするには、「Ingress Controller の設定」を参照してください。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
カスタム
IngressControllerオブジェクトを定義する YAML ファイルを作成します。custom-ingress-controller.yamlファイルの例apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: <custom_name>1 namespace: openshift-ingress-operator spec: defaultCertificate: name: <custom-ingress-custom-certs>2 replicas: 13 domain: <custom_domain>4 以下のコマンドを実行してオブジェクトを作成します。
$ oc create -f custom-ingress-controller.yaml
8.9. Ingress Controller の設定 リンクのコピーリンクがクリップボードにコピーされました!
8.9.1. カスタムデフォルト証明書の設定 リンクのコピーリンクがクリップボードにコピーされました!
管理者として、Secret リソースを作成し、IngressController カスタムリソース (CR) を編集して Ingress Controller がカスタム証明書を使用するように設定できます。
前提条件
- PEM エンコードされたファイルに証明書/キーのペアがなければなりません。ここで、証明書は信頼される認証局またはカスタム PKI で設定されたプライベートの信頼される認証局で署名されます。
証明書が以下の要件を満たしている必要があります。
- 証明書が Ingress ドメインに対して有効化されている必要があります。
-
証明書は拡張を使用して、
subjectAltName拡張を使用して、*.apps.ocp4.example.comなどのワイルドカードドメインを指定します。
IngressControllerCR が必要です。これには、defaultIngressControllerCR のみが含まれます。次のコマンドを実行して、IngressControllerCR があるかどうかを確認できます。$ oc --namespace openshift-ingress-operator get ingresscontrollers
Intermediate 証明書がある場合、それらはカスタムデフォルト証明書が含まれるシークレットの tls.crt ファイルに組み込まれる必要があります。証明書を指定する際の順序は重要になります。サーバー証明書の後に Intermediate 証明書をリスト表示します。
手順
以下では、カスタム証明書とキーのペアが、現在の作業ディレクトリーの tls.crt および tls.key ファイルにあることを前提とします。tls.crt および tls.key を実際のパス名に置き換えます。さらに、Secret リソースを作成し、これを IngressController CR で参照する際に、custom-certs-default を別の名前に置き換えます。
このアクションにより、Ingress Controller はデプロイメントストラテジーを使用して再デプロイされます。
tls.crtおよびtls.keyファイルを使用して、カスタム証明書を含む Secret リソースをopenshift-ingressnamespace に作成します。$ oc --namespace openshift-ingress create secret tls custom-certs-default --cert=tls.crt --key=tls.keyIngressController CR を、新規証明書シークレットを参照するように更新します。
$ oc patch --type=merge --namespace openshift-ingress-operator ingresscontrollers/default \ --patch '{"spec":{"defaultCertificate":{"name":"custom-certs-default"}}}'更新が正常に行われていることを確認します。
$ echo Q |\ openssl s_client -connect console-openshift-console.apps.<domain>:443 -showcerts 2>/dev/null |\ openssl x509 -noout -subject -issuer -enddateここでは、以下のようになります。
<domain>- クラスターのベースドメイン名を指定します。
出力例
subject=C = US, ST = NC, L = Raleigh, O = RH, OU = OCP4, CN = *.apps.example.com issuer=C = US, ST = NC, L = Raleigh, O = RH, OU = OCP4, CN = example.com notAfter=May 10 08:32:45 2022 GMヒントまたは、以下の YAML を適用してカスタムのデフォルト証明書を設定できます。
apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: defaultCertificate: name: custom-certs-default証明書シークレットの名前は、CR を更新するために使用された値に一致する必要があります。
IngressController CR が変更された後に、Ingress Operator はカスタム証明書を使用できるように Ingress Controller のデプロイメントを更新します。
8.9.2. カスタムデフォルト証明書の削除 リンクのコピーリンクがクリップボードにコピーされました!
管理者は、使用する Ingress Controller を設定したカスタム証明書を削除できます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。 - Ingress Controller のカスタムデフォルト証明書を設定している。
手順
カスタム証明書を削除し、OpenShift Container Platform に同梱されている証明書を復元するには、以下のコマンドを入力します。
$ oc patch -n openshift-ingress-operator ingresscontrollers/default \ --type json -p $'- op: remove\n path: /spec/defaultCertificate'クラスターが新しい証明書設定を調整している間、遅延が発生する可能性があります。
検証
元のクラスター証明書が復元されたことを確認するには、次のコマンドを入力します。
$ echo Q | \ openssl s_client -connect console-openshift-console.apps.<domain>:443 -showcerts 2>/dev/null | \ openssl x509 -noout -subject -issuer -enddateここでは、以下のようになります。
<domain>- クラスターのベースドメイン名を指定します。
出力例
subject=CN = *.apps.<domain> issuer=CN = ingress-operator@1620633373 notAfter=May 10 10:44:36 2023 GMT
8.9.3. Ingress Controller の自動スケーリング リンクのコピーリンクがクリップボードにコピーされました!
Ingress Controller は、ルーティングのパフォーマンスや可用性の要件に合わせて動的に自動的にスケーリングできます。たとえば、処理能力を向上させる必要性などが挙げられる。
以下の手順では、デフォルトの Ingress Controller をスケールアップする例を示します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-adminロールを持つユーザーとして OpenShift Container Platform クラスターにアクセスできる。 VMware vSphere、ベアメタル、および Nutanix installer-provisioned infrastructure では、Ingress ControllerPod をスケールアップしても、外部トラフィックのパフォーマンスは向上しません。パフォーマンスを向上させるには、以下の前提条件を満たしていることを確認してください。
- クラスター用に、ユーザー管理型のロードバランサーを手動で設定しました。
- イングレスコントローラーからの受信トラフィックを処理するクラスターノードに対して、ロードバランサーが正しく設定されていることを確認しました。
Custom Metrics Autoscaler Operator と関連する KEDA Controller がインストールされている。
-
Web コンソールのソフトウェアカタログを使用して Operator をインストールできます。Operator をインストールしたら、
KedaControllerのインスタンスを作成できます。
-
Web コンソールのソフトウェアカタログを使用して Operator をインストールできます。Operator をインストールしたら、
手順
以下のコマンドを実行して、Thanos で認証するためのサービスアカウントを作成します。
$ oc create -n openshift-ingress-operator serviceaccount thanos && oc describe -n openshift-ingress-operator serviceaccount thanos出力例
Name: thanos Namespace: openshift-ingress-operator Labels: <none> Annotations: <none> Image pull secrets: thanos-dockercfg-kfvf2 Mountable secrets: thanos-dockercfg-kfvf2 Tokens: <none> Events: <none>次のコマンドを使用して、サービスアカウントシークレットトークンを手動で作成します。
$ oc apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: thanos-token namespace: openshift-ingress-operator annotations: kubernetes.io/service-account.name: thanos type: kubernetes.io/service-account-token EOFサービスアカウントのトークンを使用して、
openshift-ingress-operatornamespace 内でTriggerAuthenticationオブジェクトを定義します。TriggerAuthenticationオブジェクトを作成し、secret変数の値をTOKENパラメーターに渡します。$ oc apply -f - <<EOF apiVersion: keda.sh/v1alpha1 kind: TriggerAuthentication metadata: name: keda-trigger-auth-prometheus namespace: openshift-ingress-operator spec: secretTargetRef: - parameter: bearerToken name: thanos-token key: token - parameter: ca name: thanos-token key: ca.crt EOF
Thanos からメトリクスを読み取るためのロールを作成して適用します。
Pod およびノードからメトリクスを読み取る新規ロール
thanos-metrics-reader.yamlを作成します。thanos-metrics-reader.yaml
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: thanos-metrics-reader namespace: openshift-ingress-operator rules: - apiGroups: - "" resources: - pods - nodes verbs: - get - apiGroups: - metrics.k8s.io resources: - pods - nodes verbs: - get - list - watch - apiGroups: - "" resources: - namespaces verbs: - get以下のコマンドを実行して新規ロールを適用します。
$ oc apply -f thanos-metrics-reader.yaml
以下のコマンドを入力して、新しいロールをサービスアカウントに追加します。
$ oc adm policy -n openshift-ingress-operator add-role-to-user thanos-metrics-reader -z thanos --role-namespace=openshift-ingress-operator$ oc adm policy -n openshift-ingress-operator add-cluster-role-to-user cluster-monitoring-view -z thanos注記引数
add-cluster-role-to-userは、namespace 間のクエリーを使用する場合にのみ必要になります。以下の手順では、この引数を必要とするkube-metricsnamespace からのクエリーを使用します。デフォルトの Ingress Controller デプロイメントをターゲットにする新しい
ScaledObjectYAML ファイルingress-autoscaler.yamlを作成します。ScaledObject定義の例apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: ingress-scaler namespace: openshift-ingress-operator spec: scaleTargetRef:1 apiVersion: operator.openshift.io/v1 kind: IngressController name: default envSourceContainerName: ingress-operator minReplicaCount: 1 maxReplicaCount: 202 cooldownPeriod: 1 pollingInterval: 1 triggers: - type: prometheus metricType: AverageValue metadata: serverAddress: https://thanos-querier.openshift-monitoring.svc.cluster.local:90913 namespace: openshift-ingress-operator4 metricName: 'kube-node-role' threshold: '1' query: 'sum(kube_node_role{role="worker",service="kube-state-metrics"})'5 authModes: "bearer" authenticationRef: name: keda-trigger-auth-prometheus- 1
- 対象とするカスタムリソース。この場合、Ingress Controller。
- 2
- オプション: レプリカの最大数。このフィールドを省略すると、デフォルトの最大値は 100 レプリカに設定されます。
- 3
openshift-monitoringnamespace の Thanos サービスエンドポイント。- 4
- Ingress Operator namespace。
- 5
- この式は、デプロイされたクラスターに存在するワーカーノードの数に対して評価されます。重要
namespace 間クエリーを使用している場合は、
serverAddressフィールドのポート 9092 ではなくポート 9091 をターゲットにする必要があります。また、このポートからメトリクスを読み取るには、昇格した権限が必要です。
以下のコマンドを実行してカスタムリソース定義を適用します。
$ oc apply -f ingress-autoscaler.yaml
検証
以下のコマンドを実行して、デフォルトの Ingress Controller が
kube-state-metricsクエリーによって返される値に一致するようにスケールアウトされていることを確認します。grepコマンドを使用して、Ingress Controller YAML ファイルでレプリカの数を検索します。$ oc get -n openshift-ingress-operator ingresscontroller/default -o yaml | grep replicas:openshift-ingressプロジェクトで Pod を取得します。$ oc get pods -n openshift-ingress出力例
NAME READY STATUS RESTARTS AGE router-default-7b5df44ff-l9pmm 2/2 Running 0 17h router-default-7b5df44ff-s5sl5 2/2 Running 0 3d22h router-default-7b5df44ff-wwsth 2/2 Running 0 66s
8.9.4. Ingress Controller のスケーリング リンクのコピーリンクがクリップボードにコピーされました!
Ingress Controller は、スループットを増大させるための要件を含む、ルーティングのパフォーマンスや可用性に関する各種要件に対応するために手動でスケーリングできます。oc コマンドは、IngressController リソースのスケーリングに使用されます。以下の手順では、デフォルトの IngressController をスケールアップする例を示します。
スケーリングは、必要な数のレプリカを作成するのに時間がかかるため、すぐに実行できるアクションではありません。
前提条件
VMware vSphere、ベアメタル、および Nutanix installer-provisioned infrastructure では、Ingress ControllerPod をスケールアップしても、外部トラフィックのパフォーマンスは向上しません。パフォーマンスを向上させるには、以下の前提条件を満たしていることを確認してください。
- クラスター用に、ユーザー管理型のロードバランサーを手動で設定しました。
- イングレスコントローラーからの受信トラフィックを処理するクラスターノードに対して、ロードバランサーが正しく設定されていることを確認しました。
手順
デフォルト
IngressControllerの現在の利用可能なレプリカ数を表示します。$ oc get -n openshift-ingress-operator ingresscontrollers/default -o jsonpath='{$.status.availableReplicas}'oc patchコマンドを使用して、デフォルトのIngressControllerを必要なレプリカ数にスケーリングします。以下の例では、デフォルトのIngressControllerを 3 つのレプリカにスケーリングしています。$ oc patch -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"replicas": 3}}' --type=mergeデフォルトの
IngressControllerが指定したレプリカ数にスケーリングされていることを確認します。$ oc get -n openshift-ingress-operator ingresscontrollers/default -o jsonpath='{$.status.availableReplicas}'ヒントまたは、以下の YAML を適用して Ingress Controller を 3 つのレプリカにスケーリングすることもできます。
apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: replicas: 31 - 1
- 異なる数のレプリカが必要な場合は
replicas値を変更します。
8.9.5. Ingress アクセスロギングの設定 リンクのコピーリンクがクリップボードにコピーされました!
アクセスログを有効にするように Ingress Controller を設定できます。大量のトラフィックを受信しないクラスターがある場合、サイドカーにログインできます。クラスターのトラフィックが多い場合、ロギングスタックの容量を超えないようにしたり、OpenShift Container Platform 外のロギングインフラストラクチャーと統合したりするために、ログをカスタム syslog エンドポイントに転送することができます。アクセスログの形式を指定することもできます。
コンテナーロギングは、既存の Syslog ロギングインフラストラクチャーがない場合や、Ingress Controller で問題を診断する際に短期間使用する場合に、低トラフィックのクラスターのアクセスログを有効にするのに役立ちます。
アクセスログが OpenShift Logging スタックの容量を超える可能性がある高トラフィックのクラスターや、ログソリューションを既存の Syslog ログインフラストラクチャーと統合する必要がある環境では、Syslog が必要です。Syslog のユースケースは重複する可能性があります。
前提条件
-
cluster-admin権限を持つユーザーとしてログインしている。
手順
サイドカーへの Ingress アクセスロギングを設定します。
Ingress アクセスロギングを設定するには、
spec.logging.access.destinationを使用して宛先を指定する必要があります。サイドカーコンテナーへのロギングを指定するには、Containerspec.logging.access.destination.typeを指定する必要があります。以下の例は、コンテナーContainerの宛先に対してログ記録する Ingress Controller 定義です。apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: replicas: 2 logging: access: destination: type: ContainerIngress Controller をサイドカーに対してログを記録するように設定すると、Operator は Ingress Controller Pod 内に
logsという名前のコンテナーを作成します。$ oc -n openshift-ingress logs deployment.apps/router-default -c logs出力例
2020-05-11T19:11:50.135710+00:00 router-default-57dfc6cd95-bpmk6 router-default-57dfc6cd95-bpmk6 haproxy[108]: 174.19.21.82:39654 [11/May/2020:19:11:50.133] public be_http:hello-openshift:hello-openshift/pod:hello-openshift:hello-openshift:10.128.2.12:8080 0/0/1/0/1 200 142 - - --NI 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Syslog エンドポイントへの Ingress アクセスロギングを設定します。
Ingress アクセスロギングを設定するには、
spec.logging.access.destinationを使用して宛先を指定する必要があります。Syslog エンドポイント宛先へのロギングを指定するには、spec.logging.access.destination.typeにSyslogを指定する必要があります。宛先タイプがSyslogの場合、spec.logging.access.destination.syslog.addressを使用して宛先エンドポイントも指定する必要があります。また、spec.logging.access.destination.syslog.facilityを使用してファシリティーを指定できます。以下の例は、Syslog宛先に対してログを記録する Ingress Controller の定義です。apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: replicas: 2 logging: access: destination: type: Syslog syslog: address: 1.2.3.4 port: 10514注記syslog宛先ポートは UDP である必要があります。syslogの宛先アドレスは IP アドレスにする必要があります。DNS ホスト名はサポートされていません。
特定のログ形式で Ingress アクセスロギングを設定します。
spec.logging.access.httpLogFormatを指定して、ログ形式をカスタマイズできます。以下の例は、IP アドレスが 1.2.3.4 およびポート 10514 のsyslogエンドポイントに対してログを記録する Ingress Controller の定義です。apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: replicas: 2 logging: access: destination: type: Syslog syslog: address: 1.2.3.4 port: 10514 httpLogFormat: '%ci:%cp [%t] %ft %b/%s %B %bq %HM %HU %HV'
Ingress アクセスロギングを無効にします。
Ingress アクセスロギングを無効にするには、
spec.loggingまたはspec.logging.accessを空のままにします。apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: replicas: 2 logging: access: null
サイドカーの使用時に Ingress Controller が HAProxy ログの長さを変更できるようにします。
spec.logging.access.destination.type: Syslogを使用している場合は、spec.logging.access.destination.syslog.maxLengthを使用します。apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: replicas: 2 logging: access: destination: type: Syslog syslog: address: 1.2.3.4 maxLength: 4096 port: 10514spec.logging.access.destination.type: Containerを使用している場合は、spec.logging.access.destination.container.maxLengthを使用します。apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: replicas: 2 logging: access: destination: container: maxLength: 8192 type: Container httpCaptureHeaders: request: - maxLength: 128 name: X-Forwarded-For-
IngressアクセスログのX-Forwarded-Forヘッダーを使用して元のクライアントソース IP アドレスを表示するには、Red Hat ナレッジベースの記事 "Capturing Original Client IP from the X-Forwarded-For Header in Ingress and Application Logs" を参照してください。
8.9.6. Ingress Controller スレッド数の設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、スレッド数を設定して、クラスターが処理できる受信接続の量を増やすことができます。既存の Ingress Controller にパッチを適用して、スレッドの数を増やすことができます。
前提条件
- 以下では、Ingress Controller がすでに作成されていることを前提とします。
手順
Ingress Controller を更新して、スレッド数を増やします。
$ oc -n openshift-ingress-operator patch ingresscontroller/default --type=merge -p '{"spec":{"tuningOptions": {"threadCount": 8}}}'注記大量のリソースを実行できるノードがある場合、
spec.nodePlacement.nodeSelectorを、意図されているノードの容量に一致するラベルで設定し、spec.tuningOptions.threadCountを随時高い値に設定します。
8.9.7. 内部ロードバランサーを使用するための Ingress Controller の設定 リンクのコピーリンクがクリップボードにコピーされました!
クラウドプラットフォームで Ingress Controller を作成する場合、Ingress Controller はデフォルトでパブリッククラウドロードバランサーによって公開されます。管理者は、内部クラウドロードバランサーを使用する Ingress Controller を作成できます。
クラウドプロバイダーが Microsoft Azure の場合、ノードを参照するパブリックロードバランサーが少なくとも 1 つ必要です。これがない場合、すべてのノードがインターネットへの Egress 接続を失います。
IngressController の scope を変更する場合は、カスタムリソース (CR) の作成後に .spec.endpointPublishingStrategy.loadBalancer.scope パラメーターを変更します。
図8.1 LoadBalancer の図
前述の図では、OpenShift Container Platform Ingress LoadBalancerService エンドポイントの公開戦略に関する以下のような概念を示しています。
- 負荷は、外部からクラウドプロバイダーのロードバランサーを使用するか、内部から OpenShift Ingress Controller Load Balancer を使用して、分散できます。
- ロードバランサーのシングル IP アドレスと、図にあるクラスターのように、8080 や 4200 といった馴染みのあるポートを使用することができます。
- 外部のロードバランサーからのトラフィックは、ダウンしたノードのインスタンスで記載されているように、Pod の方向に進められ、ロードバランサーが管理します。実装の詳細は、Kubernetes サービスドキュメント を参照してください。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
以下の例のように、
<name>-ingress-controller.yamlという名前のファイルにIngressControllerカスタムリソース (CR) を作成します。apiVersion: operator.openshift.io/v1 kind: IngressController metadata: namespace: openshift-ingress-operator name: <name>1 spec: domain: <domain>2 endpointPublishingStrategy: type: LoadBalancerService loadBalancer: scope: Internal3 以下のコマンドを実行して、直前の手順で定義された Ingress Controller を作成します。
$ oc create -f <name>-ingress-controller.yaml1 - 1
<name>をIngressControllerオブジェクトの名前に置き換えます。
オプション: 以下のコマンドを実行して Ingress Controller が作成されていることを確認します。
$ oc --all-namespaces=true get ingresscontrollers
8.9.8. Google Cloud での Ingress Controller のグローバルアクセスの設定 リンクのコピーリンクがクリップボードにコピーされました!
内部ロードバランサーで Google Cloud で作成された Ingress Controller は、サービスの内部 IP アドレスを生成します。クラスター管理者は、グローバルアクセスオプションを指定できます。これにより、同じ VPC ネットワーク内の任意のリージョンでクラスターを有効にし、ロードバランサーとしてコンピュートリージョンを有効にして、クラスターで実行されるワークロードに到達できるようにできます。
詳細は、global access に関する Google Cloud ドキュメントを参照してください。
前提条件
- OpenShift Container Platform クラスターを Google Cloud インフラストラクチャーにデプロイしている。
- 内部ロードバランサーを使用するように Ingress Controller を設定している。
-
OpenShift CLI (
oc) がインストールされている。
手順
グローバルアクセスを許可するように Ingress Controller リソースを設定します。
注記Ingress Controller を作成し、グローバルアクセスのオプションを指定することもできます。
Ingress Controller リソースを設定します。
$ oc -n openshift-ingress-operator edit ingresscontroller/defaultYAML ファイルを編集します。
サンプル
clientAccess設定をGlobalに設定します。spec: endpointPublishingStrategy: loadBalancer: providerParameters: gcp: clientAccess: Global1 type: GCP scope: Internal type: LoadBalancerService- 1
gcp.clientAccessをGlobalに設定します。
- 変更を適用するためにファイルを保存します。
以下のコマンドを実行して、サービスがグローバルアクセスを許可することを確認します。
$ oc -n openshift-ingress edit svc/router-default -o yamlこの出力には、アノテーション
networking.gke.io/internal-load-balancer-allow-global-accessにより Google Cloud のグローバルアクセスが有効になっていることが示されています。
8.9.9. Ingress Controller のヘルスチェック間隔の設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、ヘルスチェックの間隔を設定して、ルーターが連続する 2 回のヘルスチェックの間で待機する時間を定義できます。この値は、すべてのルートのデフォルトとしてグローバルに適用されます。デフォルト値は 5 秒です。
前提条件
- 以下では、Ingress Controller がすでに作成されていることを前提とします。
手順
Ingress Controller を更新して、バックエンドヘルスチェックの間隔を変更します。
$ oc -n openshift-ingress-operator patch ingresscontroller/default --type=merge -p '{"spec":{"tuningOptions": {"healthCheckInterval": "8s"}}}'注記単一ルートの
healthCheckIntervalをオーバーライドするには、ルートアノテーションrouter.openshift.io/haproxy.health.check.intervalを使用します
8.9.10. クラスターを内部に配置するためのデフォルト Ingress Controller の設定 リンクのコピーリンクがクリップボードにコピーされました!
削除や再作成を実行して、クラスターを内部に配置するように default Ingress Controller を設定できます。
クラウドプロバイダーが Microsoft Azure の場合、ノードを参照するパブリックロードバランサーが少なくとも 1 つ必要です。これがない場合、すべてのノードがインターネットへの Egress 接続を失います。
IngressController の scope を変更する場合は、カスタムリソース (CR) の作成後に .spec.endpointPublishingStrategy.loadBalancer.scope パラメーターを変更します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
削除や再作成を実行して、クラスターを内部に配置するように
defaultIngress Controller を設定します。$ oc replace --force --wait --filename - <<EOF apiVersion: operator.openshift.io/v1 kind: IngressController metadata: namespace: openshift-ingress-operator name: default spec: endpointPublishingStrategy: type: LoadBalancerService loadBalancer: scope: Internal EOF
8.9.11. ルートの受付ポリシーの設定 リンクのコピーリンクがクリップボードにコピーされました!
管理者およびアプリケーション開発者は、同じドメイン名を持つ複数の 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
8.9.12. ワイルドカードルートの使用 リンクのコピーリンクがクリップボードにコピーされました!
HAProxy Ingress Controller にはワイルドカードルートのサポートがあります。Ingress Operator は wildcardPolicy を使用して、Ingress Controller の ROUTER_ALLOW_WILDCARD_ROUTES 環境変数を設定します。
Ingress Controller のデフォルトの動作では、ワイルドカードポリシーの None (既存の IngressController リソースとの後方互換性がある) を持つルートを許可します。
手順
ワイルドカードポリシーを設定します。
以下のコマンドを使用して
IngressControllerリソースを編集します。$ oc edit IngressControllerspecの下で、wildcardPolicyフィールドをWildcardsDisallowedまたはWildcardsAllowedに設定します。spec: routeAdmission: wildcardPolicy: WildcardsDisallowed # or WildcardsAllowed
8.9.13. 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 の所有権が制限される可能性があります。 | はい:
|
8.9.14. Ingress Controller での HTTP リクエストおよびレスポンスヘッダーの設定または削除 リンクのコピーリンクがクリップボードにコピーされました!
コンプライアンス目的またはその他の理由で、特定の HTTP 要求および応答ヘッダーを設定または削除できます。これらのヘッダーは、Ingress Controller によって提供されるすべてのルート、または特定のルートに対して設定または削除できます。
たとえば、相互 TLS を使用するようにクラスター上で実行されているアプリケーションを移行する場合があります。このような場合、お使いのアプリケーションで X-Forwarded-Client-Cert リクエストヘッダーをチェックする必要がありますが、OpenShift Container Platform のデフォルトの Ingress Controller は X-SSL-Client-Der リクエストヘッダーを提供します。
次の手順では、Ingress Controller を変更して X-Forwarded-Client-Cert リクエストヘッダーを設定し、X-SSL-Client-Der リクエストヘッダーを削除します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-adminロールを持つユーザーとして OpenShift Container Platform クラスターにアクセスできる。
手順
Ingress Controller リソースを編集します。
$ oc -n openshift-ingress-operator edit ingresscontroller/defaultX-SSL-Client-Der HTTP リクエストヘッダーは X-Forwarded-Client-Cert HTTP リクエストヘッダーに置き換えます。
apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: httpHeaders: actions:1 request:2 - name: X-Forwarded-Client-Cert3 action: type: Set4 set: value: "%{+Q}[ssl_c_der,base64]"5 - name: X-SSL-Client-Der action: type: Delete- 1
- HTTP ヘッダーに対して実行するアクションのリスト。
- 2
- 変更するヘッダーのタイプ。この場合はリクエストヘッダーです。
- 3
- 変更するヘッダーの名前。設定または削除できる使用可能なヘッダーのリストは、HTTP ヘッダーの設定 を参照してください。
- 4
- ヘッダーに対して実行されるアクションのタイプ。このフィールドには、
SetまたはDeleteの値を指定できます。 - 5
- HTTP ヘッダーの設定時は、
値を指定する必要があります。値は、そのヘッダーで使用可能なディレクティブのリストからの文字列 (例:DENY)にすることも、HAProxy の動的値構文を使用して解釈される動的値にすることもできます。この場合、動的な値が追加されます。注記HTTP 応答の動的ヘッダー値を設定する場合、サンプルフェッチャーとして
res.hdrおよびssl_c_derを使用できます。HTTP リクエストの動的ヘッダー値を設定する場合、許可されるサンプルフェッチャーはreq.hdrおよびssl_c_derです。リクエストとレスポンスの両方の動的値で、lowerコンバーターとBase64コンバーターを使用できます。
- 変更を適用するためにファイルを保存します。
8.9.15. X-Forwarded ヘッダーの使用 リンクのコピーリンクがクリップボードにコピーされました!
Forwarded および X-Forwarded-For を含む HTTP ヘッダーの処理方法に関するポリシーを指定するように HAProxy Ingress Controller を設定します。Ingress Operator は HTTPHeaders フィールドを使用して、Ingress Controller の ROUTER_SET_FORWARDED_HEADERS 環境変数を設定します。
手順
Ingress Controller 用に
HTTPHeadersフィールドを設定します。以下のコマンドを使用して
IngressControllerリソースを編集します。$ oc edit IngressControllerspecの下で、HTTPHeadersポリシーフィールドをAppend、Replace、IfNone、またはNeverに設定します。apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: httpHeaders: forwardedHeaderPolicy: Append
8.9.15.1. 使用例 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者として、以下を実行できます。
Ingress Controller に転送する前に、
X-Forwarded-Forヘッダーを各リクエストに挿入する外部プロキシーを設定します。ヘッダーを変更せずに渡すように Ingress Controller を設定するには、
neverポリシーを指定します。これにより、Ingress Controller はヘッダーを設定しなくなり、アプリケーションは外部プロキシーが提供するヘッダーのみを受信します。外部プロキシーが外部クラスター要求を設定する
X-Forwarded-Forヘッダーを変更せずに渡すように Ingress Controller を設定します。外部プロキシーを通過しない内部クラスター要求に
X-Forwarded-Forヘッダーを設定するように Ingress Controller を設定するには、if-noneポリシーを指定します。外部プロキシー経由で HTTP 要求にヘッダーがすでに設定されている場合、Ingress Controller はこれを保持します。要求がプロキシーを通過していないためにヘッダーがない場合、Ingress Controller はヘッダーを追加します。
アプリケーション開発者として、以下を実行できます。
X-Forwarded-Forヘッダーを挿入するアプリケーション固有の外部プロキシーを設定します。他の Route のポリシーに影響を与えずに、アプリケーションの Route 用にヘッダーを変更せずに渡すように Ingress Controller を設定するには、アプリケーションの Route にアノテーション
haproxy.router.openshift.io/set-forwarded-headers: if-noneまたはhaproxy.router.openshift.io/set-forwarded-headers: neverを追加します。注記Ingress Controller のグローバルに設定された値とは別に、
haproxy.router.openshift.io/set-forwarded-headersアノテーションをルートごとに設定できます。
8.9.16. Ingress Controller で HTTP/2 を有効または無効にする リンクのコピーリンクがクリップボードにコピーされました!
HAProxy で透過的なエンドツーエンドの HTTP/2 接続を有効化または無効化できます。アプリケーション所有者は、単一接続、ヘッダー圧縮、バイナリーストリームなどの HTTP/2 プロトコル機能を使用できます。
個別の Ingress Controller またはクラスター全体について、HTTP/2 接続を有効化または無効化できます。
個々の Ingress Controller およびクラスター全体に対して HTTP/2 接続を有効または無効にすると、Ingress Controller の HTTP/2 設定がクラスターの HTTP/2 設定よりも優先されます。
クライアントから HAProxy インスタンスへの接続に HTTP/2 の使用を有効にするには、ルートでカスタム証明書を指定する必要があります。デフォルトの証明書を使用するルートは HTTP/2 を使用することができません。この制限は、クライアントが同じ証明書を使用する複数の異なるルートに接続を再使用するなどの、接続の結合 (coalescing) の問題を回避するために必要です。
各ルートタイプにおける HTTP/2 接続の次のユースケースを検討してください。
- 再暗号化ルートの場合、アプリケーションが Application-Level Protocol Negotiation (ALPN) を使用して HAProxy と HTTP/2 をネゴシエートすることをサポートしている場合、HAProxy からアプリケーション Pod への接続で HTTP/2 を使用できます。Ingress Controller で HTTP/2 が有効になっていない限り、再暗号化ルートで HTTP/2 を使用できません。
- パススルールートの場合、アプリケーションが ALPN を使用してクライアントと HTTP/2 をネゴシエートすることをサポートしている場合、接続で HTTP/2 を使用できます。Ingress Controller が HTTP/2 を有効または無効にする場合、パススルールートで HTTP/2 を使用できます。
-
エッジ終端のセキュアなルートの場合、サービスが
appProtocol: kubernetes.io/h2cのみを指定すると、接続では HTTP/2 が使用されます。Ingress Controller で HTTP/2 が有効または無効な場合、エッジ終端のセキュアなルートで HTTP/2 を使用できます。 -
安全でないルートの場合、サービスが
appProtocol: kubernetes.io/h2cのみを指定すると、接続では HTTP/2 が使用されます。Ingress Controller で HTTP/2 が有効または無効になっている場合は、安全でないルートで HTTP/2 を使用できます。
パススルー以外のルートの場合、Ingress Controller はクライアントからの接続とは独立してアプリケーションへの接続をネゴシエートします。これは、クライアントが Ingress Controller に接続し、HTTP/1.1 をネゴシエートする可能性があることを意味します。その後、Ingress Controller はアプリケーションに接続し、HTTP/2 接続を確立し、HTTP/2 接続を使用してクライアント HTTP/1.1 接続からのリクエストをアプリケーションに転送します。
この一連のイベントは、その後クライアントが HTTP/1.1 から WebSocket プロトコルに接続をアップグレードしようとすると、問題が発生します。WebSocket 接続の受け入れを目的としたアプリケーションがあり、そのアプリケーションが HTTP/2 プロトコルネゴシエーションを許可しようとすると、クライアントが WebSocket プロトコルへのアップグレードを試行しても失敗することに注意してください。
8.9.16.1. HTTP/2 の有効化 リンクのコピーリンクがクリップボードにコピーされました!
特定の Ingress Controller で HTTP/2 を有効化するか、クラスター全体で HTTP/2 を有効化できます。
手順
特定の Ingress Controller で HTTP/2 を有効化するには、
oc annotateコマンドを入力します。$ oc -n openshift-ingress-operator annotate ingresscontrollers/<ingresscontroller_name> ingress.operator.openshift.io/default-enable-http2=true1 - 1
<ingresscontroller_name>は、HTTP/2 を有効化する Ingress Controller の名前に置き換えます。
クラスター全体で HTTP/2 を有効にするには、
oc annotateコマンドを入力します。$ oc annotate ingresses.config/cluster ingress.operator.openshift.io/default-enable-http2=true
または、次の YAML コードを適用して HTTP/2 を有効化できます。
apiVersion: config.openshift.io/v1
kind: Ingress
metadata:
name: cluster
annotations:
ingress.operator.openshift.io/default-enable-http2: "true"
8.9.16.2. HTTP/2 の無効化 リンクのコピーリンクがクリップボードにコピーされました!
特定の Ingress Controller で HTTP/2 を無効化するか、またはクラスター全体で HTTP/2 を無効化できます。
手順
特定の Ingress Controller で HTTP/2 を無効化するには、
oc annotateコマンドを入力します。$ oc -n openshift-ingress-operator annotate ingresscontrollers/<ingresscontroller_name> ingress.operator.openshift.io/default-enable-http2=false1 - 1
<ingresscontroller_name>は、HTTP/2 を無効化する Ingress Controller の名前に置き換えます。
クラスター全体で HTTP/2 を無効化するには、
oc annotateコマンドを入力します。$ oc annotate ingresses.config/cluster ingress.operator.openshift.io/default-enable-http2=false
または、次の YAML コードを適用して HTTP/2 を無効化できます。
apiVersion: config.openshift.io/v1
kind: Ingress
metadata:
name: cluster
annotations:
ingress.operator.openshift.io/default-enable-http2: "false"
8.9.17. Ingress Controller の PROXY プロトコルの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、Ingress Controller が HostNetwork、NodePortService、または Private エンドポイント公開ストラテジータイプを使用する場合、PROXY プロトコル を設定できます。PROXY プロトコルにより、ロードバランサーは Ingress Controller が受信する接続の元のクライアントアドレスを保持することができます。元のクライアントアドレスは、HTTP ヘッダーのロギング、フィルタリング、および挿入を実行する場合に便利です。デフォルト設定では、Ingress Controller が受信する接続には、ロードバランサーに関連付けられるソースアドレスのみが含まれます。
Keepalived Ingress 仮想 IP (VIP) を使用するクラウド以外のプラットフォーム上の installer-provisioned クラスターを備えたデフォルトの Ingress Controller は、PROXY プロトコルをサポートしていません。
PROXY プロトコルにより、ロードバランサーは Ingress Controller が受信する接続の元のクライアントアドレスを保持することができます。元のクライアントアドレスは、HTTP ヘッダーのロギング、フィルタリング、および挿入を実行する場合に便利です。デフォルト設定では、Ingress Controller が受信する接続には、ロードバランサーに関連付けられる送信元 IP アドレスのみが含まれます。
パススルールート設定の場合、OpenShift Container Platform クラスター内のサーバーは、元のクライアント送信元 IP アドレスを監視できません。元のクライアント送信元 IP アドレスを知る必要がある場合は、Ingress Controller の Ingress アクセスロギングを設定して、クライアント送信元 IP アドレスを表示できるようにします。
再暗号化およびエッジルートの場合、OpenShift Container Platform ルーターは Forwarded ヘッダーと X-Forwarded-For ヘッダーを設定し、アプリケーションワークロードがクライアントの送信元 IP アドレスをチェックできるようにします。
Ingress アクセスロギングの詳細は、「Ingress アクセスロギングの設定」を参照してください。
LoadBalancerService エンドポイント公開ストラテジータイプを使用する場合、Ingress Controller の PROXY プロトコルの設定はサポートされません。この制限があるのは、OpenShift Container Platform がクラウドプラットフォームで実行され、Ingress Controller がサービスロードバランサーを使用するように指定している場合に、Ingress Operator がロードバランサーサービスを設定し、ソースアドレスを保持するプラットフォーム要件に基づいて PROXY プロトコルを有効にするためです。
PROXY プロトコルまたは TCP のいずれかを使用するには、OpenShift Container Platform と外部ロードバランサーの両方を設定する必要があります。
この機能は、クラウドデプロイメントではサポートされていません。この制限があるのは、OpenShift Container Platform がクラウドプラットフォームで実行され、Ingress Controller がサービスロードバランサーを使用するように指定している場合に、Ingress Operator がロードバランサーサービスを設定し、ソースアドレスを保持するプラットフォーム要件に基づいて PROXY プロトコルを有効にするためです。
PROXY プロトコルまたは Transmission Control Protocol (TCP) のいずれかを使用するには、OpenShift Container Platform と外部ロードバランサーの両方を設定する必要があります。
前提条件
- Ingress Controller を作成している。
手順
CLI で次のコマンドを入力して、Ingress Controller リソースを編集します。
$ oc -n openshift-ingress-operator edit ingresscontroller/defaultPROXY 設定を設定します。
Ingress Controller が
HostNetworkエンドポイント公開ストラテジータイプを使用する場合は、spec.endpointPublishingStrategy.hostNetwork.protocolサブフィールドをPROXYに設定します。PROXYへのhostNetworkの設定例# ... spec: endpointPublishingStrategy: hostNetwork: protocol: PROXY type: HostNetwork # ...Ingress Controller が
NodePortServiceエンドポイント公開ストラテジータイプを使用する場合は、spec.endpointPublishingStrategy.nodePort.protocolサブフィールドをPROXYに設定します。PROXYへのサンプルnodePort設定# ... spec: endpointPublishingStrategy: nodePort: protocol: PROXY type: NodePortService # ...Ingress Controller が
Privateエンドポイント公開ストラテジータイプを使用する場合は、spec.endpointPublishingStrategy.private.protocolサブフィールドをPROXYに設定します。PROXYへのprivate設定のサンプル# ... spec: endpointPublishingStrategy: private: protocol: PROXY type: Private # ...
8.9.18. appsDomain オプションを使用した代替クラスタードメインの指定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、appsDomain フィールドを設定して、ユーザーが作成したルートのデフォルトのクラスタードメインの代わりとなるものを指定できます。appsDomain フィールドは、domain フィールドで指定されているデフォルトの代わりに使用する OpenShift Container Platform のオプションのドメインです。代替ドメインを指定する場合、これは新規ルートのデフォルトホストを判別できるようにする目的でデフォルトのクラスタードメインを上書きします。
たとえば、所属企業の DNS ドメインを、クラスター上で実行されるアプリケーションのルートおよび ingress のデフォルトドメインとして使用できます。
前提条件
- OpenShift Container Platform クラスターをデプロイしていること。
-
ocコマンドラインインターフェイスがインストールされている。
手順
ユーザーが作成するルートに代替のデフォルトドメインを指定して
appsDomainフィールドを設定します。Ingress
clusterリソースを編集します。$ oc edit ingresses.config/cluster -o yamlYAML ファイルを編集します。
test.example.comへのappsDomainの設定例apiVersion: config.openshift.io/v1 kind: Ingress metadata: name: cluster spec: domain: apps.example.com1 appsDomain: <test.example.com>2
ルートを公開し、ルートドメインの変更を確認して、既存のルートに、
appsDomainフィールドで指定したドメイン名が含まれていることを確認します。注記ルートを公開する前に
openshift-apiserverがローリング更新を終了するのを待機します。次のコマンドを入力してルートを公開します。このコマンドは、ルートの公開を指定するために
route.route.openshift.io/hello-openshift exposedを出力します。$ oc expose service hello-openshift次のコマンドを実行して、ルートのリストを取得します。
$ oc get routes出力例
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD hello-openshift hello_openshift-<my_project>.test.example.com hello-openshift 8080-tcp None
8.9.19. HTTP ヘッダーケースの変換 リンクのコピーリンクがクリップボードにコピーされました!
HAProxy では、デフォルトで HTTP ヘッダー名を小文字化します。たとえば、Host: xyz.com は host: xyz.com に変更されます。レガシーアプリケーションが HTTP ヘッダー名の大文字を認識する場合、Ingress Controller の spec.httpHeaders.headerNameCaseAdjustments API フィールドを、修正されるまでレガシーアプリケーションに対応するソリューションに使用します。
OpenShift Container Platform には HAProxy 2.8 が含まれています。このバージョンの Web ベースのロードバランサーに更新する場合は、必ずクラスターの設定ファイルに spec.httpHeaders.headerNameCaseAdjustments セクションを追加してください。
クラスター管理者は、oc patch コマンドを入力するか、Ingress Controller YAML ファイルの HeaderNameCaseAdjustments フィールドを設定して HTTP ヘッダーのケースを変換できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。
手順
oc patchコマンドを使用して、HTTP ヘッダーを大文字にします。次のコマンドを実行して、HTTP ヘッダーを
hostからHostに変更します。$ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"httpHeaders":{"headerNameCaseAdjustments":["Host"]}}}'アノテーションをアプリケーションに適用できるように、
Routeリソースの YAML ファイルを作成します。my-applicationという名前のルートの例apiVersion: route.openshift.io/v1 kind: Route metadata: annotations: haproxy.router.openshift.io/h1-adjust-case: true1 name: <application_name> namespace: <application_name> # ...- 1
- Ingress Controller が指定どおりに
hostリクエストヘッダーを調整できるように、haproxy.router.openshift.io/h1-adjust-caseを設定します。
Ingress Controller YAML 設定ファイルで
HeaderNameCaseAdjustmentsフィールドを設定して調整を指定します。次の Ingress Controller YAML ファイルの例では、適切にアノテーションが付けられたルートへの HTTP/1 リクエストの
hostヘッダーをHostに調整します。Ingress Controller YAML のサンプル
apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: httpHeaders: headerNameCaseAdjustments: - Host次のルートの例では、
haproxy.router.openshift.io/h1-adjust-caseアノテーションを使用して HTTP レスポンスヘッダー名の大文字と小文字の調整を有効にします。ルート YAML のサンプル
apiVersion: route.openshift.io/v1 kind: Route metadata: annotations: haproxy.router.openshift.io/h1-adjust-case: true1 name: my-application namespace: my-application spec: to: kind: Service name: my-application- 1
haproxy.router.openshift.io/h1-adjust-caseを true に設定します。
8.9.20. ルーター圧縮の使用 リンクのコピーリンクがクリップボードにコピーされました!
特定の MIME タイプに対してルーター圧縮をグローバルに指定するように HAProxy Ingress Controller を設定します。mimeTypes 変数を使用して、圧縮が適用される MIME タイプの形式を定義できます。タイプは、アプリケーション、イメージ、メッセージ、マルチパート、テキスト、ビデオ、または "X-" で始まるカスタムタイプです。MIME タイプとサブタイプの完全な表記を確認するには、RFC1341 を参照してください。
圧縮用に割り当てられたメモリーは、最大接続数に影響を与える可能性があります。さらに、大きなバッファーを圧縮すると、正規表現による負荷が多い場合や正規表現のリストが長い場合など、レイテンシーが発生する可能性があります。
すべての MIME タイプが圧縮から利点を得るわけではありませんが、HAProxy は、指示された場合でもリソースを使用して圧縮を試みます。一般に、html、css、js などのテキスト形式は圧縮から利点を得ますが、イメージ、音声、ビデオなどのすでに圧縮済みの形式は、圧縮に時間とリソースが費やされるわりに利点はほぼありません。
手順
Ingress Controller の
httpCompressionフィールドを設定します。以下のコマンドを使用して
IngressControllerリソースを編集します。$ oc edit -n openshift-ingress-operator ingresscontrollers/defaultspecで、httpCompressionポリシーフィールドをmimeTypesに設定し、圧縮を適用する必要がある MIME タイプのリストを指定します。apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: default namespace: openshift-ingress-operator spec: httpCompression: mimeTypes: - "text/html" - "text/css; charset=utf-8" - "application/json" ...
8.9.21. ルーターメトリクスの公開 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトで、HAProxy ルーターメトリクスをデフォルトの stats ポート (1936) に Prometheus 形式で公開できます。Prometheus などの外部メトリクス収集および集約システムは、HAProxy ルーターメメトリクスにアクセスできます。HAProxy ルーターメトリクスは、HTML およびコンマ区切り値 (CSV) 形式でブラウザーに表示できます。
前提条件
- ファイアウォールを、デフォルトの stats ポート (1936) にアクセスするように設定している。
手順
次のコマンドを実行して、ルーター Pod 名を取得します。
$ oc get pods -n openshift-ingress出力例
NAME READY STATUS RESTARTS AGE router-default-76bfffb66c-46qwp 1/1 Running 0 11hルーター Pod が
/var/lib/haproxy/conf/metrics-auth/statsUsernameおよび/var/lib/haproxy/conf/metrics-auth/statsPasswordファイルに保存しているルーターのユーザー名およびパスワードを取得します。次のコマンドを実行して、ユーザー名を取得します。
$ oc rsh <router_pod_name> cat metrics-auth/statsUsername次のコマンドを実行して、パスワードを取得します。
$ oc rsh <router_pod_name> cat metrics-auth/statsPassword
次のコマンドを実行して、ルーター IP およびメトリクス証明書を取得します。
$ oc describe pod <router_pod>つぎのコマンドを実行して、Prometheus 形式で未加工の統計情報を取得します。
$ curl -u <user>:<password> http://<router_IP>:<stats_port>/metrics次のコマンドを実行して、安全にメトリクスにアクセスします。
$ curl -u user:password https://<router_IP>:<stats_port>/metrics -k次のコマンドを実行して、デフォルトの stats ポート (1936) にアクセスします。
$ curl -u <user>:<password> http://<router_IP>:<stats_port>/metrics例8.1 出力例
... # HELP haproxy_backend_connections_total Total number of connections. # TYPE haproxy_backend_connections_total gauge haproxy_backend_connections_total{backend="http",namespace="default",route="hello-route"} 0 haproxy_backend_connections_total{backend="http",namespace="default",route="hello-route-alt"} 0 haproxy_backend_connections_total{backend="http",namespace="default",route="hello-route01"} 0 ... # HELP haproxy_exporter_server_threshold Number of servers tracked and the current threshold value. # TYPE haproxy_exporter_server_threshold gauge haproxy_exporter_server_threshold{type="current"} 11 haproxy_exporter_server_threshold{type="limit"} 500 ... # HELP haproxy_frontend_bytes_in_total Current total of incoming bytes. # TYPE haproxy_frontend_bytes_in_total gauge haproxy_frontend_bytes_in_total{frontend="fe_no_sni"} 0 haproxy_frontend_bytes_in_total{frontend="fe_sni"} 0 haproxy_frontend_bytes_in_total{frontend="public"} 119070 ... # HELP haproxy_server_bytes_in_total Current total of incoming bytes. # TYPE haproxy_server_bytes_in_total gauge haproxy_server_bytes_in_total{namespace="",pod="",route="",server="fe_no_sni",service=""} 0 haproxy_server_bytes_in_total{namespace="",pod="",route="",server="fe_sni",service=""} 0 haproxy_server_bytes_in_total{namespace="default",pod="docker-registry-5-nk5fz",route="docker-registry",server="10.130.0.89:5000",service="docker-registry"} 0 haproxy_server_bytes_in_total{namespace="default",pod="hello-rc-vkjqx",route="hello-route",server="10.130.0.90:8080",service="hello-svc-1"} 0 ...ブラウザーで以下の URL を入力して、stats ウィンドウを起動します。
http://<user>:<password>@<router_IP>:<stats_port>オプション: ブラウザーに次の URL を入力して、CSV 形式で統計情報を取得します。
http://<user>:<password>@<router_ip>:1936/metrics;csv
8.9.22. HAProxy エラーコードの応答ページのカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、503、404、またはその両方のエラーページにカスタムのエラーコード応答ページを指定できます。HAProxy ルーターは、アプリケーション Pod が実行していない場合や、要求された URL が存在しない場合に 404 エラーページを提供する 503 エラーページを提供します。たとえば、503 エラーコードの応答ページをカスタマイズすると、アプリケーション Pod が実行していないときにページが提供され、不正なルートまたは存在しないルートに対しては、デフォルトの 404 エラーコード HTTP 応答ページが HAProxy ルーターにより提供されます。
カスタムエラーコードの応答ページは config map に指定し、Ingress Controller にパッチを適用されます。config map キーには、error-page-503.http と error-page-404.http の 2 つの利用可能なファイル名があります。
カスタムの HTTP エラーコードの応答ページは、HAProxy HTTP エラーページ設定のガイドライン に従う必要があります。以下は、デフォルトの OpenShift Container Platform HAProxy ルーターの http 503 エラーコード応答ページ の例です。デフォルトのコンテンツを、独自のカスタムページを作成するためのテンプレートとして使用できます。
デフォルトで、HAProxy ルーターは、アプリケーションが実行していない場合や、ルートが正しくないまたは存在しない場合に 503 エラーページのみを提供します。このデフォルトの動作は、OpenShift Container Platform 4.8 以前の動作と同じです。HTTP エラーコード応答をカスタマイズするための config map が提供されておらず、カスタム HTTP エラーコード応答ページを使用している場合、ルーターはデフォルトの 404 または 503 エラーコード応答ページを提供します。
OpenShift Container Platform のデフォルトの 503 エラーコードページをカスタマイズのテンプレートとして使用する場合、ファイル内のヘッダーで CRLF 改行コードを使用できるエディターが必要になります。
手順
openshift-configにmy-custom-error-code-pagesという名前の config map を作成します。$ oc -n openshift-config create configmap my-custom-error-code-pages \ --from-file=error-page-503.http \ --from-file=error-page-404.http重要カスタムエラーコードの応答ページに適した形式を指定しない場合は、ルーター Pod が停止します。この停止を解決するには、config map を削除するか、修正し、影響を受けるルーター Pod を削除して、正しい情報で再作成できるようにします。
Ingress Controller にパッチを適用し、名前を指定して
my-custom-error-code-pagesconfig map を参照します。$ oc patch -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"httpErrorCodePages":{"name":"my-custom-error-code-pages"}}}' --type=mergeIngress Operator は、
openshift-confignamespace からopenshift-ingressnamespace にmy-custom-error-code-pagesconfig map をコピーします。Operator は、openshift-ingressnamespace のパターン<your_ingresscontroller_name>-errorpagesに従って config map に名前を付けます。コピーを表示します。
$ oc get cm default-errorpages -n openshift-ingress出力例
NAME DATA AGE default-errorpages 2 25s1 - 1
defaultの Ingress Controller カスタムリソース (CR) にパッチが適用されているため、config map 名の例はdefault-errorpagesです。
カスタムエラー応答ページを含む config map がルーターボリュームにマウントされることを確認します。config map キーは、カスタム HTTP エラーコード応答を持つファイル名です。
503 カスタム HTTP カスタムエラーコード応答の場合:
$ oc -n openshift-ingress rsh <router_pod> cat /var/lib/haproxy/conf/error_code_pages/error-page-503.http404 カスタム HTTP カスタムエラーコード応答の場合:
$ oc -n openshift-ingress rsh <router_pod> cat /var/lib/haproxy/conf/error_code_pages/error-page-404.http
検証
カスタムエラーコード HTTP 応答を確認します。
テストプロジェクトおよびアプリケーションを作成します。
$ oc new-project test-ingress$ oc new-app django-psql-example503 カスタム http エラーコード応答の場合:
- アプリケーションのすべての Pod を停止します。
以下の curl コマンドを実行するか、ブラウザーでルートのホスト名にアクセスします。
$ curl -vk <route_hostname>
404 カスタム http エラーコード応答の場合:
- 存在しないルートまたは正しくないルートにアクセスします。
以下の curl コマンドを実行するか、ブラウザーでルートのホスト名にアクセスします。
$ curl -vk <route_hostname>
errorfile属性がhaproxy.configファイルで適切にあるかどうかを確認します。$ oc -n openshift-ingress rsh <router> cat /var/lib/haproxy/conf/haproxy.config | grep errorfile
8.9.23. Ingress Controller の最大接続数の設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、OpenShift ルーターデプロイメントの同時接続の最大数を設定できます。既存の Ingress Controller にパッチを適用して、接続の最大数を増やすことができます。
前提条件
- 以下では、Ingress Controller が作成済みであることを前提とします。
手順
Ingress Controller を更新して、HAProxy の最大接続数を変更します。
$ oc -n openshift-ingress-operator patch ingresscontroller/default --type=merge -p '{"spec":{"tuningOptions": {"maxConnections": 7500}}}'警告spec.tuningOptions.maxConnectionsの値を現在のオペレーティングシステムの制限よりも大きく設定すると、HAProxy プロセスは開始しません。このパラメーターの詳細は、「Ingress Controller 設定パラメーター」セクションの表を参照してください。
第9章 OpenShift Container Platform の Ingress Node Firewall Operator リンクのコピーリンクがクリップボードにコピーされました!
Ingress Node Firewall Operator は、OpenShift Container Platform でノードレベルの Ingress トラフィックを管理するための、ステートレスな eBPF ベースのファイアウォールを提供します。
9.1. Ingress Node Firewall Operator リンクのコピーリンクがクリップボードにコピーされました!
イングレスノードファイアウォール Operator は、ノードレベルでイングレスファイアウォールルールを提供し、ファイアウォール設定でこれらのルールを指定および管理できます。
Operator によって作成されたデーモンセットをデプロイするには、IngressNodeFirewallConfig カスタムリソース (CR) を作成します。Operator は IngressNodeFirewallConfig CR を適用して、nodeSelector に一致するすべてのノードで実行される ingress ノードファイアウォールデーモンセット (daemon) を作成します。
IngressNodeFirewall CR の rules を設定し、nodeSelector を使用して値を "true" に設定してクラスターに適用します。
Ingress Node Firewall Operator は、ステートレスファイアウォールルールのみをサポートします。
ネイティブ XDP ドライバーをサポートしないネットワークインターフェイスコントローラー (NIC) は、より低いパフォーマンスで実行されます。
OpenShift Container Platform 4.14 以降の場合は、RHEL 9.0 以降で Ingress Node Firewall Operator を実行する必要があります。
9.2. Ingress Node Firewall Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者であれば、OpenShift Container Platform CLI を使用して Ingress Node Firewall Operator をインストールし、ノードレベルのイングレスファイアウォールを有効にすることができます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - 管理者権限を持つアカウントがある。
手順
openshift-ingress-node-firewallnamespace を作成するには、次のコマンドを入力します。$ cat << EOF| oc create -f - apiVersion: v1 kind: Namespace metadata: labels: pod-security.kubernetes.io/enforce: privileged pod-security.kubernetes.io/enforce-version: v1.24 name: openshift-ingress-node-firewall EOFOperatorGroupCR を作成するには、以下のコマンドを実行します。$ cat << EOF| oc create -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: ingress-node-firewall-operators namespace: openshift-ingress-node-firewall EOFIngress Node Firewall Operator にサブスクライブします。
Ingress Node Firewall Operator の
SubscriptionCR を作成するには、次のコマンドを入力します。$ cat << EOF| oc create -f - apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: ingress-node-firewall-sub namespace: openshift-ingress-node-firewall spec: name: ingress-node-firewall channel: stable source: redhat-operators sourceNamespace: openshift-marketplace EOF
Operator がインストールされていることを確認するには、以下のコマンドを入力します。
$ oc get ip -n openshift-ingress-node-firewall出力例
NAME CSV APPROVAL APPROVED install-5cvnz ingress-node-firewall.4.20.0-202211122336 Automatic trueOperator のバージョンを確認するには、次のコマンドを入力します。
$ oc get csv -n openshift-ingress-node-firewall出力例
NAME DISPLAY VERSION REPLACES PHASE ingress-node-firewall.4.20.0-202211122336 Ingress Node Firewall Operator 4.20.0-202211122336 ingress-node-firewall.4.20.0-202211102047 Succeeded
9.3. Web コンソールを使用した Ingress Node Firewall Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者として、Web コンソールを使用して Ingress Node Firewall Operator をインストールすることで、ノードレベルのイングレスファイアウォールを有効にできます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - 管理者権限を持つアカウントがある。
手順
Ingress Node Firewall Operator をインストールします。
- OpenShift Container Platform Web コンソールで、Ecosystem → Software Catalog をクリックします。
- 利用可能な Operator のリストから Ingress Node Firewall Operator を選択し、Install をクリックします。
- Install Operator ページの Installed Namespace で、Operator recommended Namespace を選択します。
- Install をクリックします。
Ingress Node Firewall Operator が正常にインストールされていることを確認します。
- Ecosystem → Installed Operators ページに移動します。
Ingress Node Firewall Operator が openshift-ingress-node-firewall プロジェクトにリストされ、Status が InstallSucceeded であることを確認します。
注記インストール時に、Operator は Failed ステータスを表示する可能性があります。インストールが後に InstallSucceeded メッセージを出して正常に実行される場合は、Failed メッセージを無視できます。
Operator の Status が InstallSucceeded でない場合は、次の手順を使用してトラブルシューティングを行います。
- Operator Subscriptions および Install Plans タブで、Status の下の失敗またはエラーの有無を確認します。
-
Workloads → Pods ページに移動し、
openshift-ingress-node-firewallプロジェクトの Pod のログを確認します。 YAML ファイルの namespace を確認してください。アノテーションが抜けている場合は、次のコマンドを使用して、アノテーション
workload.openshift.io/allowed=managementを Operator namespace に追加できます。$ oc annotate ns/openshift-ingress-node-firewall workload.openshift.io/allowed=management注記単一ノードの OpenShift クラスターの場合、
openshift-ingress-node-firewallnamespace にはworkload.openshift.io/allowed=managementアノテーションが必要です。
9.4. Ingress Node Firewall Operator のデプロイ リンクのコピーリンクがクリップボードにコピーされました!
Ingress Node Firewall Operator をデプロイするには、Operator のデーモンセットをデプロイする IngressNodeFirewallConfig カスタムリソースを作成します。ファイアウォールルールを適用することで、1 つまたは複数の IngressNodeFirewall CRD をノードにデプロイできます。
前提条件
- Ingress Node Firewall Operator がインストールされます。
手順
-
ingressnodefirewallconfigという名前のopenshift-ingress-node-firewallnamespace 内にIngressNodeFirewallConfigを作成します。 次のコマンドを実行して、Ingress Node Firewall Operator ルールをデプロイします。
$ oc apply -f rule.yaml
9.5. Ingress ノードファイアウォール設定オブジェクト リンクのコピーリンクがクリップボードにコピーされました!
設定項目を確認し、Operator がファイアウォールをどのように展開するかを定義してください。
Ingress Node Firewall 設定オブジェクトのフィールドについて、次の表で説明します。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
CR オブジェクトの名前。ファイアウォールルールオブジェクトの名前は |
|
|
|
Ingress Firewall Operator CR オブジェクトの namespace。 |
|
|
| 指定されたノードラベルを介してノードをターゲットにするために使用されるノード選択制約。以下に例を示します。
注記
デーモンセットを開始するには、 |
|
|
| Node Ingress Firewall Operator が eBPF プログラムを管理するために eBPF Manager Operator を使用するかどうかを指定します。この機能はテクノロジープレビュー機能です。 Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。 |
Operator は CR を使用し、nodeSelector に一致するすべてのノード上に Ingress ノードファイアウォールデーモンセットを作成します。
9.5.1. Ingress Node Firewall Operator の設定例 リンクのコピーリンクがクリップボードにコピーされました!
次の例では、完全な Ingress ノードファイアウォール設定が指定されています。
Ingress ノードファイアウォール設定オブジェクトを作成する方法の例
$ cat << EOF | oc create -f -
apiVersion: ingressnodefirewall.openshift.io/v1alpha1
kind: IngressNodeFirewallConfig
metadata:
name: ingressnodefirewallconfig
namespace: openshift-ingress-node-firewall
spec:
nodeSelector:
node-role.kubernetes.io/worker: ""
EOF
Operator は CR オブジェクトを消費し、nodeSelector に 一致するすべてのノードに Ingress ノードファイアウォールデーモンセットを作成します。
9.5.2. Ingress ノードファイアウォールルールオブジェクト リンクのコピーリンクがクリップボードにコピーされました!
Ingress Node Firewall ルールオブジェクトを使用すると、ルールフィールドと例を確認して、どの受信トラフィックを許可または拒否するかを定義できます。
Ingress ノードファイアウォールルールオブジェクトのフィールドについて、次の表で説明します。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
| CR オブジェクトの名前。 |
|
|
|
このオブジェクトのフィールドは、ファイアウォールルールを適用するインターフェイスを指定します。たとえば、 |
|
|
|
|
|
|
|
|
9.5.2.1. Ingress オブジェクトの設定 リンクのコピーリンクがクリップボードにコピーされました!
ingress オブジェクトの値は、次の表で定義されています。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
| CIDR ブロックを設定できます。異なるアドレスファミリーから複数の CIDR を設定できます。 注記
異なる CIDR を使用すると、同じ順序ルールを使用できます。CIDR が重複する同じノードおよびインターフェイスに対して複数の |
|
|
|
Ingress ファイアウォール
注記 Ingress ファイアウォールルールは、無効な設定をブロックする検証 Webhook を使用して検証されます。検証 Webhook は、API サーバーなどの重大なクラスターサービスをブロックすることを防ぎます。 |
9.5.2.2. Ingress ノードファイアウォールルールオブジェクトの例 リンクのコピーリンクがクリップボードにコピーされました!
次の例では、完全な Ingress ノードファイアウォール設定が指定されています。
Ingress ノードファイアウォールの設定例
apiVersion: ingressnodefirewall.openshift.io/v1alpha1
kind: IngressNodeFirewall
metadata:
name: ingressnodefirewall
spec:
interfaces:
- eth0
nodeSelector:
matchLabels:
<label_name>: <label_value>
ingress:
- sourceCIDRs:
- 172.16.0.0/12
rules:
- order: 10
protocolConfig:
protocol: ICMP
icmp:
icmpType: 8 #ICMP Echo request
action: Deny
- order: 20
protocolConfig:
protocol: TCP
tcp:
ports: "8000-9000"
action: Deny
- sourceCIDRs:
- fc00:f853:ccd:e793::0/64
rules:
- order: 10
protocolConfig:
protocol: ICMPv6
icmpv6:
icmpType: 128 #ICMPV6 Echo request
action: Deny
+ ノード上には <label_name> と <label_value> が存在し、ingressfirewallconfig CR を実行するノードに適用されている nodeselector の ラベルと値と一致している必要があります。<label_value> は true または false になります。nodeSelector ラベルを使用すると、ノードのグループを個別にターゲットにして、ingressfirewallconfig CR の使用に異なるルールを適用できます。
9.5.2.3. ゼロトラスト Ingress ノードファイアウォールルールオブジェクトの例 リンクのコピーリンクがクリップボードにコピーされました!
ゼロトラストの Ingress ノードファイアウォールルールは、マルチインターフェイスクラスターに追加のセキュリティーを提供できます。たとえば、ゼロトラストの Ingress ノードファイアウォールルールを使用して、SSH を除く特定のインターフェイス上のすべてのトラフィックをドロップできます。
ネットワークインターフェイスクラスターに対するゼロトラストイングレスノードファイアウォールルールの完全な設定を、次の例で示します。
次の場合、ユーザーはアプリケーションが使用するすべてのポートを許可リストに追加して、適切な機能を確保する必要があります。
ゼロトラストの Ingress ノードファイアウォールルールの例
apiVersion: ingressnodefirewall.openshift.io/v1alpha1
kind: IngressNodeFirewall
metadata:
name: ingressnodefirewall-zero-trust
spec:
interfaces:
- eth1
nodeSelector:
matchLabels:
<ingress_firewall_label_name>: <label_value>
ingress:
- sourceCIDRs:
- 0.0.0.0/0
rules:
- order: 10
protocolConfig:
protocol: TCP
tcp:
ports: 22
action: Allow
- order: 20
action: Deny
eBPF Manager Operator の統合は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
9.6. Ingress ノードファイアウォール Operator の統合 リンクのコピーリンクがクリップボードにコピーされました!
eBPF Manager を使用してイングレスノードファイアウォールプログラムをロードおよび管理するタイミングを学びましょう。
Ingress Node Firewall は、eBPF プログラムを使用して、主要なファイアウォール機能の一部を実装します。デフォルトでは、これらの eBPF プログラムは、Ingress Node Firewall に固有のメカニズムを使用してカーネルにロードされます。代わりに、これらのプログラムのロードと管理に eBPF Manager Operator を使用するように Ingress Node Firewall Operator を設定できます。
この統合を有効にすると、次の制限が適用されます。
- XDP が利用できず、TCX が bpfman と互換性がない場合、Ingress Node Firewall Operator は TCX を使用します。
-
Ingress Node Firewall Operator デーモンセットの Pod は、ファイアウォールルールが適用されるまで
ContainerCreating状態のままになります。 - Ingress Node Firewall Operator デーモンセットの Pod は権限として実行します。
9.7. eBPF Manager Operator を使用するように Ingress ノードファイアウォール Operator の設定 リンクのコピーリンクがクリップボードにコピーされました!
イングレスノードファイアウォールを設定して、プログラムライフサイクル制御に eBPF マネージャーを使用するようにします。
Ingress Node Firewall は、eBPF プログラムを使用して、主要なファイアウォール機能の一部を実装します。デフォルトでは、これらの eBPF プログラムは、Ingress Node Firewall に固有のメカニズムを使用してカーネルにロードされます。
クラスター管理者は、Ingress Node Firewall Operator を設定して、代わりに eBPF Manager Operator を使用してこれらのプログラムをロードおよび管理し、セキュリティーと監視機能を追加できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - 管理者権限を持つアカウントがある。
- Ingress Node Firewall Operator をインストールしました。
- eBPF Manager Operator をインストールしている。
手順
ingress-node-firewall-systemnamespace に次のラベルを適用します。$ oc label namespace openshift-ingress-node-firewall \ pod-security.kubernetes.io/enforce=privileged \ pod-security.kubernetes.io/warn=privileged --overwriteingressnodefirewallconfigという名前のIngressNodeFirewallConfigオブジェクトを編集し、ebpfProgramManagerModeフィールドを設定します。Ingress Node Firewall Operator 設定オブジェクト
apiVersion: ingressnodefirewall.openshift.io/v1alpha1 kind: IngressNodeFirewallConfig metadata: name: ingressnodefirewallconfig namespace: openshift-ingress-node-firewall spec: nodeSelector: node-role.kubernetes.io/worker: "" ebpfProgramManagerMode: <ebpf_mode>ここでは、以下のようになります。
<ebpf_mode>: Ingress Node Firewall Operator が eBPF Manager Operator を使用して eBPF プログラムを管理するかどうかを指定します。trueまたはfalseのどちらかでなければなりません。設定されていないと、eBPF マネージャーは使用されません。
9.8. Ingress Node Firewall Operator ルールの表示 リンクのコピーリンクがクリップボードにコピーされました!
既存のルールと設定を検査し、ファイアウォールが意図どおりに適用されていることを確認してください。
手順
次のコマンドを実行して、現在のルールをすべて表示します。
$ oc get ingressnodefirewall返された
<resource>名のいずれかを選択し、次のコマンドを実行してルールまたは設定を表示します。$ oc get <resource> <name> -o yaml
9.9. Ingress Node Firewall Operator のトラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
ステータスを確認したり、ログを表示したりすることで、イングレスファイアウォールのデプロイメントやルールに関する問題を診断できます。
手順
次のコマンドを実行して、インストールされている Ingress ノードファイアウォールのカスタムリソース定義 (CRD) を一覧表示します。
$ oc get crds | grep ingressnodefirewall出力例
NAME READY UP-TO-DATE AVAILABLE AGE ingressnodefirewallconfigs.ingressnodefirewall.openshift.io 2022-08-25T10:03:01Z ingressnodefirewallnodestates.ingressnodefirewall.openshift.io 2022-08-25T10:03:00Z ingressnodefirewalls.ingressnodefirewall.openshift.io 2022-08-25T10:03:00Z次のコマンドを実行して、Ingress Node Firewall Operator の状態を表示します。
$ oc get pods -n openshift-ingress-node-firewall出力例
NAME READY STATUS RESTARTS AGE ingress-node-firewall-controller-manager 2/2 Running 0 5d21h ingress-node-firewall-daemon-pqx56 3/3 Running 0 5d21h次のフィールドは、Operator のステータスに関する情報を提供します:
READY、STATUS、AGE、およびRESTARTS。Ingress Node Firewall Operator が割り当てられたノードに設定されたデーモンをデプロイしている場合、STATUSフィールドはRunningになります。次のコマンドを実行して、すべての Ingress ファイアウォールノード Pod のログを収集します。
$ oc adm must-gather – gather_ingress_node_firewallログは、
/sos_commands/ebpfにある eBPFbpftool出力を含む sos ノードのレポートで利用できます。これらのレポートには、Ingress ファイアウォール XDP がパケット処理を処理し、統計を更新し、イベントを発行するときに使用または更新されたルックアップテーブルが含まれます。
第10章 SR-IOV Operator リンクのコピーリンクがクリップボードにコピーされました!
10.1. SR-IOV Network Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
クラスター上で SR-IOV ネットワークデバイスとネットワークアタッチメントを管理するには、Single Root I/O Virtualization (SR-IOV) ネットワークオペレータをインストールしてください。この Operator を使用することで、SR-IOV リソースの設定とライフサイクル管理を一元化できます。
クラスター管理者は、OpenShift Container Platform CLI または Web コンソールを使用して、Single Root I/O Virtualization (SR-IOV) Network Operator をインストールできます。
10.1.1. CLI を使用して SR-IOV Network Operator をインストールする リンクのコピーリンクがクリップボードにコピーされました!
CLI を使用して SR-IOV Network Operator をインストールできます。CLI を使用すると、Web コンソールを操作せずに、端末から直接 Operator をデプロイして、SR-IOV ネットワークデバイスとアタッチメントを管理できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つアカウントがある。 - ベアメタルハードウェア上にクラスターをインストールし、クラスターノードが SR-IOV をサポートするハードウェアを備えていることを確認しました。
手順
次のコマンドを入力して、
openshift-sriov-network-operatornamespace を作成します。$ cat << EOF| oc create -f - apiVersion: v1 kind: Namespace metadata: name: openshift-sriov-network-operator annotations: workload.openshift.io/allowed: management EOF次のコマンドを入力して、
OperatorGroupカスタムリソース (CR) を作成します。$ cat << EOF| oc create -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: sriov-network-operators namespace: openshift-sriov-network-operator spec: targetNamespaces: - openshift-sriov-network-operator EOF次のコマンドを入力して、SR-IOV Network Operator の
SubscriptionCR を作成します。$ cat << EOF| oc create -f - apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: sriov-network-operator-subscription namespace: openshift-sriov-network-operator spec: channel: stable name: sriov-network-operator source: redhat-operators sourceNamespace: openshift-marketplace EOF次のコマンドを入力して、
SriovoperatorConfigリソースを作成します。$ cat <<EOF | oc create -f - apiVersion: sriovnetwork.openshift.io/v1 kind: SriovOperatorConfig metadata: name: default namespace: openshift-sriov-network-operator spec: enableInjector: true enableOperatorWebhook: true logLevel: 2 disableDrain: false EOF
検証
Operator がインストールされていることを確認するには、次のコマンドを入力し、出力に Operator のステータスが
成功と表示されていることを確認してください。$ oc get csv -n openshift-sriov-network-operator \ -o custom-columns=Name:.metadata.name,Phase:.status.phase
10.1.2. Web コンソールを使用して SR-IOV Network Operator をインストールする リンクのコピーリンクがクリップボードにコピーされました!
Web コンソールを使用して、SR-IOV Network Operator をインストールできます。Web コンソールを使用すると、CLI を使用することなく、グラフィカルインターフェイスから直接 Operator をデプロイし、SR-IOV ネットワークデバイスとアタッチメントを管理できます。
前提条件
-
cluster-admin権限を持つアカウントがある。 - ベアメタルハードウェア上にクラスターをインストールし、クラスターノードが SR-IOV をサポートするハードウェアを備えていることを確認しました。
手順
SR-IOV Network Operator をインストールします。
- OpenShift Container Platform Web コンソールで、Ecosystem → Software Catalog をクリックします。
- 利用可能な Operator の一覧から SR-IOV Network Operator を選択してから Install をクリックします。
- Install Operator ページの Installed Namespace で、Operator recommended Namespace を選択します。
- Install をクリックします。
検証
- Ecosystem → Installed Operators ページに移動します。
Status が InstallSucceeded の状態で、SR-IOV Network Operator が openshift-sriov-network-operator プロジェクトにリスト表示されていることを確認します。
注記インストール時に、Operator は Failed ステータスを表示する可能性があります。インストールが後に InstallSucceeded メッセージを出して正常に実行される場合は、Failed メッセージを無視できます。
Operator がインストール済みとして表示されない場合は、以下のいずれかの手順を実行して問題を解決してください。
- Operator Subscriptions および Install Plans タブで、Status の下の失敗またはエラーの有無を確認します。
-
Workloads → Pods ページに移動し、
openshift-sriov-network-operatorプロジェクトで Pod のログを確認します。 YAML ファイルの namespace を確認してください。アノテーションが抜けている場合は、次のコマンドを使用して、アノテーション
workload.openshift.io/allowed=managementを Operator namespace に追加できます。$ oc annotate ns/openshift-sriov-network-operator workload.openshift.io/allowed=management注記シングルノード OpenShift クラスターの場合は、namespace にアノテーション
workload.openshift.io/allowed=managementが必要です。
10.2. SR-IOV Network Operator の設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター内の SR-IOV ネットワークデバイスとネットワークアタッチメントを管理するには、Single Root I/O Virtualization (SR-IOV) ネットワークオペレータを使用します。
10.2.1. SR-IOV Network Operator の設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター内の SR-IOV ネットワークデバイスとネットワークアタッチメントを管理するには、Single Root I/O Virtualization (SR-IOV) ネットワークオペレータを設定します。その後、Operator コンポーネントをクラスターにデプロイできます。
手順
SriovOperatorConfigカスタムリソース (CR) を作成します。次の例では、sriovOperatorConfig.yamlという名前のファイルを作成します。apiVersion: sriovnetwork.openshift.io/v1 kind: SriovOperatorConfig metadata: name: default namespace: openshift-sriov-network-operator spec: disableDrain: false enableInjector: true enableOperatorWebhook: true logLevel: 2 featureGates: metricsExporter: false # ...ここでは、以下のようになります。
metadata.name-
SR-IOV Network Operator インスタンスの名前を指定します。
SriovOperatorConfigリソースの有効な名前はdefault のみであり、その名前はオペレーターがデプロイされている名前空間内に存在する必要があります。 spec.enableInjector-
ネットワークリソースインジェクターPod がこの名前空間内で実行できるかどうかを指定します。CR で指定されていない場合、または明示的にtrueに設定されていない場合は、デフォルトでfalseまたは<none>となり、ネットワークリソースインジェクターPod がネームスペース内で実行されるのを防ぎます。推奨設定はtrueです。 spec.enableOperatorWebhook-
名前空間内で
オペレーターウェブフックPod を実行できるかどうかを指定します。enableOperatorWebhookフィールドは、CR で指定されていないか、明示的に true に設定されていない場合、デフォルトでfalseまたは<none>に設定されます。その場合、namespace でoperator-webhookPod が実行されなくなります。推奨設定はtrueです。
以下のコマンドを実行して、リソースをクラスターに適用します。
$ oc apply -f sriovOperatorConfig.yaml
10.2.2. SR-IOV Network Operator config カスタムリソース リンクのコピーリンクがクリップボードにコピーされました!
SR-IOV Network Operator をカスタマイズするには、sriovoperatorconfig カスタムリソースを設定します。このリファレンスには、Operator のグローバル設定とデプロイメント動作を制御するために使用できるパラメーターが記載されています。
以下の表は、sriovoperatorconfig CR フィールドについて説明しています。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
SR-IOV Network Operator インスタンスの名前を指定します。デフォルト値は |
|
|
|
SR-IOV Network Operator インスタンスの namespace を指定します。デフォルト値は |
|
|
| 選択されたノードで SR-IOV Network Config Daemon のスケジューリングを制御するノードの選択オプションを指定します。デフォルトでは、このフィールドは設定されておらず、Operator はコンピュートノード上に SR-IOV ネットワーク設定デーモンセットをデプロイします。 |
|
|
|
新しいポリシーを適用してノードに NIC を設定する時に、ノードドレインプロセスを無効にするか、有効にするかを指定します。このフィールドを |
|
|
| Network Resources Injector デーモンセットを有効にするか無効にするかを指定します。 |
|
|
| Operator Admission Controller の Webhook デーモンセットを有効にするか無効にするかを指定します。 |
|
|
|
Operator のログの詳細レベルを指定します。デフォルトでは、このフィールドは |
|
|
|
任意の機能を有効にするか無効にするかを指定します。たとえば、 |
|
|
|
SR-IOV Network Operator メトリクスを有効にするか無効にするかを指定します。デフォルトでは、このフィールドは |
|
|
|
SR-IOV Network Operator の Virtual Function (VF) の変更時にファームウェアをリセットするかどうかを指定します。Intel C740 シリーズなどの一部のチップセットでは、NVIDIA/Mellanox NIC で VF を設定するために必要な PCI-E デバイスの電源が完全にオフになりません。デフォルトでは、このフィールドは 重要
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。 |
10.2.3. Network Resources Injector について リンクのコピーリンクがクリップボードにコピーされました!
ワークロードのネットワーク設定を自動化するには、Network Resources Injector を使用します。この Kubernetes ダイナミックアドミッションコントローラーは、Pod 作成要求を傍受し、クラスター用に定義された必要なネットワークリソースとパラメーターを自動的に注入します。
Network Resources Injector は、以下の機能を提供します。
- SR-IOV リソース名を SR-IOV ネットワーク割り当て定義アノテーションに従って追加するための、Pod 仕様でのリソース要求および制限の変更。
-
Pod のアノテーション、ラベル、および huge page の要求および制限を公開するための Downward API ボリュームでの Pod 仕様の変更。Pod で実行されるコンテナーは、公開される情報に
/etc/podnetinfoパスでファイルとしてアクセスできます。
SR-IOV Network Operator は、SriovOperatorConfig CR で enableInjector が true に設定されている場合、Network Resources Injector を有効にします。network-resources-injector Pod は、すべてのコントロールプレーンノード上でデーモンセットとして実行されます。以下は、3 つのコントロールプレーンノードを持つクラスターで実行される Network Resources Injector Pod の例です。
$ oc get pods -n openshift-sriov-network-operator
出力例
NAME READY STATUS RESTARTS AGE
network-resources-injector-5cz5p 1/1 Running 0 10m
network-resources-injector-dwqpx 1/1 Running 0 10m
network-resources-injector-lktz5 1/1 Running 0 10m
デフォルトでは、Network Resources Injector Webhook の failurePolicy フィールドは Ignore に設定されています。このデフォルト設定により、Webhook が利用できない場合でも Pod の作成がブロックされなくなります。
failurePolicy フィールドが Fail に設定され、Network Resources Injector Webhook が利用できない場合は、Webhook はすべての Pod 作成および更新リクエストを変更しようとします。この動作により、Pod の作成がブロックされ、通常のクラスター操作が中断される可能性があります。このような問題を回避するには、SriovOperatorConfig オブジェクトの featureGates.resourceInjectorMatchCondition 機能を有効にして、Network Resources Injector Webhook のスコープを制限できます。この機能を有効にすると、Webhook はセカンダリーネットワークアノテーション k8s.v1.cni.cncf.io/networks を持つ Pod にのみ適用されます。
resourceInjectorMatchCondition 機能の有効化後、failurePolicy フィールドを Fail に設定すると、Webhook はセカンダリーネットワークアノテーション k8s.v1.cni.cncf.io/networks を持つ Pod にのみ適用されます。ウェブフックが利用できない場合でも、クラスターはこのアノテーションなしで Pod をデプロイします。これにより、クラスターの運用に不要な中断が生じるのを防ぎます。
featureGates.resourceInjectorMatchCondition 機能はデフォルトで無効になっています。この機能を有効にするには、SriovOperatorConfig オブジェクトで featureGates.resourceInjectorMatchCondition フィールドを true に設定します。
SriovOperatorConfig オブジェクトの設定例
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovOperatorConfig
metadata:
name: default
namespace: sriov-network-operator
spec:
# ...
featureGates:
resourceInjectorMatchCondition: true
# ...
10.2.4. Network Resources Injector の無効化または有効化 リンクのコピーリンクがクリップボードにコピーされました!
クラスターワークロードの自動設定を制御するには、Network Resources Injector を有効または無効にします。これらの設定を調整することで、Kubernetes Dynamic Admission Controller が Pod の作成時にネットワークリソースとパラメーターを自動的に Pod に注入するかどうかをより適切に管理できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - SR-IOV Network Operator がインストールされていること。
手順
enableInjectorフィールドを設定します。<value>をfalseに置き換えて機能を無効にするか、trueに置き換えて機能を有効にします。$ oc patch sriovoperatorconfig default \ --type=merge -n openshift-sriov-network-operator \ --patch '{ "spec": { "enableInjector": <value> } }'ヒントまたは、以下の YAML を適用して Operator を更新することもできます。
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovOperatorConfig metadata: name: default namespace: openshift-sriov-network-operator spec: enableInjector: <value> # ...
10.2.5. SR-IOV Network Operator Admission Controller Webhook について リンクのコピーリンクがクリップボードにコピーされました!
ネットワーク設定を検証し、エラーを防止するには、SR-IOV Network Operator のアドミッションコントローラー Webhook を利用してください。この Kubernetes ダイナミックアドミッションコントローラーは、API リクエストを傍受し、SR-IOV リソース定義と Pod 仕様がクラスターポリシーに準拠していることを確認します。
SR-IOV Network Operator アドミッションコントローラーの Webhook は、以下の機能を提供します。
-
作成時または更新時の
SriovNetworkNodePolicyCR の検証 -
CR の作成または更新時の
priorityおよびdeviceTypeフィールドのデフォルト値の設定によるSriovNetworkNodePolicyCR の変更
SR-IOV Network Operator Admission Controller Webhook は、SriovOperatorConfig CR で enableOperatorWebhook が true に設定されている場合、Operator によって有効になります。operator-webhook Pod は、すべてのコントロールプレーンノード上でデーモンセットとして実行されます。
SR-IOV Network Operator Admission Controller Webhook を無効にする場合は注意してください。トラブルシューティングなどの特定の状況下や、サポートされていないデバイスを使用する場合は、Webhook を無効にすることができます。サポートされていないデバイスの設定方法については、サポートされていない NIC を使用するように SR-IOV Network Operator を設定するを参照してください。
以下は、3 つのコントロールプレーンノードを持つクラスターで実行される Operator Admission Controller Webhook Pod の例です。
$ oc get pods -n openshift-sriov-network-operator
出力例
NAME READY STATUS RESTARTS AGE
operator-webhook-9jkw6 1/1 Running 0 16m
operator-webhook-kbr5p 1/1 Running 0 16m
operator-webhook-rpfrl 1/1 Running 0 16m
10.2.6. SR-IOV Network Operator Admission Controller Webhook の無効化または有効化 リンクのコピーリンクがクリップボードにコピーされました!
ネットワーク設定の検証を管理するには、SR-IOV Network Operator のアドミッションコントローラー Webhook を有効または無効にします。有効にすると、Operator は SR-IOV リソース定義と Pod 仕様をクラスターポリシーに対して自動的に検証します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - SR-IOV Network Operator がインストールされていること。
手順
enableOperatorWebhookフィールドを設定します。<value>をfalseに置き換えて機能を無効するか、trueに置き換えて機能を有効にします。$ oc patch sriovoperatorconfig default --type=merge \ -n openshift-sriov-network-operator \ --patch '{ "spec": { "enableOperatorWebhook": <value> } }'ヒントまたは、以下の YAML を適用して Operator を更新することもできます。
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovOperatorConfig metadata: name: default namespace: openshift-sriov-network-operator spec: enableOperatorWebhook: <value> # ...
10.2.7. SR-IOV Network Config Daemon のカスタム NodeSelector の設定 リンクのコピーリンクがクリップボードにコピーされました!
SR-IOV ネットワーク設定デーモンをホストするノードを指定するには、ノードラベルを使用してカスタムノードセレクターを設定します。このタスクを完了すると、デプロイメントをデフォルトのコンピュートノードではなく、特定のノードに制限できます。
SR-IOV Network Config デーモンは、クラスターノード上の SR-IOV ネットワークデバイスを検出し、設定します。デフォルトでは、デーモンはクラスター内のすべてのコンピュートノードにデプロイされます。
configDaemonNodeSelector フィールドを更新する際に、SR-IOV Network Config デーモンがそれぞれの選択されたノードに再作成されます。デーモンが再作成されている間、クラスターのユーザーは新規の SR-IOV Network ノードポリシーを適用したり、新規の SR-IOV Pod を作成したりできません。
手順
Operator のノードセレクターを更新するには、次のコマンドを入力します。
$ oc patch sriovoperatorconfig default --type=json \ -n openshift-sriov-network-operator \ --patch '[{ "op": "replace", "path": "/spec/configDaemonNodeSelector", "value": {<node_label>} }]'以下の例のように、
<node_label>を適用するラベルに置き換えます:"node-role.kubernetes.io/worker": ""ヒントまたは、以下の YAML を適用して Operator を更新することもできます。
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovOperatorConfig metadata: name: default namespace: openshift-sriov-network-operator spec: configDaemonNodeSelector: <node_label> # ...
10.2.8. 単一ノードのインストール用の SR-IOV Network Operator の設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、SR-IOV Network Operator は、ポリシーを変更するたびに、ノードからワークロードをドレイン (解放) します。Operator は、再設定前にワークロードが Virtual Function を使用していないことを確認するために、この操作を実行します。そのため、Operator がシングルノードからワークロードを排出しないように設定する必要があります。
シングルノードへのインストールの場合、他のノードはワークロードを受け取りません。
以下の手順を実行してワークロードのドレインを無効にした後に、SR-IOV ネットワークインターフェイスを使用しているワークロードを削除してから SR-IOV ネットワークノードのポリシーを変更する必要があります。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - SR-IOV Network Operator がインストールされていること。
手順
disableDrainフィールドをtrueに設定し、configDaemonNodeSelectorフィールドをnode-role.kubernetes.io/master: ""に設定するには、以下のコマンドを入力します。$ oc patch sriovoperatorconfig default --type=merge -n openshift-sriov-network-operator --patch '{ "spec": { "disableDrain": true, "configDaemonNodeSelector": { "node-role.kubernetes.io/master": "" } } }'ヒントまたは、以下の YAML を適用して Operator を更新することもできます。
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovOperatorConfig metadata: name: default namespace: openshift-sriov-network-operator spec: disableDrain: true configDaemonNodeSelector: node-role.kubernetes.io/master: "" # ...
10.2.8.1. Hosted Control Plane 用の SR-IOV Operator のデプロイ リンクのコピーリンクがクリップボードにコピーされました!
ホスティングサービスクラスターを設定してデプロイすると、ホステッドクラスターで SR-IOV Operator へのサブスクリプションを作成できます。SR-IOV Pod は、コントロールプレーンではなくワーカーマシンで実行されます。
前提条件
AWS 上でホステッドクラスターを設定およびデプロイしている。
手順
namespace と Operator グループを作成します。
apiVersion: v1 kind: Namespace metadata: name: openshift-sriov-network-operator --- apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: sriov-network-operators namespace: openshift-sriov-network-operator spec: targetNamespaces: - openshift-sriov-network-operatorSR-IOV Operator へのサブスクリプションを作成します。
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: sriov-network-operator-subsription namespace: openshift-sriov-network-operator spec: channel: stable name: sriov-network-operator config: nodeSelector: node-role.kubernetes.io/worker: "" source: redhat-operators sourceNamespace: openshift-marketplace
検証
SR-IOV Operator の準備ができていることを確認するには、次のコマンドを実行し、結果の出力を表示します。
$ oc get csv -n openshift-sriov-network-operator出力例
NAME DISPLAY VERSION REPLACES PHASE sriov-network-operator.4.20.0-202211021237 SR-IOV Network Operator 4.20.0-202211021237 sriov-network-operator.4.20.0-202210290517 SucceededSR-IOV Pod がデプロイされていることを確認するには、次のコマンドを実行します。
$ oc get pods -n openshift-sriov-network-operator
10.2.9. SR-IOV ネットワークメトリクスエクスポーターについて リンクのコピーリンクがクリップボードにコピーされました!
SR-IOVPod のネットワークアクティビティーを監視するには、SR-IOV ネットワークメトリクスエクスポート機能を有効にしてください。このツールは、SR-IOVVirtual Function (VF) のメトリクスを Prometheus 形式で公開するため、OpenShift Container Platform の Web コンソールを通じてデータを照会および視覚化できます。
Web コンソールを使用して SR-IOV VF メトリクスをクエリーすると、SR-IOV ネットワークメトリクスエクスポーターは、VF が接続されている Pod の名前と namespace とともに、VF ネットワーク統計を取得して返します。
以下の表は、メトリクスエクスポート機能が読み取り、Prometheus 形式で公開する SR-IOV VF メトリクスについて説明しています。
| メトリクス | 説明 | VF メトリクスを調べるための PromQL クエリーの例 |
|---|---|---|
|
| Virtual Function ごとに受信したバイト数。 |
|
|
| Virtual Function ごとに送信されたバイト数。 |
|
|
| Virtual Function ごとの受信パケット数。 |
|
|
| Virtual Function あたりの送信パケット数。 |
|
|
| Virtual Function ごとに受信時にドロップされたパケット。 |
|
|
| Virtual Function ごとに送信中にドロップされたパケット。 |
|
|
| Virtual Function ごとに受信したマルチキャストパケット。 |
|
|
| Virtual Function ごとに受信したブロードキャストパケット。 |
|
|
| アクティブな Pod にリンクされた Virtual Function。 | - |
また、kube-state- メトリクス s ツールを使用してこれらのクエリーを組み合わせることで、SR-IOVPod に関するより詳細な情報を取得することもできます。たとえば、次のクエリーを使用して、標準の Kubernetes Pod ラベルからアプリケーション名とともに VF ネットワーク統計を取得できます。
(sriov_vf_tx_packets * on (pciAddr,node) group_left(pod,namespace) sriov_kubepoddevice) * on (pod,namespace) group_left (label_app_kubernetes_io_name) kube_pod_labels
10.2.9.1. SR-IOV ネットワークメトリクスエクスポーターを有効にする リンクのコピーリンクがクリップボードにコピーされました!
SR-IOV ネットワークメトリクスエクスポーターを有効にするには、spec.featureGates.metricsExporter フィールドを true に設定します。エクスポート機能はデフォルトでは無効になっているため、SR-IOV デバイスのメトリクスを公開するには、このフィーチャーゲートを明示的に有効にする必要があります。
メトリクスエクスポーターが有効になっていると、SR-IOV Network Operator は SR-IOV 機能を持つノードにのみメトリクスエクスポーターをデプロイします。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - SR-IOV Network Operator がインストールされている。
手順
次のコマンドを実行して、クラスター監視を有効にします。
$ oc label ns/openshift-sriov-network-operator openshift.io/cluster-monitoring=trueクラスター監視を有効にするには、SR-IOV Network Operator をインストールした namespace に
openshift.io/cluster-monitoring=trueラベルを追加する必要があります。次のコマンドを実行して、
spec.featureGates.metricsExporterフィールドをtrueに設定します。$ oc patch -n openshift-sriov-network-operator sriovoperatorconfig/default \ --type='merge' -p='{"spec": {"featureGates": {"metricsExporter": true}}}'
検証
次のコマンドを実行して、SR-IOV ネットワークメトリクスエクスポーターが有効になっていることを確認します。
$ oc get pods -n openshift-sriov-network-operator出力例
NAME READY STATUS RESTARTS AGE operator-webhook-hzfg4 1/1 Running 0 5d22h sriov-network-config-daemon-tr54m 1/1 Running 0 5d22h sriov-network-metrics-exporter-z5d7t 1/1 Running 0 10s sriov-network-operator-cc6fd88bc-9bsmt 1/1 Running 0 5d22hsriov-network- メトリクス s-exporterPod がREADY状態になっていることを確認してください。- オプション: OpenShift Container Platform Web コンソールを使用して、SR-IOV Virtual Function (VF) メトリクスを調べます。詳細は、「メトリクスのクエリー」を参照してください。
10.3. SR-IOV Network Operator のアンインストール リンクのコピーリンクがクリップボードにコピーされました!
SR-IOV Network Operator をアンインストールするには、実行中の SR-IOV ワークロードをすべて削除し、Operator をアンインストールして、Operator が使用した Webhook を削除する必要があります。
10.3.1. SR-IOV Network Operator のアンインストール リンクのコピーリンクがクリップボードにコピーされました!
Operator をアンインストールすることで、クラスターから SR-IOV ネットワークオペレータを削除できます。これにより、SR-IOV ネットワークデバイスの管理が不要になった時点で、Operator とその関連リソースが確実に削除されます。
前提条件
-
cluster-admin権限を持つアカウントを使用して OpenShift Container Platform クラスターにアクセスできる。 - SR-IOV Network Operator がインストールされている。
手順
すべての SR-IOV カスタムリソース (CR) を削除します。
$ oc delete sriovnetwork -n openshift-sriov-network-operator --all$ oc delete sriovnetworknodepolicy -n openshift-sriov-network-operator --all$ oc delete sriovibnetwork -n openshift-sriov-network-operator --all$ oc delete sriovoperatorconfigs -n openshift-sriov-network-operator --all- 「クラスターからの Operator の削除」セクションに記載された手順に従い、クラスターから SR-IOV Network Operator を削除します。
SR-IOV Network Operator のアンインストール後にクラスターに残っている SR-IOV カスタムリソース定義を削除します。
$ oc delete crd sriovibnetworks.sriovnetwork.openshift.io$ oc delete crd sriovnetworknodepolicies.sriovnetwork.openshift.io$ oc delete crd sriovnetworknodestates.sriovnetwork.openshift.io$ oc delete crd sriovnetworkpoolconfigs.sriovnetwork.openshift.io$ oc delete crd sriovnetworks.sriovnetwork.openshift.io$ oc delete crd sriovoperatorconfigs.sriovnetwork.openshift.ioSR-IOV Network Operator の namespace を削除します。
$ oc delete namespace openshift-sriov-network-operator
第11章 DPU Operator リンクのコピーリンクがクリップボードにコピーされました!
11.1. DPU Operator リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、DPU Operator をクラスターに追加して、DPU デバイスとネットワークアタッチメントを管理できます。
DPU Operator はテクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
11.1.1. DPU Operator による DPU のオーケストレーション リンクのコピーリンクがクリップボードにコピーされました!
Data Processing Unit (DPU) Operator を使用すると、ネットワーキング、ストレージ、およびセキュリティーのワークロードをホスト CPU からオフロードする DPU を管理して、クラスターのパフォーマンスと効率を高めることができます。
DPU は、プログラム可能なプロセッサーの一種です。CPU や GPU と並んでコンピューティングを支える 3 つの基本的な柱の 1 つです。CPU が一般的なコンピューティングタスクを処理し、GPU が特定のワークロードを高速化するのに対し、DPU の主なロールは、ネットワーク、ストレージ、セキュリティー機能などのデータ中心のワークロードをオフロードして高速化することです。
DPU は通常、データセンターやクラウド環境で、CPU からこれらのタスクをオフロードすることでパフォーマンスを向上させ、レイテンシーを削減し、セキュリティーを強化するために使用されます。DPU を使用して、特化したワークロードをデータソースのより近くにデプロイすることを可能にし、それによって、より効率的で柔軟なインフラストラクチャーを構築することもできます。
DPU Operator は、DPU デバイスとネットワークアタッチメントを管理します。DPU Operator は、DPU 上で稼働する DPU デーモンを制御する API を介して通信する OpenShift Container Platform コンピュートノードに、DPU デーモンをデプロイします。DPU Operator は、ovn-kube コンポーネントのライフサイクル管理と、DPU における必須のホストネットワーク初期化という役割を担います。
次の表は、現在サポートされている DPU デバイスを示しています。
| ベンター | デバイス | ファームウェア | 説明 |
|---|---|---|---|
| Intel | IPU E2100 | バージョン 2.0.0.11126 以降 | データセンターのホスト CPU からネットワーク、ストレージ、およびセキュリティータスクをオフロードし、効率とパフォーマンスを向上させるように設計された DPU。完全なエンドツーエンドのソリューションをデプロイする手順は、Red Hat ナレッジベースソリューション Accelerating Confidential AI on OpenShift with the Intel E2100 IPU, DPU Operator, and F5 NGINX を参照してください。 |
| Senao | SX904 | 35.23.47.0008 以降 | データセンターやエッジコンピューティング環境のホスト CPU からコンピュートとネットワークサービスをオフロードし、ワークロードの効率と分離を向上させるように設計された SmartNIC。 |
| Marvell | Marvell Octeon 10 CN106 | SDK12.25.01 以降 | データセンターやエッジコンピューティング環境のホスト CPU から高速データ処理を必要とするワークロードをオフロードし、パフォーマンスとエネルギー効率を高めるように設計された DPU。 |
NVIDIA BlueField-3 はサポートされていません。
11.1.2. DPU Operator のインストール リンクのコピーリンクがクリップボードにコピーされました!
ホストクラスターと DPU クラスターの両方に Data Processing Unit (DPU) Operator をインストールし、CLI または Web コンソールを使用してデバイスのライフサイクルとネットワークアタッチメントを管理できます。
クラスター管理者は、OpenShift Container Platform CLI または Web コンソールを使用して、ホストクラスターおよびすべての DPU クラスターに DPU Operator をインストールできます。DPU Operator は、サポートされているすべての DPU のライフサイクル、DPU デバイス、およびネットワークアタッチメントを管理します。
ホストクラスターと各 DPU クラスターに DPU Operator をインストールする必要があります。
11.1.2.1. CLI を使用して DPU Operator をインストールする リンクのコピーリンクがクリップボードにコピーされました!
CLI を使用して DPU Operator をインストールできます。DPU Operator を使用すると、ホストクラスターで DPU デバイス管理を設定するときにインストールプロセスを単純化できます。
クラスター管理者は、CLI を使用して DPU Operator をインストールできます。
DPU クラスターに DPU Operator をインストールするには、CLI を使用する必要があります。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つアカウントがある。
手順
次のコマンドを入力して、
openshift-dpu-operatornamespace を作成します。$ cat << EOF| oc create -f - apiVersion: v1 kind: Namespace metadata: name: openshift-dpu-operator annotations: workload.openshift.io/allowed: management EOF次のコマンドを入力して、
OperatorGroupカスタムリソース (CR) を作成します。$ cat << EOF| oc create -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: dpu-operators namespace: openshift-dpu-operator spec: targetNamespaces: - openshift-dpu-operator EOF次のコマンドを入力して、DPU Operator の
SubscriptionCR を作成します。$ cat << EOF| oc create -f - apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: openshift-dpu-operator-subscription namespace: openshift-dpu-operator spec: channel: stable name: dpu-operator source: redhat-operators sourceNamespace: openshift-marketplace EOF
検証
Operator がインストールされていることを確認するには、次のコマンドを入力し、Operator に対して出力に
Succeededと表示されていることを確認します。$ oc get csv -n openshift-dpu-operator \ -o custom-columns=Name:.metadata.name,Phase:.status.phaseopenshift-dpu-operatorプロジェクトに変更します。$ oc project openshift-dpu-operator次のコマンドを入力して、DPU Operator が実行されていることを確認します。
$ oc get pods -n openshift-dpu-operator出力例
NAME READY STATUS RESTARTS AGE dpu-operator-controller-manager-6b7bbb5db8-7lvkj 2/2 Running 0 2m9s
11.1.2.2. Web コンソールを使用して DPU Operator をインストールする リンクのコピーリンクがクリップボードにコピーされました!
Web コンソールを使用して DPU Operator をインストールできます。DPU Operator を使用すると、ホストクラスターで DPU デバイス管理を設定するときにインストールプロセスを単純化できます。
クラスター管理者は、Web コンソールを使用して DPU Operator をインストールできます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つアカウントがある。
手順
- OpenShift Container Platform Web コンソールで、Ecosystem → Software Catalog をクリックします。
- 利用可能な Operator のリストから DPU Operator を選択してから Install をクリックします。
Install Operator ページの Installed Namespace で、Operator recommended Namespace オプションを選択します。アクションは不要です。
- Install をクリックします。
検証
- Ecosystem → Installed Operators ページに移動します。
openshift-dpu-operator プロジェクトに DPU Operator がリストされており、その Status が InstallSucceeded であることを確認します。
注記インストール時に、Operator は Failed ステータスを表示する可能性があります。インストールが後に InstallSucceeded メッセージを出して正常に実行される場合は、Failed メッセージを無視できます。
トラブルシューティング
- Operator Subscriptions および Install Plans タブで、Status の下の失敗またはエラーの有無を確認します。
-
Workloads → Pods ページに移動し、
openshift-dpu-operatorプロジェクトで Pod のログを確認します。 YAML ファイルの namespace を確認してください。アノテーションが抜けている場合は、次のコマンドを使用して、アノテーション
workload.openshift.io/allowed=managementを Operator namespace に追加できます。$ oc annotate ns/openshift-dpu-operator workload.openshift.io/allowed=management注記シングルノード OpenShift クラスターの場合は、namespace にアノテーション
workload.openshift.io/allowed=managementが必要です。
11.1.3. DPU Operator の設定 リンクのコピーリンクがクリップボードにコピーされました!
インストール後に DPU Operator を設定して、デュアルクラスターとシングルクラスターの両方のデプロイメントモードで DPU デバイスとネットワークアタッチメントの管理を有効にできます。
クラスター内の DPU デバイスとネットワークアタッチメントを管理するように DPU Operator を設定できます。
DPU Operator を設定するには、次の手順に従います。
手順
デプロイメントモードに基づき、
DpuOperatorConfigカスタムリソース (CR) を作成します。-
デュアルクラスターデプロイメント: ホスト OpenShift Container Platform クラスターと、各 Red Hat build of MicroShift (MicroShift) DPU クラスターの両方に、
DpuOperatorConfigCR を作成する必要があります。 シングルクラスターデプロイメント: このデプロイメントでは、標準の OpenShift Container Platform クラスターを使用します。このクラスターでは、
DpuOperatorConfigCR を 1 回だけ作成する必要があります。CR の内容はすべてのクラスターで同じです。
-
デュアルクラスターデプロイメント: ホスト OpenShift Container Platform クラスターと、各 Red Hat build of MicroShift (MicroShift) DPU クラスターの両方に、
次の YAML を使用して、
dpu-operator-config.yamlという名前のファイルを作成します。apiVersion: config.openshift.io/v1 kind: DpuOperatorConfig metadata: name: dpu-operator-config spec: logLevel: 0-
metadata.name: カスタムリソースの名前を指定します。これはdpu-operator-configである必要があります。 -
spec.logLevel: Operator コンテナーログに任意のログ詳細レベルを設定します。値のデフォルト設定は0です。
-
次のコマンドを実行して、リソースを作成します。
$ oc apply -f dpu-operator-config.yamlDPU が接続されている、あるいは DPU として機能している、そのいずれかに該当するすべてのノードにラベルを付けます。次のコマンドを実行してこのラベルを適用できます。
$ oc label node <node_name> dpu=trueここでは、以下のようになります。
node_nameノードの名前を参照します (例:
worker-1)。注記DPU と互換性のあるクラスターは、次の 2 つの方法でデプロイできます。
-
デュアルクラスターデプロイメント: ホスト上で実行される OpenShift Container Platform と、DPU 上で実行される Red Hat build of MicroShift (MicroShift) で構成されます。このモードでは、Red Hat build of MicroShift (MicroShift) インスタンスも DPU Operator をデプロイする必要があり、ノードに
dpu=trueのラベルを設定する必要があります。 -
シングルクラスターデプロイメント: DPU がメインクラスターに統合されているホスト上で実行される OpenShift Container Platform のみで構成されます。DPU では、DPU がインストールされているホストノードと DPU ノード自体の両方に
dpu=trueのラベルが必要です。DPU Operator は、ノードが DPU として実行されているか、DPU が割り当てられたホストとして実行されているかを自動的に検出します。
-
デュアルクラスターデプロイメント: ホスト上で実行される OpenShift Container Platform と、DPU 上で実行される Red Hat build of MicroShift (MicroShift) で構成されます。このモードでは、Red Hat build of MicroShift (MicroShift) インスタンスも DPU Operator をデプロイする必要があり、ノードに
11.1.4. DPU を搭載したホスト上でワークロードを実行する リンクのコピーリンクがクリップボードにコピーされました!
DPU を搭載したホストにワークロードをデプロイすると、特殊なインフラストラクチャータスクをオフロードし、ホストの CPU リソースを解放しながらパフォーマンスを高めることができます。
DPU でワークロードを実行すると、ネットワーク、セキュリティー、ストレージなどの特殊なインフラストラクチャータスクを専用の処理ユニットにオフロードできるようになります。これにより、パフォーマンスが向上し、インフラストラクチャーとアプリケーションのワークロード間のセキュリティー境界が強化され、ホストの CPU リソースが解放されます。
DPU を搭載したホストにワークロードをデプロイするには、次の手順に従います。これは標準的なデプロイメントモデルで、アプリケーションはホストの x86 CPU 上で実行されますが、ネットワークの高速化とオフロードのために DPU が使用されます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つアカウントが利用可能である。 - DPU Operator がインストールされている。
手順
次の YAML を使用して、ホスト側のワーカーノードで実行するように設計されたサンプルワークロードを作成します。ファイルを
workload-host.yamlとして保存します。apiVersion: v1 kind: Pod metadata: name: my-pod namespace: default annotations: k8s.v1.cni.cncf.io/networks: default-sriov-net spec: nodeSelector: kubernetes.io/hostname: worker-237 containers: - name: appcntr1 image: registry.access.redhat.com/ubi9/ubi:latest command: ['/bin/sh', '-c', 'sleep infinity'] imagePullPolicy: Always securityContext: priviledged: true runAsNonRoot: false runAsUser: 0 seccompProfile: type: RuntimeDefault resources: requests: openshift.io/dpu: '1' limits: openshift.io/dpu: '1'spec.nodeSelector: ノードセレクターは、DPU リソースを持つノード上の Pod をスケジュールします。kubernetes.io/hostnameなどの標準の Kubernetes セレクターを使用して、サンプル YAML に示すように、特定のノードをターゲットにすることができます。注記柔軟なスケジューリングのために、DPU Operator はラベル dpu.config.openshift.io/dpuside: "dpu-host" を作成します。このラベルにより、デフォルトのスケジューラーは、DPU を同さいした任意のホストにワークロードを配置できます。ワークロードは自動的にその DPU セカンダリーネットワークに参加します。ノードのラベルが
dpu.config.openshift.io/dpuside: "dpu"の場合、そのノードが DPU であることを示しています。DPU Operator は、dpu.config.openshift.io/dpusideラベルの作成と管理を行います。次のコマンドを実行して、ワークロードを作成します。
$ oc apply -f workload-host.yaml
11.1.5. DPU でワークロードを実行する リンクのコピーリンクがクリップボードにコピーされました!
ネットワークワークロードを DPU に直接デプロイすることで、パフォーマンスの向上、セキュリティー分離の強化、ホスト CPU 使用率の削減を実現できます。
DPU は、セキュリティー機能や仮想化アプライアンスなどのネットワークワークロードをオフロードして、パフォーマンスの向上、セキュリティー分離の強化、ホスト CPU リソースの解放を行います。
シンプルな Pod を DPU に直接デプロイするには、次の手順に従います。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つアカウントがある。 - DPU Operator をインストールします。
手順
次のサンプル YAML ファイルを
dpu-pod.yamlとして保存します。これは、Kubernetes のデフォルトスケジューラーによって DPU ノードに直接スケジュールされる単純な Pod の例です。apiVersion: v1 kind: Pod metadata: name: "my-network-function" namespace: openshift-dpu-operator annotations: k8s.v1.cni.cncf.io/networks: dpunfcni-conf, dpunfcni-conf spec: nodeSelector: dpu.config.openshift.io/dpuside: "dpu" containers: - name: "my-network-function" image: "quay.io/example-org/my-network-function:latest" resources: requests: openshift.io/dpu: "2" limits: openshift.io/dpu: "2" securityContext: privileged: true capabilities: drop: - ALL add: - NET_RAW - NET_ADMIN-
metadata.name.annotations.k8s.v1.cni.cncf.io/networks:dpunfcni-confの値は、NetworkAttachmentDefinitionリソースの名前を指定します。DPU Operator は、インストール中にこのリソースを作成して、DPU ネットワーキングを設定します。 -
spec.nodeSelector:nodeSelectorは、このワークロードをスケジュールするためのプライマリーメカニズムです。DPU Operator は、dpu.config.openshift.io/dpuside: "dpu"ラベルを作成して管理します。このラベルにより、Pod は確実に DPU の処理ユニットに直接スケジュールされます。 -
spec.containers.name: コンテナーの名前。 -
spec.containers.image: プルして実行するコンテナーイメージ。
-
以下のコマンドを実行して Pod を作成します。
$ oc apply -f dpu-pod.yaml次のコマンドを実行して Pod のステータスを確認します。
$ oc get pods -n openshift-dpu-operatorPod のステータスが
Runningであることを確認します。
11.1.6. DPU ステータスの監視 リンクのコピーリンクがクリップボードにコピーされました!
DPU インフラストラクチャーのステータスを監視して、クラスター全体の DPU デバイスの現在の状態と健全性を確認できます。
DPU ステータスを監視して、DPU インフラストラクチャーの現在の状態を確認できます。
oc get dpu コマンドは、DPU インフラストラクチャーの現在の状態を示します。さまざまなカードのステータスを監視するには、次の手順に従ってください。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つアカウントが利用可能である。 - DPU Operator がインストールされている。
手順
次のコマンドを実行して、ノードの全体的な健全性を確認します。
$ oc get nodes出力例では、クラスター内のすべてのノードとそのステータスのリストが提供されます。すべてのノードが
Ready状態であることを確認してから続行してください。NAME STATUS ROLES AGE VERSION ocpcluster-master-1 Ready master 10d v1.32.9 ocpcluster-master-2 Ready master 10d v1.32.9 ocpcluster-master-3 Ready master 10d v1.32.9 ocpcluster-dpu-ipu-219 Ready worker 42h v1.32.9 ocpcluster-dpu-marvell-41 Ready worker 3d23h v1.32.9 ocpcluster-dpu-ptl-243 Ready worker 3d23h v1.32.9 worker-host-ipu-219 Ready worker 3d19h v1.32.9 worker-host-marvell-41 Ready worker 4d v1.32.9 worker-host-ptl-243 Ready worker 3d23h v1.32.9この出力には、3 つのマスターノードと、worker-host の接頭辞 (例:
worker-host-ipu-219) で識別される 3 つのワーカーノードが表示されます。各ワーカーノードには、ocpcluster-dpu の接頭辞で識別される DPU (例:ocpcluster-dpu-ipu-219) が含まれます。次のコマンドを実行して、DPU のステータスを報告します。
$ oc get dpu出力例では、検出された DPU のリストが提供されます。
NAME DPU PRODUCT DPU SIDE MODE NAME STATUS 030001163eec00ff-host Intel Netsec Accelerator false worker-host-ptl-243 True d4-e5-c9-00-ec-3v-dpu Intel Netsec Accelerator true worker-dpu-ptl-243 True intel-ipu-0000-06-00.0-host Intel IPU E2100 false worker-host-ipu-219 False intel-ipu-dpu Intel IPU E2100 true worker-dpu-ipu-219 False marvell-dpu-0000-87-00.0-host Marvell DPU false worker-host-marvell-41 True marvell-dpu-ipu Marvell DPU true worker-dpu-marvell-41 True-
DPU PRODUCT: DPU のベンダーまたはタイプ (Intel や Marvell など) が表示されます。 -
DPU SIDE: DPU がホスト側 (false) と DPU 側 (true) のどちらで動作しているか示します。物理 DPU はそれぞれ 2 回表示されます。 -
MODE NAME: DPU が配置されているノードの名前。これは、falseエントリーの場合はホストワーカーノード、trueエントリーの場合は DPU ノードです。 STATUS: DPU が正しく機能しているか (True)、問題があるか (False) を示します。注記ステータスの詳細を取得するには、
oc get dpu -o yamlを実行します。
-
11.1.7. DPU Operator のアンインストール リンクのコピーリンクがクリップボードにコピーされました!
DPU デバイスの管理が不要になった場合は、まずすべてのワークロードが削除されたことを確認してから、クラスターから DPU Operator をアンインストールできます。
DPU Operator をアンインストールするには、まず実行中の DPU ワークロードを削除する必要があります。DPU Operator をアンインストールするには、次の手順に従います。
前提条件
-
cluster-admin権限を持つアカウントを使用して OpenShift Container Platform クラスターにアクセスできる。 - DPU Operator がインストールされている。
手順
次のコマンドを実行して作成された
DpuOperatorConfigCR を削除します。$ oc delete DpuOperatorConfig dpu-operator-config次のコマンドを実行して、DPU Operator のインストールに使用されたサブスクリプションを削除します。
$ oc delete Subscription openshift-dpu-operator-subscription -n openshift-dpu-operator次のコマンドを実行して、作成された
OperatorGroupリソースを削除します。$ oc delete OperatorGroup dpu-operators -n openshift-dpu-operator次のように DPU Operator をアンインストールします。
次のコマンドを実行して、インストールされている Operator を確認します。
$ oc get csv -n openshift-dpu-operator出力例
NAME DISPLAY VERSION REPLACES PHASE dpu-operator.v4.20.0-202503130333 DPU Operator 4.20.0-202503130333 Failed次のコマンドを実行して DPU Operator を削除します。
$ oc delete csv dpu-operator.v4.20.0-202503130333 -n openshift-dpu-operator
次のコマンドを実行して、DPU Operator 用に作成された namespace を削除します。
$ oc delete namespace openshift-dpu-operator
検証
次のコマンドを実行して、DPU Operator がアンインストールされていることを確認します。コマンドが成功した場合は、たとえば
No resources found in openshift-dpu-operator namespaceが出力されます。$ oc get csv -n openshift-dpu-operator