ネットワーク


Red Hat build of MicroShift 4.14

クラスターネットワークの設定および管理

Red Hat OpenShift Documentation Team

概要

このドキュメントでは、DNS、ingress、Pod ネットワークなど、MicroShift クラスターネットワークを設定および管理する手順を説明します。

第1章 OVN-Kubernetes ネットワークプラグインについて

OVN-Kubernetes Container Network Interface (CNI) プラグインは、MicroShift クラスターのデフォルトのネットワークソリューションです。OVN-Kubernetes は、Open Virtual Network (OVN) に基づく Pod およびサービス用の仮想化ネットワークです。

  • デフォルトのネットワーク設定と接続は、インストール中に microshift-networking RPM を使用して MicroShift に自動的に適用されます。
  • OVN-Kubernetes ネットワークプラグインを使用するクラスターは、ノードで Open vSwitch (OVS) も実行します。
  • OVN-K は、宣言されたネットワーク設定を実装するようにノードの OVS を設定します。
  • ホストの物理インターフェイスは、デフォルトでは OVN-K ゲートウェイブリッジ br-ex にバインドされません。Network Manager CLI (nmcli) など、ホスト上の標準ツールを使用してデフォルトゲートウェイを管理できます。
  • CNI の変更は MicroShift ではサポートされていません。

設定ファイルまたはカスタムスクリプトを使用して、次のネットワーク設定を設定できます。

  • サブネットの CIDR 範囲を使用して、Pod に IP アドレスを割り当てることができます。
  • 最大伝送単位 (MTU) 値を変更できます。
  • ファイアウォールの Ingress と Egress を設定できます。
  • MicroShift クラスターでは、Ingress ルールや Egress ルールなどのネットワークポリシーを定義できます。

1.1. MicroShift ネットワークのカスタマイズ表

次の表はネットワーク機能のステータスをまとめたものです。デフォルトとして存在する機能、設定可能な機能、MicroShift サービスで使用できない機能があります。

表1.1 MicroShift のネットワーキング機能とカスタマイズの状態
ネットワーク機能利用可能カスタマイズ可能

アドレスのアドバタイズ

はい

はい [1]

Kubernetes ネットワークポリシー

はい

はい

Kubernetes ネットワークポリシーログ

利用不可

該当なし

負荷分散

はい

はい

マルチキャスト DNS

はい

はい [2]

ネットワークプロキシー

はい [3]

CRI-O

ネットワークパフォーマンス

はい

MTU 設定

Egress IP

利用不可

該当なし

Egress ファイアウォール

利用不可

該当なし

Egress ルーター

利用不可

該当なし

ファイアウォール

いいえ [4]

はい

ハードウェアのオフロード

利用不可

該当なし

ハイブリッドネットワーク

利用不可

該当なし

クラスター内通信の IPsec 暗号化

利用不可

該当なし

IPv6

利用不可 [5]

該当なし

  1. 設定されていない場合、デフォルト値はサービスネットワークのすぐ後のサブネットに設定されます。たとえば、サービスネットワークが 10.43.0.0/16 の場合、advertiseAddress は、10.44.0.0/32 に設定されます。
  2. マルチキャスト DNS プロトコル (mDNS) を使用することで、5353/UDP ポートで公開されているマルチキャストを使用した、ローカルエリアネットワーク (LAN) 内で名前解決とサービス検出が可能になります。
  3. MicroShift には、Egress トラフィックをプロキシーする、埋め込みの透過的機能はありません。Egress は手動で設定する必要があります。
  4. firewalld サービスのセットアップは、RHEL for Edge でサポートされています。
  5. IPv6 はどの設定でも使用できません。

1.1.1. デフォルトの設定

config.yaml ファイルを作成しない場合は、デフォルト値が使用されます。次の例は、デフォルトの設定を示しています。

  • デフォルト値を確認するには、次のコマンドを実行します。

    $ microshift show-config

    YAML 形式でのデフォルト値の出力例

    dns:
      baseDomain: microshift.example.com 1
    network:
      clusterNetwork:
        - 10.42.0.0/16 2
      serviceNetwork:
        - 10.43.0.0/16 3
      serviceNodePortRange: 30000-32767 4
    node:
      hostnameOverride: "" 5
      nodeIP: "" 6
    apiServer:
      advertiseAddress: 10.44.0.0/32 7
      subjectAltNames: [] 8
    debugging:
      logLevel: "Normal" 9

    1
    クラスターのベースドメイン。すべての管理対象 DNS レコードは、このベースのサブドメインになります。
    2
    Pod IP アドレスの割り当てに使用する IP アドレスのブロック。
    3
    Kubernetes サービスの仮想 IP アドレスのブロック。
    4
    タイプ NodePort の Kubernetes サービスに許可されるポート範囲。
    5
    ノードの名前。デフォルト値はホスト名です。
    6
    ノードの IP アドレス。デフォルト値は、デフォルトルートの IP アドレスです。
    7
    API サーバーがクラスターのメンバーにアドバタイズされる IP アドレスを指定する文字列。デフォルト値は、サービスネットワークのアドレスに基づいて計算されます。
    8
    API サーバー証明書のサブジェクト代替名。
    9
    ログの詳細レベル。このフィールドの有効な値は、NormalDebugTrace、または TraceAll です。

1.2. ネットワーク機能

MicroShift 4.14 で利用できるネットワーク機能には次のものがあります。

  • Kubernetes ネットワークポリシー
  • 動的ノード IP
  • カスタムゲートウェイインターフェイス
  • セカンドゲートウェイインターフェイス
  • 指定されたホストインターフェイス上のクラスターネットワーク
  • 特定のホストインターフェイス上の NodePort サービスへの外部アクセスをブロック

MicroShift 4.14 では利用できないネットワーク機能:

  • Egress IP/ファイアウォール/QoS: 無効
  • ハイブリッドネットワーク: サポートなし
  • IPsec: サポートなし
  • ハードウェアオフロード: サポートなし

1.3. IP 転送

ホストネットワーク sysctl net.ipv4.ip_forward カーネルパラメーターは、起動時に ovnkube-master コンテナーによって自動的に有効になります。これは、着信トラフィックを CNI に転送するために必要です。たとえば、ip_forward が無効になっている場合は、クラスターの外部から NodePort サービスにアクセスすると失敗します。

1.4. ネットワークパフォーマンスの最適化

デフォルトでは、リソース消費を最小限に抑えるために、OVS サービスに 3 つのパフォーマンス最適化が適用されます。

  • ovs-vswitchd.service および ovsdb-server.service への CPU アフィニティー
  • no-mlockall から openvswitch.service
  • ハンドラーと revalidator のスレッドを ovs-vswitchd.service に限定

1.5. MicroShift ネットワーキングコンポーネントおよびサービス

この簡単な概要では、MicroShift でのネットワークコンポーネントとその操作について説明します。microshift-networking RPM は、ネットワーク関連の依存関係と systemd サービスを自動的に取り込み、ネットワークを初期化するパッケージです (microshift-ovs-init systemd サービスなど)。

NetworkManager
MicroShift ノードで初期ゲートウェイブリッジをセットアップするには、NetworkManager が必要です。NetworkManager および NetworkManager-ovs RPM パッケージは、必要な設定ファイルを含む microshift-networking RPM パッケージへの依存関係としてインストールされます。MicroShift の NetworkManager は keyfile ファイルプラグインを使用し、microshift-networking RPM パッケージのインストール後に再起動されます。
microshift-ovs-init
microshift-ovs-init.service は、microshift.service に依存する systemd サービスとして、microshift-networking RPM パッケージによりインストールされます。OVS ゲートウェイブリッジを設定します。
OVN コンテナー

2 つの OVN-Kubernetes デーモンセットが MicroShift によってレンダリングおよび適用されます。

  • ovnkube-master northdnbdbsbdb、および ovnkube-master コンテナーが含まれます。
  • ovnkube-node ovnkube-node には、OVN-Controller コンテナーが含まれています。

    MicroShift の起動後、OVN-Kubernetes デーモンセットが openshift-ovn-kubernetes namespace にデプロイされます。

パッケージ

OVN-Kubernetes マニフェストと起動ロジックは MicroShift に組み込まれています。microshift-networking RPM に含まれる systemd サービスと設定は次のとおりです。

  • NetworkManager.service/etc/NetworkManager/conf.d/microshift-nm.conf
  • ovs-vswitchd.service/etc/systemd/system/ovs-vswitchd.service.d/microshift-cpuaffinity.conf
  • ovs-server.service/etc/systemd/system/ovsdb-server.service.d/microshift-cpuaffinity.conf
  • microshift-ovs-init.service/usr/bin/configure-ovs-microshift.sh
  • microshift-ovs-init.service/usr/bin/configure-ovs.sh
  • CRI-O サービスの /etc/crio/crio.conf.d/microshift-ovn.conf

1.6. ブリッジマッピング

ブリッジマッピングにより、プロバイダーネットワークのトラフィックは、物理ネットワークに到達することが可能となります。トラフィックはプロバイダーネットワークから出て、br-int ブリッジに到達します。br-intbr-ex の間のパッチポートは、トラフィックがプロバイダーネットワークとエッジネットワークを通信できるようにします。Kubernetes Pod は、仮想イーサネットペアを介して br-int ブリッジに接続されます。仮想イーサネットペアの一端は Pod の namespace に接続され、他端は br-int ブリッジに接続されます。

1.7. ネットワークトポロジー

OVN-Kubernetes は、オーバーレイベースのネットワーク実装を提供します。このオーバーレイには、Service および NetworkPolicy の OVS ベースの実装が含まれています。オーバーレイネットワークは、Geneve (Generic Network Virtualization Encapsulation) トンネルプロトコルを使用します。Geneve トンネルの Pod 最大伝送単位 (MTU) が設定されていない場合、デフォルトルートの MTU に設定されます。

MTU を設定する際には、ホスト上の物理インターフェイスの MTU 以下の値を設定する必要があります。その MTU 以下の値を設定することで、送信前にトンネルヘッダーに追加される必要な情報のための容量が確保されます。

OVS は MicroShift ノードで systemd サービスとして実行します。OVS RPM パッケージは、microshift-networking RPM パッケージへの依存関係としてインストールされます。OVS は、microshift-networking RPM がインストールされるとすぐに開始します。

Red Hat build of MicroShift ネットワークトポロジー

317 RHbM OVN topology 0923

1.7.1. 仮想化ネットワークの OVN 論理コンポーネントの説明

OVN ノードスイッチ

<node-name> という名前の仮想スイッチ。OVN ノードスイッチの名前は、ノードのホスト名に基づいて付けられます。

  • この例では、node-namemicroshift-dev です。
OVN クラスタールーター

ovn_cluster_router という名前の仮想ルーター。分散ルーターとも呼ばれます。

  • この例では、クラスターネットワークは 10.42.0.0/16 です。
OVN 結合スイッチ
join という名前の仮想スイッチ。
OVN ゲートウェイルーター
GR_<node-name> という名前の仮想ルーター。外部ゲートウェイルーターとも呼ばれます。
OVN 外部スイッチ
ext_<node-name> という名前の仮想スイッチ。

1.7.2. ネットワークトポロジー図の接続の説明

  • ネットワークサービスと OVN 外部スイッチ ext_microshift-dev の間の North-South トラフィックは、ゲートウェイブリッジ br-ex によってホストカーネルを介して提供されます。
  • OVN ゲートウェイルーター GR_microshift-dev は、論理ルーターポート 4 を介して外部ネットワークスイッチ ext_microshift-dev に接続しています。ポート 4 にはノード IP アドレス 192.168.122.14 が割り当てられます。
  • 参加スイッチ join は、OVN ゲートウェイルーター GR_microshift-dev を OVN クラスタールーター ovn_cluster_router に接続します。IP アドレス範囲は 100.62.0.0/16 です。

    • OVN ゲートウェイルーター GR_microshift-dev は、論理ルーターポート 3 を介して OVN 結合スイッチ join に接続します。ポート 3 は内部 IP アドレス 100.64.0.2 に接続します。
    • OVN クラスタールーター ovn_cluster_router は、論理ルーターポート 2 を介して 参加スイッチ join に接続します。ポート 2 は内部 IP アドレス 100.64.0.1 に接続します。
  • OVN クラスタールーター ovn_cluster_router は、論理ルーターポート 1 を介してノードスイッチ microshift-dev に接続します。ポート 1 には、OVN クラスターネットワーク IP アドレス 10.42.0.1 が割り当てられます。
  • Pod とネットワークサービス間の East-West トラフィックは、OVN クラスタールーター ovn_cluster_router とノードスイッチ microshift-dev によって提供されます。IP アドレス範囲は 10.42.0.0/24 です。
  • Pod 間の East-West トラフィックは、ネットワークアドレス変換 (NAT) を使用せずに、ノードスイッチ microshift-dev によって提供されます。
  • Pod と外部ネットワーク間の North-South トラフィックは、OVN クラスタールーター ovn_cluster_router とホストネットワークによって提供されます。このルーターは、ovn-kubernetes 管理ポート ovn-k8s-mp0 を介して、IP アドレス 10.42.0.2 で接続しています。
  • すべての Pod は、インターフェイスを介して OVN ノードスイッチに接続します。

    • この例では、Pod 1 と Pod 2 は、Interface 1Interface 2 を介してノードスイッチに接続しています。

第2章 ネットワーク設定について

ネットワークのカスタマイズとデフォルト設定を MicroShift デプロイメントに適用する方法を学びます。各ノードは単一のマシンと単一の MicroShift に含まれているため、デプロイごとに個別の構成、Pod、および設定が必要です。

クラスター管理者は、クラスターで実行されるアプリケーションを外部トラフィックに公開し、ネットワーク接続のセキュリティーを保護するための複数のオプションがあります。

  • NodePort などのサービス
  • IngressRoute などの API リソース

デフォルトで、Kubernetes は各 Pod に、Pod 内で実行しているアプリケーションの内部 IP アドレスを割り当てます。Pod とそのコンテナーの間にはトラフィックを配置できますが、NodePort などのサービスで公開されている場合を除き、クラスター外のクライアントは Pod に直接ネットワークアクセスできません。

注記

NodePort サービスの接続問題のトラブルシューティングを行うには、リリースノートの既知の問題を確認してください。

2.1. OVN-Kubernetes 設定ファイルの作成

OVN-Kubernetes 設定ファイルが作成されていない場合、MicroShift は組み込みのデフォルト OVN-Kubernetes 値を使用します。OVN-Kubernetes 設定ファイルを /etc/microshift/ovn.yaml に書き込むことができます。設定用のサンプルファイルが提供されています。

手順

  1. ovn.yaml ファイルを作成するには、次のコマンドを実行します。

    $ sudo cp /etc/microshift/ovn.yaml.default /etc/microshift/ovn.yaml
  2. 作成した設定ファイルの内容を一覧表示するには、次のコマンドを実行します。

    $ cat /etc/microshift/ovn.yaml.default

    デフォルトの最大伝送単位 (MTU) 値を含む YAML ファイルの例

    mtu: 1400

  3. 設定をカスタマイズするには、MTU 値を変更します。以下の表で詳細を記載します。

    表2.1 サポート対象の MicroShift の OVN-Kubernetes 設定 (任意)
    フィールドタイプデフォルト説明

    mtu

    uint32

    auto

    Pod に使用される MTU 値

    1300

    重要

    ovn.yaml ファイルの mtu 設定値を変更した場合に、更新された設定を適用するには、Red Hat build of MicroShift が実行しているホストを再起動する必要があります。

    カスタム ovn.yaml 設定ファイルの例

    mtu: 1300

2.2. ovnkube-master Pod の再起動

次の手順で ovnkube-master Pod を再起動します。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • インフラストラクチャーにインストールされたクラスターが OVN-Kubernetes ネットワークプラグインで設定されている。
  • KUBECONFIG 環境変数が設定されている。

手順

次の手順を使用して、ovnkube-master Pod を再起動します。

  1. 次のコマンドを実行して、リモートクラスターにアクセスします。

    $ export KUBECONFIG=$PWD/kubeconfig
  2. 次のコマンドを実行して、再起動する ovnkube-master Pod の名前を見つけます。

    $ pod=$(oc get pods -n openshift-ovn-kubernetes | awk -F " " '/ovnkube-master/{print $1}')
  3. 次のコマンドを実行して、ovnkube-master Pod を削除します。

    $ oc -n openshift-ovn-kubernetes delete pod $pod
  4. 次のコマンドを使用して、新しい ovnkube-master Pod が実行されていることを確認します。

    $ oc get pods -n openshift-ovn-kubernetes

    実行中の Pod のリストには、新しい ovnkube-master Pod の名前と経過時間が表示されます。

2.3. HTTP(S) プロキシーの背後への MicroShift のデプロイ

基本的な匿名性とセキュリティー対策を Pod に追加する場合は、HTTP(S) プロキシーの背後に MicroShift クラスターをデプロイします。

プロキシーの背後に MicroShift をデプロイする場合は、HTTP(S) 要求を開始するすべてのコンポーネントでプロキシーサービスを使用するように、ホストオペレーティングシステムを設定する必要があります。

クラウドサービスへのアクセスなど、Egress トラフィックを伴うユーザー固有のワークロードまたは Pod はすべて、プロキシーを使用するように設定する必要があります。MicroShift には、Egress トラフィックをプロキシーする、埋め込みの透過的機能はありません。

2.4. RPM-OStree HTTP(S) プロキシーの使用

RPM-OStree で HTTP(S) プロキシーを使用するには、設定ファイルに Service セクションを追加し、rpm-ostree サービスの http_proxy 環境変数を設定する必要があります。

手順

  1. 次の設定を /etc/systemd/system/rpm-ostreed.service.d/00-proxy.conf ファイルに追加します。

    [Service]
    Environment="http_proxy=http://$PROXY_USER:$PROXY_PASSWORD@$PROXY_SERVER:$PROXY_PORT/"
  2. 次に、設定をリロードして、サービスを再起動して変更を適用します。

    1. 次のコマンドを実行して、設定をリロードします。

      $ sudo systemctl daemon-reload
    2. 次のコマンドを実行して、rpm-ostreed サービスを再起動します。

      $ sudo systemctl restart rpm-ostreed.service

2.5. CRI-O コンテナーランタイムでのプロキシーの使用

CRI-O で HTTP(S) プロキシーを使用するには、設定ファイルに Service セクションを追加し、HTTP_PROXY および HTTPS_PROXY 環境変数を設定する必要があります。NO_PROXY 変数を設定して、ホストのリストをプロキシーから除外することもできます。

手順

  1. 設定ファイル用のディレクトリーが存在しない場合は、作成します。

    $ sudo mkdir /etc/systemd/system/crio.service.d/
  2. 次の設定を /etc/systemd/system/crio.service.d/00-proxy.conf ファイルに追加します。

    [Service]
    Environment=NO_PROXY="localhost,127.0.0.1"
    Environment=HTTP_PROXY="http://$PROXY_USER:$PROXY_PASSWORD@$PROXY_SERVER:$PROXY_PORT/"
    Environment=HTTPS_PROXY="http://$PROXY_USER:$PROXY_PASSWORD@$PROXY_SERVER:$PROXY_PORT/"
    重要

    環境変数の設定ファイルの Service セクションを定義する必要があります。定義しないと、プロキシー設定が適用されません。

  3. 設定を再読み込みします。

    $ sudo systemctl daemon-reload
  4. CRI-O サービスを再起動します。

    $ sudo systemctl restart crio
  5. MicroShift サービスを再起動して設定を適用します。

    $ sudo systemctl restart microshift

検証

  1. 次のコマンドを実行し、出力を調べて、Pod が起動していることを確認します。

    $ oc get all -A
  2. 次のコマンドを実行し、出力を調べて、MicroShift がコンテナーイメージをプルできることを確認します。

    $ sudo crictl images

2.6. 実行中のクラスターからの OVS インターフェイスのスナップショット取得

スナップショットは、特定の時点における OVS インターフェイスの状態とデータを表します。

手順

  • 実行中の MicroShift クラスターから OVS インターフェイスのスナップショットを表示するには、次のコマンドを使用します。

    $ sudo ovs-vsctl show

    実行中のクラスターでの OVS インターフェイスの例

    9d9f5ea2-9d9d-4e34-bbd2-dbac154fdc93
        Bridge br-ex
            Port br-ex
                Interface br-ex
                    type: internal
            Port patch-br-ex_localhost.localdomain-to-br-int 1
                Interface patch-br-ex_localhost.localdomain-to-br-int
                    type: patch
                    options: {peer=patch-br-int-to-br-ex_localhost.localdomain} 2
        Bridge br-int
            fail_mode: secure
            datapath_type: system
            Port patch-br-int-to-br-ex_localhost.localdomain
                Interface patch-br-int-to-br-ex_localhost.localdomain
                    type: patch
                    options: {peer=patch-br-ex_localhost.localdomain-to-br-int}
            Port eebee1ce5568761
                Interface eebee1ce5568761 3
            Port b47b1995ada84f4
                Interface b47b1995ada84f4 4
            Port "3031f43d67c167f"
                Interface "3031f43d67c167f" 5
            Port br-int
                Interface br-int
                    type: internal
            Port ovn-k8s-mp0 6
                Interface ovn-k8s-mp0
                    type: internal
        ovs_version: "2.17.3"

    1
    patch-br-ex_localhost.localdomain-to-br-intpatch-br-int-to-br-ex_localhost.localdomain は、br-exbr-int を接続する OVS パッチポートです。
    2
    patch-br-ex_localhost.localdomain-to-br-intpatch-br-int-to-br-ex_localhost.localdomain は、br-exbr-int を接続する OVS パッチポートです。
    3
    Pod インターフェイス eebee1ce5568761 は、Pod Sandbox ID の最初の 15 ビットを使用して名前が付けられ、br-int ブリッジにプラグインされます。
    4
    Pod インターフェイス b47b1995ada84f4 は、Pod Sandbox ID の最初の 15 ビットを使用して名前が付けられ、br-int ブリッジにプラグインされます。
    5
    Pod インターフェイス 3031f43d67c167f は、Pod Sandbox ID の最初の 15 ビットを使用して名前が付けられ、br-int ブリッジにプラグインされます。
    6
    ヘアピントラフィック用の OVS 内部ポート ovn-k8s-mp0 は、ovnkube-master コンテナーによって作成されます。

2.7. ワークロードのロードバランサーのデプロイ

MicroShift には、ネットワークロードバランサーの実装が組み込まれています。次の手順例では、ノード IP アドレスを LoadBalancer サービス設定ファイルの外部 IP アドレスとして使用します。この例は、ワークロードにロードバランサーをデプロイする方法のガイダンスとして使用できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • クラスター管理者のロールを持つユーザーとしてクラスターにアクセスできる。
  • OVN-Kubernetes ネットワークプラグインで設定されたインフラストラクチャーにクラスターがインストールされている。
  • KUBECONFIG 環境変数が設定されている。

手順

  1. 次のコマンドを実行して、Pod が実行していることを確認します。

    $ oc get pods -A
  2. 次のコマンドを実行して、サンプルの namespace を作成します。

    $ NAMESPACE=nginx-lb-test
    $ oc create ns $NAMESPACE
  3. 次の例では、テスト nginx アプリケーションの 3 つのレプリカを namespace にデプロイします。

    $ oc apply -n $NAMESPACE -f - <<EOF
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nginx
    data:
      headers.conf: |
        add_header X-Server-IP  \$server_addr always;
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: quay.io/packit/nginx-unprivileged
            imagePullPolicy: Always
            name: nginx
            ports:
            - containerPort: 8080
            volumeMounts:
            - name: nginx-configs
              subPath: headers.conf
              mountPath: /etc/nginx/conf.d/headers.conf
            securityContext:
              allowPrivilegeEscalation: false
              seccompProfile:
                type: RuntimeDefault
              capabilities:
                drop: ["ALL"]
              runAsNonRoot: true
          volumes:
            - name: nginx-configs
              configMap:
                name: nginx
                items:
                  - key: headers.conf
                    path: headers.conf
    EOF
  4. 次のコマンドを実行すると、3 つのサンプルレプリカが正常に開始したことを確認できます。

    $ oc get pods -n $NAMESPACE
  5. 次のサンプルコマンドを使用して、nginx テストアプリケーションの LoadBalancer サービスを作成します。

    $ oc create -n $NAMESPACE -f - <<EOF
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
    spec:
      ports:
      - port: 81
        targetPort: 8080
      selector:
        app: nginx
      type: LoadBalancer
    EOF
    注記

    port パラメーターが、他の LoadBalancer サービスまたは Red Hat build of MicroShift コンポーネントによって占有されていないホストポートであることを確認する必要があります。

  6. サービスファイルが存在し、外部 IP アドレスが適切に割り当てられていること、および外部 IP がノード IP と同一であることを確認するには、次のコマンドを実行します。

    $ oc get svc -n $NAMESPACE

    出力例

    NAME    TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
    nginx   LoadBalancer   10.43.183.104   192.168.1.241   81:32434/TCP   2m

検証

  • 次のコマンドは、LoadBalancer サービス設定の外部 IP アドレスを使用して、例の nginx アプリケーションへの 5 つの接続を形成します。コマンドの結果は、それらのサーバー IP アドレスのリストです。次のコマンドを使用して、ロードバランサーが実行中のすべてのアプリケーションにリクエストを送信していることを確認します。

    EXTERNAL_IP=192.168.1.241
    seq 5 | xargs -Iz curl -s -I http://$EXTERNAL_IP:81 | grep X-Server-IP

    ロードバランサーがトラフィックをアプリケーションに正常に分散している場合、前のコマンドの出力には異なる IP アドレスが含まれます。次に例を示します。

    出力例

    X-Server-IP: 10.42.0.41
    X-Server-IP: 10.42.0.41
    X-Server-IP: 10.42.0.43
    X-Server-IP: 10.42.0.41
    X-Server-IP: 10.42.0.43

2.8. 特定のホストインターフェイス上の NodePort サービスへの外部アクセスをブロック

OVN-Kubernetes は、Red Hat build of MicroShift ノードの外部から NodePort サービスにアクセスできるホストインターフェイスを制限しません。次の手順では、特定のホストインターフェイスで NodePort サービスをブロックし、外部アクセスを制限する方法を説明します。

前提条件

  • root 権限を持つアカウント。

手順

  1. 次のコマンドを実行して、NODEPORT 変数を Kubernetes NodePort サービスに割り当てられたホストポート番号に変更します。

    # export NODEPORT=30700
  2. INTERFACE_IP 値を、ブロックするホストインターフェイスの IP アドレスに変更します。以下に例を示します。

    # export INTERFACE_IP=192.168.150.33
  3. nat テーブル PREROUTING チェーンに新しいルールを挿入して、宛先ポートと IP アドレスに一致するすべてのパケットをドロップします。以下に例を示します。

    $ sudo nft -a insert rule ip nat PREROUTING tcp dport $NODEPORT ip daddr $INTERFACE_IP drop
  4. 次のコマンドを実行して、新しいルールをリスト表示します。

    $ sudo nft -a list chain ip nat PREROUTING
    table ip nat {
    	chain PREROUTING { # handle 1
    		type nat hook prerouting priority dstnat; policy accept;
    		tcp dport 30700 ip daddr 192.168.150.33 drop # handle 134
    		counter packets 108 bytes 18074 jump OVN-KUBE-ETP # handle 116
    		counter packets 108 bytes 18074 jump OVN-KUBE-EXTERNALIP # handle 114
    		counter packets 108 bytes 18074 jump OVN-KUBE-NODEPORT # handle 112
    	}
    }
    注記

    新しく追加したルールの handle 番号をメモします。次の手順で handle 番号を削除する必要があります

  5. 次のサンプルコマンドを使用してカスタムルールを削除します。

    $ sudo nft -a delete rule ip nat PREROUTING handle 134

2.9. マルチキャスト DNS プロトコル

マルチキャスト DNS プロトコル (mDNS) を使用することで、5353/UDP ポートで公開されているマルチキャストを使用した、ローカルエリアネットワーク (LAN) 内で名前解決とサービス検出が可能になります。

MicroShift には、権威 DNS サーバーを MicroShift のサービスに対してクライアントを参照するように再設定できないデプロイメントシナリオ向けに、埋め込みの mDNS サーバーが含まれています。埋め込みの DNS サーバーにより、MicroShift によって公開された .local ドメインが LAN 上の他の要素によって検出されるようになります。

2.10. 関連情報

第3章 ネットワークポリシー

3.1. ネットワークポリシーについて

MicroShift でネットワークポリシーがどのように機能し、クラスター内の Pod へのネットワークトラフィックを制限または許可するかを説明します。

3.1.1. MicroShift でのネットワークポリシーの仕組み

MicroShift のデフォルトの OVN-Kubernetes Container Network Interface (CNI) プラグインを使用するクラスターでは、ネットワーク分離は、ホスト上で設定されている firewalld と MicroShift 内で作成された NetworkPolicy オブジェクトの両方によって制御されます。firewalld と NetworkPolicy の同時使用がサポートされています。

  • ネットワークポリシーは、OVN-Kubernetes によって制御されるトラフィックの境界内でのみ機能するため、hostPort/hostNetwork が有効な Pod を除くあらゆる状況に適用できます。
  • また、firewalld 設定は、hostPort/hostNetwork が有効な Pod には適用されません。
注記

firewalld ルールは、NetworkPolicy が適用される前に実行されます。

警告

ネットワークポリシーは、ホストのネットワーク namespace には適用されません。ホストネットワークが有効にされている Pod はネットワークポリシールールによる影響を受けません。ただし、ホストネットワークの Pod に接続する Pod はネットワークポリシールールの影響を受ける可能性があります。

ネットワークポリシーではローカルホストからのトラフィックをブロックできません。

デフォルトでは、MicroShift ノード内のすべての Pod は、他の Pod およびネットワークエンドポイントからアクセスできます。クラスターで 1 つ以上の Pod を分離するには、許可される受信接続を示す NetworkPolicy オブジェクトを作成してください。NetworkPolicy オブジェクトを作成および削除できます。

Pod が 1 つ以上の NetworkPolicy オブジェクトのセレクターと一致する場合、Pod はそれらの NetworkPolicy オブジェクトの少なくとも 1 つにより許可された接続だけを使用できます。NetworkPolicy オブジェクトによって選択されていない Pod は完全にアクセス可能です。

ネットワークポリシーは、TCP、UDP、ICMP、および SCTP プロトコルにのみ適用されます。他のプロトコルは影響を受けません。

以下のサンプル NetworkPolicy オブジェクトは、複数の異なるシナリオをサポートすることを示しています。

  • すべてのトラフィックを拒否します。

    プロジェクトに deny by default (デフォルトで拒否) を実行させるには、すべての Pod に一致するが、トラフィックを一切許可しない NetworkPolicy オブジェクトを追加します。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: deny-by-default
    spec:
      podSelector: {}
      ingress: []
  • MicroShift の Ingress であるデフォルトルーターからの接続を許可します。

    MicroShift デフォルトルーターからの接続を許可するには、次の NetworkPolicy オブジェクトを追加します。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-from-openshift-ingress
    spec:
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
      podSelector: {}
      policyTypes:
      - Ingress
  • 同じ namespace 内の Pod からの接続のみを受け入れます。

    Pod が同じ namespace 内の他の Pod からの接続を受け入れるが、他の namespace 内の Pod からの接続はすべて拒否するようにするには、次の NetworkPolicy オブジェクトを追加します。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: allow-same-namespace
    spec:
      podSelector: {}
      ingress:
      - from:
        - podSelector: {}
  • Pod ラベルに基づいて HTTP および HTTPS トラフィックのみを許可します。

    特定のラベル (以下の例の role=frontend) の付いた Pod への HTTP および HTTPS アクセスのみを有効にするには、以下と同様の NetworkPolicy オブジェクトを追加します。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: allow-http-and-https
    spec:
      podSelector:
        matchLabels:
          role: frontend
      ingress:
      - ports:
        - protocol: TCP
          port: 80
        - protocol: TCP
          port: 443
  • namespace および Pod セレクターの両方を使用して接続を受け入れます。

    namespace と Pod セレクターを組み合わせてネットワークトラフィックのマッチングをするには、以下と同様の NetworkPolicy オブジェクトを使用できます。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: allow-pod-and-namespace-both
    spec:
      podSelector:
        matchLabels:
          name: test-pods
      ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                project: project_name
            podSelector:
              matchLabels:
                name: test-pods

NetworkPolicy オブジェクトは加算されるものです。つまり、複数の NetworkPolicy オブジェクトを組み合わせて複雑なネットワーク要件を満すことができます。

たとえば、先の例で定義された NetworkPolicy オブジェクトの場合、allow-same-namespace および allow-http-and-https ポリシーの両方を定義できます。この設定により、role=frontend ラベルの付いた Pod は各ポリシーで許可されている接続をすべて受け入れることができます。つまり、同じ namespace の Pod からのすべてのポート、およびすべての namespace の Pod からのポート 80 および 443 での接続を受け入れます。

3.1.2. OVN-Kubernetes ネットワークプラグインによるネットワークポリシーの最適化

ネットワークポリシーを設計する場合は、以下のガイドラインを参照してください。

  • 同じ spec.podSelector 仕様を持つネットワークポリシーの場合、ingress ルールまたは egress ルールを持つ複数のネットワークポリシーを使用するよりも、複数の Ingress ルールまたは egress ルールを持つ 1 つのネットワークポリシーを使用する方が効率的です。
  • podSelector または namespaceSelector 仕様に基づくすべての Ingress または egress ルールは、number of pods selected by network policy + number of pods selected by ingress or egress rule に比例する数の OVS フローを生成します。そのため、Pod ごとに個別のルールを作成するのではなく、1 つのルールで必要な数の Pod を選択できる podSelector または namespaceSelector 仕様を使用することが推奨されます。

    たとえば、以下のポリシーには 2 つのルールが含まれています。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
    spec:
      podSelector: {}
      ingress:
      - from:
        - podSelector:
            matchLabels:
              role: frontend
      - from:
        - podSelector:
            matchLabels:
              role: backend

    以下のポリシーは、上記と同じ 2 つのルールを 1 つのルールとして表現しています。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
    spec:
      podSelector: {}
      ingress:
      - from:
        - podSelector:
            matchExpressions:
            - {key: role, operator: In, values: [frontend, backend]}

    同じガイドラインが spec.podSelector 仕様に適用されます。異なるネットワークポリシーに同じ ingress ルールまたは egress ルールがある場合、共通の spec.podSelector 仕様で 1 つのネットワークポリシーを作成する方が効率的な場合があります。たとえば、以下の 2 つのポリシーには異なるルールがあります。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: policy1
    spec:
      podSelector:
        matchLabels:
          role: db
      ingress:
      - from:
        - podSelector:
            matchLabels:
              role: frontend
    ---
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: policy2
    spec:
      podSelector:
        matchLabels:
          role: client
      ingress:
      - from:
        - podSelector:
            matchLabels:
              role: frontend

    以下のネットワークポリシーは、上記と同じ 2 つのルールを1 つのルールとして表現しています。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: policy3
    spec:
      podSelector:
        matchExpressions:
        - {key: role, operator: In, values: [db, client]}
      ingress:
      - from:
        - podSelector:
            matchLabels:
              role: frontend

    この最適化は、複数のセレクターを 1 つのセレクターとして表現する場合に限り適用できます。セレクターが異なるラベルに基づいている場合、この最適化は適用できない可能性があります。その場合は、ネットワークポリシーの最適化に特化して新規ラベルをいくつか適用することを検討してください。

3.2. ネットワークポリシーの作成

namespace のネットワークポリシーを作成できます。

3.2.1. サンプル NetworkPolicy オブジェクト

以下は、サンプル NetworkPolicy オブジェクトにアノテーションを付けます。

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-27107 1
spec:
  podSelector: 2
    matchLabels:
      app: mongodb
  ingress:
  - from:
    - podSelector: 3
        matchLabels:
          app: app
    ports: 4
    - protocol: TCP
      port: 27017
1
NetworkPolicy オブジェクトの名前。
2
ポリシーが適用される Pod を説明するセレクター。
3
ポリシーオブジェクトが入力トラフィックを許可する Pod に一致するセレクター。セレクターは、NetworkPolicy と同じ namaspace にある Pod を照合して検索します。
4
トラフィックを受け入れる 1 つ以上の宛先ポートのリスト。

3.2.2. CLI を使用したネットワークポリシーの作成

クラスターの namespace に許可される Ingress または egress ネットワークトラフィックを記述する詳細なルールを定義するには、ネットワークポリシーを作成できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • ネットワークポリシーが適用される namespace で作業している。

手順

  1. ポリシールールを作成します。

    1. <policy_name>.yaml ファイルを作成します。

      $ touch <policy_name>.yaml

      ここでは、以下のようになります。

      <policy_name>
      ネットワークポリシーファイル名を指定します。
    2. 作成したばかりのファイルで、以下の例のようなネットワークポリシーを定義します。

      すべての namespace のすべての Pod から ingress を拒否します。

      これは基本的なポリシーであり、他のネットワークポリシーの設定によって許可されたクロス Pod トラフィック以外のすべてのクロス Pod ネットワーキングをブロックします。

      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: deny-by-default
      spec:
        podSelector: {}
        policyTypes:
        - Ingress
        ingress: []

      同じ namespace のすべての Pod から ingress を許可します。

      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: allow-same-namespace
      spec:
        podSelector:
        ingress:
        - from:
          - podSelector: {}

      特定のnamespaceから 1 つの Pod への上りトラフィックを許可する

      このポリシーは、namespace-y で実行されている Pod から pod-a というラベルの付いた Pod へのトラフィックを許可します。

      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: allow-traffic-pod
      spec:
        podSelector:
         matchLabels:
            pod: pod-a
        policyTypes:
        - Ingress
        ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                 kubernetes.io/metadata.name: namespace-y
  2. ネットワークポリシーオブジェクトを作成するには、以下のコマンドを入力します。

    $ oc apply -f <policy_name>.yaml -n <namespace>

    ここでは、以下のようになります。

    <policy_name>
    ネットワークポリシーファイル名を指定します。
    <namespace>
    オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。

    出力例

    networkpolicy.networking.k8s.io/deny-by-default created

3.2.3. デフォルトの全拒否ネットワークポリシーの作成

これは基本的なポリシーであり、他のデプロイメントされたネットワークポリシーの設定によって許可されたネットワークトラフィック以外のすべてのクロス Pod ネットワークをブロックします。この手順では、デフォルトの deny-by-default ポリシーを適用します。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • ネットワークポリシーが適用される namespace で作業している。

手順

  1. すべての namespace におけるすべての Pod からの ingress を拒否する deny-by-default ポリシーを定義する次の YAML を作成します。YAML を deny-by-default.yaml ファイルに保存します。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: deny-by-default
      namespace: default 1
    spec:
      podSelector: {} 2
      ingress: [] 3
    1
    namespace: default は、このポリシーを default namespace にデプロイします。
    2
    podSelector: は空です。これは、すべての Pod に一致することを意味します。したがって、ポリシーはデフォルトnamespaceのすべての Pod に適用されます。
    3
    指定された ingress ルールはありません。これにより、着信トラフィックがすべての Pod にドロップされます。
  2. 次のコマンドを入力して、ポリシーを適用します。

    $ oc apply -f deny-by-default.yaml

    出力例

    networkpolicy.networking.k8s.io/deny-by-default created

3.2.4. 外部クライアントからのトラフィックを許可するネットワークポリシーの作成

deny-by-default ポリシーを設定すると、外部クライアントからラベル app=web を持つ Pod へのトラフィックを許可するポリシーの設定に進むことができます。

注記

firewalld ルールは、NetworkPolicy が適用される前に実行されます。

この手順に従って、パブリックインターネットから直接、またはロードバランサーを使用して Pod にアクセスすることにより、外部サービスを許可するポリシーを設定します。トラフィックは、ラベル app=web を持つ Pod にのみ許可されます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • ネットワークポリシーが適用される namespace で作業している。

手順

  1. パブリックインターネットからのトラフィックが直接、またはロードバランサーを使用して Pod にアクセスできるようにするポリシーを作成します。YAML を web-allow-external.yaml ファイルに保存します。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: web-allow-external
      namespace: default
    spec:
      policyTypes:
      - Ingress
      podSelector:
        matchLabels:
          app: web
      ingress:
        - {}
  2. 次のコマンドを入力して、ポリシーを適用します。

    $ oc apply -f web-allow-external.yaml

    出力例

    networkpolicy.networking.k8s.io/web-allow-external created

3.2.5. すべてのnamespaceからアプリケーションへのトラフィックを許可するネットワークポリシーを作成する

この手順に従って、すべてのnamespace内のすべての Pod から特定のアプリケーションへのトラフィックを許可するポリシーを設定します。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • ネットワークポリシーが適用される namespace で作業している。

手順

  1. すべてのnamespaceのすべての Pod から特定のアプリケーションへのトラフィックを許可するポリシーを作成します。YAML を web-allow-all-namespaces.yaml ファイルに保存します。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: web-allow-all-namespaces
      namespace: default
    spec:
      podSelector:
        matchLabels:
          app: web 1
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector: {} 2
    1
    デフォルトの namespace の app:web Pod にのみポリシーを適用します。
    2
    すべてのnamespaceのすべての Pod を選択します。
    注記

    デフォルトでは、namespaceSelector の指定を省略した場合、namespace は選択されません。つまり、ポリシーは、ネットワークポリシーがデプロイされている namespace からのトラフィックのみを許可します。

  2. 次のコマンドを入力して、ポリシーを適用します。

    $ oc apply -f web-allow-all-namespaces.yaml

    出力例

    networkpolicy.networking.k8s.io/web-allow-all-namespaces created

検証

  1. 次のコマンドを入力して、default namespace で Web サービスを開始します。

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
  2. 次のコマンドを実行して、alpine イメージを secondary namespace にデプロイし、シェルを開始します。

    $ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
  3. シェルで次のコマンドを実行し、リクエストが許可されていることを確認します。

    # wget -qO- --timeout=2 http://web.default

    予想される出力

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

3.2.6. namespaceからアプリケーションへのトラフィックを許可するネットワークポリシーの作成

特定の namespace からラベル app=web を持つ Pod へのトラフィックを許可するポリシーを設定するには、次の手順に従います。以下の場合にこれを行うことができます。

  • 運用データベースへのトラフィックを、運用ワークロードがデプロイされているnamespaceのみに制限します。
  • 特定のnamespaceにデプロイされた監視ツールを有効にして、現在のnamespaceからメトリックをスクレイピングします。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • ネットワークポリシーが適用される namespace で作業している。

手順

  1. ラベルが purpose=production の特定の namespace 内にあるすべての Pod からのトラフィックを許可するポリシーを作成します。YAML を web-allow-prod.yaml ファイルに保存します。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: web-allow-prod
      namespace: default
    spec:
      podSelector:
        matchLabels:
          app: web 1
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              purpose: production 2
    1
    デフォルトの namespace の app:web Pod にのみポリシーを適用します。
    2
    ラベルが purpose=production の namespace 内にある Pod のみにトラフィックを制限します。
  2. 次のコマンドを入力して、ポリシーを適用します。

    $ oc apply -f web-allow-prod.yaml

    出力例

    networkpolicy.networking.k8s.io/web-allow-prod created

検証

  1. 次のコマンドを入力して、default namespace で Web サービスを開始します。

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
  2. 次のコマンドを実行して、prod namespace を作成します。

    $ oc create namespace prod
  3. 次のコマンドを実行して、prod namespace にラベルを付けます。

    $ oc label namespace/prod purpose=production
  4. 次のコマンドを実行して、dev namespace を作成します。

    $ oc create namespace dev
  5. 次のコマンドを実行して、dev namespace にラベルを付けます。

    $ oc label namespace/dev purpose=testing
  6. 次のコマンドを実行して、alpine イメージを dev namespace にデプロイし、シェルを開始します。

    $ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
  7. シェルで次のコマンドを実行し、リクエストがブロックされていることを確認します。

    # wget -qO- --timeout=2 http://web.default

    予想される出力

    wget: download timed out

  8. 次のコマンドを実行して、alpine イメージを prod namespace にデプロイし、シェルを開始します。

    $ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
  9. シェルで次のコマンドを実行し、リクエストが許可されていることを確認します。

    # wget -qO- --timeout=2 http://web.default

    予想される出力

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

3.3. ネットワークポリシーの編集

namespace の既存のネットワークポリシーを編集できます。通常の編集には、ポリシーが適用される Pod、許可される Ingress トラフィック、トラフィックを受け入れる宛先ポートへの変更が含まれる場合があります。apiVersionkind、および name フィールドは、リソース自体を定義するためのもので、NetworkPolicy オブジェクトを編集するときは、これらを変更しないでください。

3.3.1. ネットワークポリシーの編集

namespace のネットワークポリシーを編集できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • ネットワークポリシーが存在する namespace で作業している。

手順

  1. オプション: namespace のネットワークポリシーオブジェクトをリスト表示するには、以下のコマンドを入力します。

    $ oc get networkpolicy

    ここでは、以下のようになります。

    <namespace>
    オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
  2. ネットワークポリシーオブジェクトを編集します。

    • ネットワークポリシーの定義をファイルに保存した場合は、ファイルを編集して必要な変更を加えてから、以下のコマンドを入力します。

      $ oc apply -n <namespace> -f <policy_file>.yaml

      ここでは、以下のようになります。

      <namespace>
      オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
      <policy_file>
      ネットワークポリシーを含むファイルの名前を指定します。
    • ネットワークポリシーオブジェクトを直接更新する必要がある場合、以下のコマンドを入力できます。

      $ oc edit networkpolicy <policy_name> -n <namespace>

      ここでは、以下のようになります。

      <policy_name>
      ネットワークポリシーの名前を指定します。
      <namespace>
      オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
  3. ネットワークポリシーオブジェクトが更新されていることを確認します。

    $ oc describe networkpolicy <policy_name> -n <namespace>

    ここでは、以下のようになります。

    <policy_name>
    ネットワークポリシーの名前を指定します。
    <namespace>
    オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。

3.3.2. サンプル NetworkPolicy オブジェクト

以下は、サンプル NetworkPolicy オブジェクトにアノテーションを付けます。

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-27107 1
spec:
  podSelector: 2
    matchLabels:
      app: mongodb
  ingress:
  - from:
    - podSelector: 3
        matchLabels:
          app: app
    ports: 4
    - protocol: TCP
      port: 27017
1
NetworkPolicy オブジェクトの名前。
2
ポリシーが適用される Pod を説明するセレクター。
3
ポリシーオブジェクトが入力トラフィックを許可する Pod に一致するセレクター。セレクターは、NetworkPolicy と同じ namaspace にある Pod を照合して検索します。
4
トラフィックを受け入れる 1 つ以上の宛先ポートのリスト。

3.4. ネットワークポリシーの削除

namespace からネットワークポリシーを削除できます。

3.4.1. CLI を使用したネットワークポリシーの削除

namespace のネットワークポリシーを削除できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • ネットワークポリシーが存在する namespace で作業している。

手順

  • ネットワークポリシーオブジェクトを削除するには、以下のコマンドを入力します。

    $ oc delete networkpolicy <policy_name> -n <namespace>

    ここでは、以下のようになります。

    <policy_name>
    ネットワークポリシーの名前を指定します。
    <namespace>
    オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。

    出力例

    networkpolicy.networking.k8s.io/default-deny deleted

3.5. ネットワークポリシーの表示

namespace のネットワークポリシーを表示するには、次の手順を使用します。

3.5.1. CLI を使用したネットワークポリシーの表示

namespace のネットワークポリシーを検査できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • ネットワークポリシーが存在する namespace で作業している。

手順

  • namespace のネットワークポリシーを一覧表示します。

    • namespace で定義されたネットワークポリシーオブジェクトを表示するには、以下のコマンドを実行します。

      $ oc get networkpolicy
    • オプション: 特定のネットワークポリシーを検査するには、以下のコマンドを入力します。

      $ oc describe networkpolicy <policy_name> -n <namespace>

      ここでは、以下のようになります。

      <policy_name>
      検査するネットワークポリシーの名前を指定します。
      <namespace>
      オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。

      以下に例を示します。

      $ oc describe networkpolicy allow-same-namespace

      oc describe コマンドの出力

      Name:         allow-same-namespace
      Namespace:    ns1
      Created on:   2021-05-24 22:28:56 -0400 EDT
      Labels:       <none>
      Annotations:  <none>
      Spec:
        PodSelector:     <none> (Allowing the specific traffic to all pods in this namespace)
        Allowing ingress traffic:
          To Port: <any> (traffic allowed to all ports)
          From:
            PodSelector: <none>
        Not affecting egress traffic
        Policy Types: Ingress

第4章 ファイアウォールの使用

MicroShift ではファイアウォールは必要ありませんが、ファイアウォールを使用すると、MicroShift API への望ましくないアクセスを防ぐことができます。

4.1. ファイアウォールを通過するネットワークトラフィックについて

Firewalld は、バックグラウンドで実行され、接続要求に応答して、動的にカスタマイズ可能なホストベースのファイアウォールを作成するネットワークサービスです。Red Hat Enterprise Linux for Edge (RHEL for Edge) を MicroShift とともに使用している場合は、通常、firewalld がすでにインストールされているため、firewalld を設定するだけで済みます。詳細は、次の手順で説明します。全体として、firewalld サービスの実行中に次の OVN-Kubernetes トラフィックを明示的に許可する必要があります。

CNI Pod から CNI Pod へ
CNI Pod からホストネットワーク Pod/ホストネットワーク Pod からホストネットワーク Pod
CNI Pod
CNI ネットワークを使用する Kubernetes Pod
ホストネットワーク Pod
ホストネットワークを使用する Kubernetes Pod 次の手順を使用して、firewalld サービスを設定できます。ほとんどの場合、firewalld は RHEL for Edge インストールに含まれています。firewalld がインストールされなていない場合は、このセクションにある簡単な手順でインストールできます。
重要

MicroShift Pod は、内部 CoreDNS コンポーネントおよび API サーバーにアクセスできる必要があります。

4.2. firewalld サービスのインストール

RHEL for Edge を使用している場合は、firewalld をインストールする必要があります。サービスを使用するには、設定を行うだけです。firewalld がない場合で、firewalld を使用したい場合は、次の手順を使用できます。

次の手順を使用して、MicroShift の firewalld サービスをインストールして実行します。

手順

  1. オプション: 以下のコマンドを実行して、システムで firewalld があるかを確認します。

    $ rpm -q firewalld
  2. firewalld サービスがインストールされていない場合は、次のコマンドを実行します。

    $ sudo dnf install -y firewalld
  3. ファイアウォールを開始するには、次のコマンドを実行します。

    $ sudo systemctl enable firewalld --now

4.3. 必要なファイアウォール設定

クラスターネットワークの IP アドレス範囲は、ファイアウォールの設定時に有効にする必要があります。デフォルト値を使用するか、IP アドレス範囲をカスタマイズできます。デフォルトの 10.42.0.0/16 設定からクラスターネットワークの IP アドレス範囲をカスタマイズする場合は、ファイアウォール設定でも同じカスタム範囲を使用する必要があります。

表4.1 ファイアウォールの IP アドレス設定
IP 範囲ファイアウォールルールが必要説明

10.42.0.0/16

いいえ

他の Pod へのホストネットワーク Pod アクセス

169.254.169.1

はい

Red Hat build of MicroShift API サーバーへのホストネットワーク Pod アクセス

ファイアウォール構成に必須の設定コマンドの例を次に示します。

コマンドの例

  • 他の Pod へのホストネットワーク Pod アクセスを設定します。

    $ sudo firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16
  • Red Hat build of MicroShift API などのホストエンドポイントによってバックアップされたサービスへのホストネットワーク Pod アクセスを設定します。

    $ sudo firewall-cmd --permanent --zone=trusted --add-source=169.254.169.1

4.4. オプションのポート設定の使用

MicroShift ファイアウォールサービスでは、オプションのポート設定が可能です。

手順

  • カスタマイズされたポートをファイアウォール設定に追加するには、次のコマンド構文を使用します。

    $ sudo firewall-cmd --permanent --zone=public --add-port=<port number>/<port protocol>
    表4.2 オプションのポート
    ポートプロトコル説明

    80

    TCP

    OpenShift Container Platform ルーターを介してアプリケーションを提供するために使用される HTTP ポート。

    443

    TCP

    OpenShift Container Platform ルーターを介してアプリケーションを提供するために使用される HTTPS ポート。

    5353

    UDP

    OpenShift Container Platform ルート mDNS ホストに応答する mDNS サービス。

    30000-32767

    TCP

    NodePort サービス用に予約されたポート範囲。LAN 上のアプリケーションを公開するために使用できます。

    30000-32767

    UDP

    NodePort サービス用に予約されたポート範囲。LAN 上のアプリケーションを公開するために使用できます。

    6443

    TCP

    Red Hat build of MicroShift API の HTTPS API ポート。

以下は、API サーバーのポート 6443 など、MicroShift で実行されているサービスへのファイアウォールを介した外部アクセスを必要とする場合に使用されるコマンドの例です。たとえば、ルーターを介して公開されるアプリケーションのポート 80 および 443 です。

コマンドの例

  • MicroShift API サーバーのポートを設定します。

    $ sudo firewall-cmd --permanent --zone=public --add-port=6443/tcp

MicroShift インスタンスの不要なポートを閉じるには、「ネットワークセキュリティーを強化するために不使用または不要なポートの閉鎖」の手順に従ってください。

4.5. ポートを開くためのサービスの追加

MicroShift インスタンスでは、firewall-cmd コマンドを使用してポートでサービスを開くことができます。

手順

  1. オプション: 次のコマンドを実行すると、firewalld 内のすべての事前定義サービスを表示できます。

    $ sudo firewall-cmd --get-services
  2. デフォルトのポートで必要なサービスを開くには、次のコマンド例を実行します。

    $ sudo firewall-cmd --add-service=mdns

4.6. ファイアウォールを介したネットワークトラフィックの許可

IP アドレス範囲を設定し、Pod からネットワークゲートウェイを通過する内部トラフィックを許可する DNS サーバーを挿入することで、ファイアウォールを通過するネットワークトラフィックを許可できます。

手順

  1. 次のコマンドのいずれかを使用して、IP アドレス範囲を設定します。

    1. 次のコマンドを実行して、IP アドレス範囲をデフォルト値で設定します。

      $ sudo firewall-offline-cmd --permanent --zone=trusted --add-source=10.42.0.0/16
    2. 次のコマンドを実行して、カスタム値を使用して IP アドレス範囲を設定します。

      $ sudo firewall-offline-cmd --permanent --zone=trusted --add-source=<custom IP range>
  2. Pod からの内部トラフィックがネットワークゲートウェイを通過できるようにするには、次のコマンドを実行します。

    $ sudo firewall-offline-cmd --permanent --zone=trusted --add-source=169.254.169.1

4.6.1. ファイアウォール設定の適用

ファイアウォール設定を適用するには、手順 1 だけからなる以下の手順を使用します。

手順

  • ファイアウォールを介したネットワークアクセスの設定が完了したら、次のコマンドを実行してファイアウォールを再起動し、設定を適用します。
$ sudo firewall-cmd --reload

4.7. ファイアウォール設定の確認

ファイアウォールを再起動したら、設定を一覧表示して確認できます。

手順

  • ポート関連のルールなど、デフォルトのパブリックゾーンに追加されたルールを確認するには、次のコマンドを実行します。

    $ sudo firewall-cmd --list-all
  • 信頼されたゾーンに追加されたルール (IP 範囲関連のルールなど) を確認するには、次のコマンドを実行します。

    $ sudo firewall-cmd --zone=trusted --list-all

4.8. サービスが公開されている場合のファイアウォールポートの概要

MicroShift でサービスを実行すると、firewalld がアクティブになることがよくあります。これにより、ポートへのトラフィックがファイアウォールによってブロックされる可能性があるため、MicroShift 上の特定のサービスが中断される可能性があります。ホストの外部から特定のサービスにアクセスできるようにする場合は、必要なファイアウォールポートが開いていることを確認する必要があります。ポートを開くには、いくつかの方法があります。

  • NodePort および LoadBalancer タイプのサービスは、OVN-Kubernetes によって自動的に利用可能になります。

    このような場合、OVN-Kubernetes が iptables ルールを追加して、ノード IP アドレスへのトラフィックが関連するポートに配信されるようにします。これは PREROUTING ルールチェーンを使用して実行されます。トラフィックはローカルホストポートとサービスの firewalld ルールをバイパスするために OVN-K に転送されます。iptables と firewalld は、RHEL 9 の nftables によってサポートされています。iptables が生成する nftables ルールは、firewalld が生成するルールよりも常に優先されます。

  • HostPort パラメーター設定を持つ Pod は自動的に使用可能になります。これには、ポート 80 と 443 を使用する router-default Pod も含まれます。

    HostPort Pod の場合、CRI-O 設定が iptables DNAT (宛先ネットワークアドレス変換) を Pod の IP アドレスとポートに設定します。

これらの方法は、クライアントが同じホスト上にあるかリモートホスト上にあるかに関係なく機能します。OVN-Kubernetes および CRI-O によって追加される iptables ルールは、PREROUTING チェーンと OUTPUT チェーンに割り当てられます。ローカルトラフィックは、インターフェイスが lo タイプに設定された OUTPUT チェーンを通過します。DNAT は、INPUT チェーンのフィラールールに到達する前に実行されます。

MicroShift API サーバーは CRI-O では実行されないため、ファイアウォール設定の影響を受けます。ファイアウォールでポート 6443 を開くと、MicroShift クラスター内の API サーバーにアクセスできます。

4.9. 関連情報

4.10. 既知のファイアウォールの問題

  • ファイアウォールのリロードまたは再起動によってトラフィックフローが中断されないようにするには、RHEL を起動する前にファイアウォールコマンドを実行します。MicroShift の CNI ドライバーは、NodePort サービスを使用するトラフィックフローなど、一部のトラフィックフローに対して iptable ルールを使用します。iptable ルールは CNI ドライバーによって生成および挿入されますが、ファイアウォールのリロードまたは再起動時に削除されます。iptable ルールがないと、トラフィックフローが中断されます。MicroShift の実行後にファイアウォールコマンドを実行する必要がある場合は、openshift-ovn-kubernetes namespace で ovnkube-master Pod を手動で再起動して、CNI ドライバーによって制御されるルールをリセットします。

第5章 完全に切断されたホストのネットワーク設定

ネットワークのカスタマイズと設定を適用して、完全に切断されたホストで MicroShift を実行する方法について説明します。切断されたホストは、物理か仮想かに関係なく、ネットワーク接続なしで実行される Red Hat Enterprise Linux (RHEL) オペレーティングシステムバージョン 9.0 以降である必要があります。

5.1. 完全に切断されたホスト用のネットワークの準備

完全に切断されたオペレーティングシステムを実行しているデバイス上で MicroShift クラスターを起動して実行するには、次の手順を使用します。MicroShift ホストは、外部ネットワーク接続がない場合、完全に切断されているとみなされます。

通常、これは、サブネットを提供するためのネットワークインターフェイスコントローラー (NIC) がデバイスにアタッチされていないことを意味します。これらの手順は、セットアップ後に NIC が取り外されたホストでも実行できます。キックスタートファイルの %post フェーズを使用して、NIC を持たないホスト上でこれらの手順を自動化することもできます。

重要

MicroShift ではクラスター通信をサポートするためにネットワークデバイスが必要であるため、切断された環境のネットワークを設定することが必要です。この要件を満たすには、セットアップ中にシステムループバックデバイスに割り当てた "偽" の IP アドレスを使用するように MicroShift ネットワークを設定する必要があります。

5.1.1. 手順の概要

切断されたホストで MicroShift を実行するには、次の手順が必要です。

ホストの準備
  • MicroShift が現在実行中の場合は停止し、サービスがネットワークに加えた変更をクリーンアップします。
  • 永続的なホスト名を設定します。
  • ループバックインターフェイスに ”偽” の IP アドレスを追加します。
  • 偽の IP をローカルネームサーバーとして使用するように DNS を設定します。
  • ホスト名のエントリーを /etc/hosts に追加します。
MicroShift 設定の更新
  • nodeIP パラメーターを新しいループバック IP アドレスとして定義します。
  • .node.hostnameOverride パラメーターを永続的なホスト名に設定します。
変更内容の有効化
  • デフォルトの NIC がアタッチされている場合は無効にします。
  • ホストまたはデバイスを再起動します。

MicroShift は起動後、クラスター内通信にループバックデバイスを使用して実行されます。

5.2. MicroShift ネットワーク設定をデフォルトに戻す

MicroShift を停止してクリーンアップスクリプトを実行すると、ネットワークのカスタマイズを削除し、ネットワークをデフォルト設定に戻すことができます。

前提条件

  • RHEL 9 以降。
  • MicroShift 4.14 以降。
  • ホスト CLI へのアクセスがある。

手順

  1. 次のコマンドを実行して、MicroShift サービスを停止します。

    $ sudo systemctl stop microshift
  2. 次のコマンドを実行して、kubepods.slice systemd ユニットを停止します。

    $ sudo systemctl stop kubepods.slice
  3. MicroShift は、OVN-K によって加えられたネットワークの変更を元に戻すためのヘルパースクリプトをインストールします。次のコマンドを入力して、クリーンアップスクリプトを実行します。

    $ sudo /usr/bin/microshift-cleanup-data --ovn

5.3. 完全に切断されたホストのネットワーク設定

完全に切断されたホスト上で MicroShift を実行するためのネットワークを設定するには、ホストを準備し、ネットワーク設定を更新してから、再起動して新しい設定を適用する必要があります。すべてのコマンドはホスト CLI から実行されます。

前提条件

  • RHEL 9 以降。
  • MicroShift 4.14 以降。
  • ホスト CLI へのアクセスがある。
  • MicroShift の実行時に、内部 IP の競合と今後使用される外部 IP の潜在的な競合の両方を回避するために選択された有効な IP アドレス。
  • MicroShift ネットワーク設定はデフォルトに設定されています。
重要

次の手順は、デバイスがフィールドにデプロイされた後に MicroShift クラスターへのアクセスが必要ないユースケースを対象としています。ネットワーク接続が削除された後は、リモートクラスターにアクセスできなくなります。

手順

  1. 次のコマンドを実行して、偽の IP アドレスをループバックインターフェイスに追加します。

    $ IP="10.44.0.1" 1
    $ sudo nmcli con add type loopback con-name stable-microshift ifname lo ip4 ${IP}/32
    1
    この例で使用される偽の IP アドレスは “10.44.0.1” です。
    注記

    MicroShift の内部 IP の競合と今後使用される外部 IP の潜在的な競合の両方を回避できるのであれば、有効な IP はどれでも使用できます。たとえば、MicroShift ノードのサブネットと衝突しない、またはデバイス上の他のサービスによってアクセスされる任意のサブネットを使用することができます。

  2. 自動 DNS を無視し、ローカルネームサーバーにリセットするように設定を変更して、ローカルネームサーバーを使用するように DNS インターフェイスを設定します。

    1. 次のコマンドを実行して自動 DNS をバイパスします。

      $ sudo nmcli conn modify stable-microshift ipv4.ignore-auto-dns yes
    2. DNS インターフェイスがローカルネームサーバーを使用するように指示します。

      $ sudo nmcli conn modify stable-microshift ipv4.dns "10.44.1.1"
  3. 次のコマンドを実行して、デバイスのホスト名を取得します。

    $ NAME="$(hostnamectl hostname)"
  4. 次のコマンドを実行して、/etc/hosts ファイルにノードのホスト名のエントリーを追加します。

    $ echo "$IP $NAME" | sudo tee -a /etc/hosts >/dev/null
  5. 次の YAML スニペットを /etc/microshift/config.yaml に追加して、MicroShift 設定ファイルを更新します。

    sudo tee /etc/microshift/config.yaml > /dev/null <<EOF
    node:
      hostnameOverride: $(echo $NAME)
      nodeIP: $(echo $IP)
    EOF
  6. これで、MicroShift はクラスター通信にループバックデバイスを使用できるようになりました。オフラインで使用するためのデバイスの準備を完了します。

    1. 現在デバイスに NIC がアタッチされている場合は、デバイスをネットワークから切断します。
    2. デバイスをシャットダウンし、NIC を切断します。
    3. オフライン設定を有効にするには、デバイスを再起動します。
  7. 次のコマンドを実行して、MicroShift ホストを再起動し、設定の変更を適用します。

    $ sudo systemctl reboot 1
    1
    この手順によりクラスターが再起動されます。検証を実装する前に、Greenboot ヘルスチェックによってシステムが正常であると報告されるまで待ちます。

検証

この時点で、MicroShift ホストへのネットワークアクセスは切断されています。ホストターミナルにアクセスできる場合は、ホスト CLI を使用して、クラスターが安定した状態で開始されたことを確認できます。

  1. 次のコマンドを入力して、MicroShift クラスターが実行されていることを確認します。

    $ export KUBECONFIG=/var/lib/microshift/resources/kubeadmin/kubeconfig
    $ sudo -E oc get pods -A

    出力例

    NAMESPACE                  NAME                                       READY   STATUS    RESTARTS      AGE
    kube-system                csi-snapshot-controller-74d566564f-66n2f   1/1     Running   0             1m
    kube-system                csi-snapshot-webhook-69bdff8879-xs6mb      1/1     Running   0             1m
    openshift-dns              dns-default-dxglm                          2/2     Running   0             1m
    openshift-dns              node-resolver-dbf5v                        1/1     Running   0             1m
    openshift-ingress          router-default-8575d888d8-xmq9p            1/1     Running   0             1m
    openshift-ovn-kubernetes   ovnkube-master-gcsx8                       4/4     Running   1             1m
    openshift-ovn-kubernetes   ovnkube-node-757mf                         1/1     Running   1             1m
    openshift-service-ca       service-ca-7d7c579f54-68jt4                1/1     Running   0             1m
    openshift-storage          topolvm-controller-6d777f795b-bx22r        5/5     Running   0             1m
    openshift-storage          topolvm-node-fcf8l                         4/4     Running   0             1m

法律上の通知

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.