ネットワーク
クラスターネットワークの設定および管理
概要
第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 ルールなどのネットワークポリシーを定義できます。
- MicroShift Multus プラグインを使用して、他の CNI プラグインをチェーンできます。
- Ingress ルーターを設定または削除できます。
1.1. MicroShift ネットワーク設定マトリックス
次の表はネットワーク機能のステータスをまとめたものです。デフォルトとして存在する機能、設定可能な機能、MicroShift サービスで使用できない機能があります。
ネットワーク機能 | 可用性 | 設定のサポート |
---|---|---|
アドレスのアドバタイズ | はい | はい [1] |
Kubernetes ネットワークポリシー | はい | はい |
Kubernetes ネットワークポリシーログ | 利用不可 | 該当なし |
負荷分散 | はい | はい |
マルチキャスト DNS | はい | はい [2] |
ネットワークプロキシー | はい [3] | CRI-O |
ネットワークパフォーマンス | はい | MTU 設定 |
Egress IP | 利用不可 | 該当なし |
Egress ファイアウォール | 利用不可 | 該当なし |
Egress ルーター | 利用不可 | 該当なし |
ファイアウォール | いいえ [4] | はい |
ハードウェアのオフロード | 利用不可 | 該当なし |
ハイブリッドネットワーク | 利用不可 | 該当なし |
クラスター内通信の IPsec 暗号化 | 利用不可 | 該当なし |
IPv6 | 利用不可 [5] | 該当なし |
Ingress ルーター | はい | はい [6] |
複数のネットワークプラグイン | はい | はい |
-
設定されていない場合、デフォルト値はサービスネットワークのすぐ後のサブネットに設定されます。たとえば、サービスネットワークが
10.43.0.0/16
の場合、advertiseAddress
は、10.44.0.0/32
に設定されます。 -
マルチキャスト DNS プロトコル (mDNS) を使用することで、
5353/UDP
ポートで公開されているマルチキャストを使用した、ローカルエリアネットワーク (LAN) 内で名前解決とサービス検出が可能になります。 - MicroShift には、Egress トラフィックをプロキシーする、埋め込みの透過的機能はありません。Egress は手動で設定する必要があります。
- firewalld サービスのセットアップは、RHEL for Edge でサポートされています。
- IPv6 はサポートされていません。IPv6 は、MicroShift Multus CNI プラグインを使用して他のネットワークに接続することでのみ使用できます。
-
MicroShift の
config.yaml
ファイルを使用して設定します。
1.1.1. デフォルトの設定
config.yaml
ファイルを作成しない場合は、デフォルト値が使用されます。次の例は、デフォルトの設定を示しています。
デフォルト値を確認するには、次のコマンドを実行します。
microshift show-config
$ microshift show-config
Copy to Clipboard Copied! YAML 形式でのデフォルト値の出力例
apiServer: advertiseAddress: 10.44.0.0/32 auditLog: maxFileAge: 0 maxFileSize: 200 maxFiles: 10 profile: Default namedCertificates: - certPath: "" keyPath: "" names: - "" subjectAltNames: [] debugging: logLevel: "Normal" dns: baseDomain: microshift.example.com etcd: memoryLimitMB: 0 ingress: listenAddress: - "" ports: http: 80 https: 443 routeAdmissionPolicy: namespaceOwnership: InterNamespaceAllowed status: Managed manifests: kustomizePaths: - /usr/lib/microshift/manifests - /usr/lib/microshift/manifests.d/* - /etc/microshift/manifests - /etc/microshift/manifests.d/* network: clusterNetwork: - 10.42.0.0/16 serviceNetwork: - 10.43.0.0/16 serviceNodePortRange: 30000-32767 node: hostnameOverride: "" nodeIP: ""
apiServer: advertiseAddress: 10.44.0.0/32
1 auditLog: maxFileAge: 0
2 maxFileSize: 200
3 maxFiles: 10
4 profile: Default
5 namedCertificates: - certPath: "" keyPath: "" names: - "" subjectAltNames: []
6 debugging: logLevel: "Normal"
7 dns: baseDomain: microshift.example.com
8 etcd: memoryLimitMB: 0
9 ingress: listenAddress: - ""
10 ports:
11 http: 80 https: 443 routeAdmissionPolicy: namespaceOwnership: InterNamespaceAllowed
12 status: Managed
13 manifests:
14 kustomizePaths: - /usr/lib/microshift/manifests - /usr/lib/microshift/manifests.d/* - /etc/microshift/manifests - /etc/microshift/manifests.d/* network: clusterNetwork: - 10.42.0.0/16
15 serviceNetwork: - 10.43.0.0/16
16 serviceNodePortRange: 30000-32767
17 node: hostnameOverride: ""
18 nodeIP: ""
19 Copy to Clipboard Copied! - 1
- API サーバーがクラスターのメンバーにアドバタイズされる IP アドレスを指定する文字列。デフォルト値は、サービスネットワークのアドレスに基づいて計算されます。
- 2
- ログファイルが自動的に削除されるまでの保存期間。
maxFileAge
パラメーターのデフォルト値0
に設定すると、ログファイルが経過時間をベースに削除されなくなります。この値は設定可能です。 - 3
- デフォルトでは、
audit.log
ファイルがmaxFileSize
の制限に達すると、audit.log
ファイルがローテーションされ、MicroShift は新しいaudit.log
ファイルへの書き込みを開始します。この値は設定可能です。 - 4
- 保存されるログファイルの合計数。デフォルトでは、MicroShift は 10 個のログファイルを保持します。余分なファイルが作成されると、最も古いものが削除されます。この値は設定可能です。
- 5
- 読み取りおよび書き込み要求のメタデータのみをログに記録します。OAuth アクセストークン要求を除く要求の本文はログに記録されません。このフィールドを指定しない場合は、
Default
プロファイルが使用されます。 - 6
- API サーバー証明書のサブジェクト代替名。
- 7
- ログの詳細レベル。このフィールドの有効な値は、
Normal
、Debug
、Trace
、またはTraceAll
です。 - 8
- デフォルトでは、
etcd
はシステムの負荷を処理するために必要な量のメモリーを使用します。ただし、メモリー制約のあるシステムでは、etcd
が特定の時点で使用できるメモリーの量を制限することが望ましいか、または制限する必要がある場合があります。 - 9
- クラスターのベースドメイン。管理されるすべての DNS レコードはこのベースのサブドメインです。
- 10
ingress.listenAddress
の値は、デフォルトでホストのネットワーク全体に設定されます。有効な設定可能な値は、単一の IP アドレスまたは NIC 名、あるいは複数の IP アドレスと NIC 名のリストです。- 11
- デフォルトのポートが表示されます。設定可能です。両方のポートエントリーの有効な値は、1 - 65535 の範囲にある単一の一意のポートです。
ports.http
およびports.https
フィールドの値は、同じにすることはできません。 - 12
- 複数の namespace のホスト名要求の処理方法を記述します。デフォルトでは、ルートが、複数の namespace においてホストが同じ名前でパスが異なる要求を許可します。有効な値は
Strict
およびInterNamespaceAllowed
です。Strict
を指定すると、namespace が異なるルートが、同じホスト名を要求しなくなります。カスタマイズされた MicroShift のconfig.yaml
で値が削除されると、InterNamespaceAllowed
値が自動的に設定されます。 - 13
- デフォルトのルーターステータスは、
Managed
またはRemoved
のいずれかになります。 - 14
- マニフェストをロードするために使用する
kustomization
ファイルをスキャンするファイルシステム上の場所。パスのリストを設定すると、それらのパスのみをスキャンします。マニフェストの読み込みを無効にするには、空のリストに設定します。リスト内のエントリーは、複数のサブディレクトリーに一致する glob パターンに指定できます。 - 15
- Pod IP アドレスの割り当てに使用する IP アドレスのブロック。このフィールドは、インストール後は不変です。
- 16
- Kubernetes サービスの仮想 IP アドレスのブロック。サービスの IP アドレスプール。単一のエントリーがサポートされます。このフィールドは、インストール後は不変です。
- 17
NodePort
タイプの Kubernetes サービスに許可されるポート範囲。指定しない場合、デフォルトの範囲の 30000-32767 が使用されます。NodePort
が指定されていないサービスは、この範囲から自動的に割り当てられます。このパラメーターは、クラスターのインストール後に更新できます。- 18
- ノードの名前。デフォルト値はホスト名です。空でない場合、この文字列はホスト名ではなく、ノードを識別するために使用されます。MicroShift の初回起動後に、この不変設定を変更することはできません。
- 19
- ノードの IP アドレス。デフォルト値は、デフォルトルートの IP アドレスです。
1.2. ネットワーク機能
MicroShift 4.16 で利用できるネットワーク機能には、次のものがあります。
- Kubernetes ネットワークポリシー
- 動的ノード IP
- カスタムゲートウェイインターフェイス
- セカンドゲートウェイインターフェイス
- 指定されたホストインターフェイス上のクラスターネットワーク
- 特定のホストインターフェイス上の NodePort サービスへの外部アクセスをブロック
MicroShift 4.16 では利用できないネットワーク機能:
- 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
northd
、nbdb
、sbdb
、およびovnkube-master
コンテナーが含まれます。 ovnkube-node ovnkube-node には、OVN-Controller コンテナーが含まれています。
MicroShift の起動後、OVN-Kubernetes デーモンセットが
openshift-ovn-kubernetes
namespace にデプロイされます。
-
ovnkube-master
- パッケージ
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-int
と br-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 ネットワークトポロジー
1.7.1. 仮想化ネットワークの OVN 論理コンポーネントの説明
- OVN ノードスイッチ
<node-name>
という名前の仮想スイッチ。OVN ノードスイッチの名前は、ノードのホスト名に基づいて付けられます。-
この例では、
node-name
はmicroshift-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 クラスタールーター
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 1
とInterface 2
を介してノードスイッチに接続しています。
-
この例では、Pod 1 と Pod 2 は、
1.8. 関連情報
第2章 ネットワーク設定について
ネットワークのカスタマイズとデフォルト設定を MicroShift デプロイメントに適用する方法を学びます。各ノードは単一のマシンと単一の MicroShift に含まれているため、デプロイごとに個別の構成、Pod、および設定が必要です。
クラスター管理者は、クラスターで実行されるアプリケーションを外部トラフィックに公開し、ネットワーク接続のセキュリティーを保護するための複数のオプションがあります。
- NodePort などのサービス
-
Ingress
やRoute
などの API リソース
デフォルトで、Kubernetes は各 Pod に、Pod 内で実行しているアプリケーションの内部 IP アドレスを割り当てます。Pod とそのコンテナーの間にはトラフィックを配置できますが、NodePort などのサービスで公開されている場合を除き、クラスター外のクライアントは Pod に直接ネットワークアクセスできません。
2.1. OVN-Kubernetes 設定ファイルの作成
OVN-Kubernetes 設定ファイルが作成されていない場合、MicroShift は組み込みのデフォルト OVN-Kubernetes 値を使用します。OVN-Kubernetes 設定ファイルを /etc/microshift/ovn.yaml
に書き込むことができます。設定用のサンプルファイルが提供されています。
手順
ovn.yaml
ファイルを作成するには、次のコマンドを実行します。$ sudo cp /etc/microshift/ovn.yaml.default /etc/microshift/ovn.yaml
$ sudo cp /etc/microshift/ovn.yaml.default /etc/microshift/ovn.yaml
Copy to Clipboard Copied! 作成した設定ファイルの内容を一覧表示するには、次のコマンドを実行します。
$ cat /etc/microshift/ovn.yaml
$ cat /etc/microshift/ovn.yaml
Copy to Clipboard Copied! デフォルトの最大伝送単位 (MTU) 値を含む YAML ファイルの例
mtu: 1400
mtu: 1400
Copy to Clipboard Copied! 設定をカスタマイズするには、MTU 値を変更します。以下の表で詳細を記載します。
表2.1 サポート対象の MicroShift の OVN-Kubernetes 設定 (任意) フィールド 型 デフォルト 説明 例 mtu
uint32
auto
Pod に使用される MTU 値
1300
重要ovn.yaml
ファイルのmtu
設定値を変更した場合に、更新された設定を適用するには、Red Hat build of MicroShift が実行しているホストを再起動する必要があります。カスタム
ovn.yaml
設定ファイルの例mtu: 1300
mtu: 1300
Copy to Clipboard Copied!
2.2. ovnkube-master Pod の再起動
次の手順で ovnkube-master
Pod を再起動します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。 - インフラストラクチャーにインストールされたクラスターが OVN-Kubernetes ネットワークプラグインで設定されている。
- KUBECONFIG 環境変数が設定されている。
手順
次の手順を使用して、ovnkube-master
Pod を再起動します。
次のコマンドを実行して、リモートクラスターにアクセスします。
export KUBECONFIG=$PWD/kubeconfig
$ export KUBECONFIG=$PWD/kubeconfig
Copy to Clipboard Copied! 次のコマンドを実行して、再起動する
ovnkube-master
Pod の名前を見つけます。pod=$(oc get pods -n openshift-ovn-kubernetes | awk -F " " '/ovnkube-master/{print $1}')
$ pod=$(oc get pods -n openshift-ovn-kubernetes | awk -F " " '/ovnkube-master/{print $1}')
Copy to Clipboard Copied! 次のコマンドを実行して、
ovnkube-master
Pod を削除します。oc -n openshift-ovn-kubernetes delete pod $pod
$ oc -n openshift-ovn-kubernetes delete pod $pod
Copy to Clipboard Copied! 次のコマンドを使用して、新しい
ovnkube-master
Pod が実行されていることを確認します。oc get pods -n openshift-ovn-kubernetes
$ oc get pods -n openshift-ovn-kubernetes
Copy to Clipboard Copied! 実行中の Pod のリストには、新しい
ovnkube-master
Pod の名前と経過時間が表示されます。
2.3. HTTP または HTTPS プロキシーの背後への MicroShift のデプロイ
基本的な匿名性とセキュリティー対策を Pod に追加する場合は、HTTP または HTTPS プロキシーの背後に MicroShift クラスターをデプロイします。
プロキシーの背後に MicroShift をデプロイする場合は、HTTP または HTTPS 要求を開始するすべてのコンポーネントでプロキシーサービスを使用するように、ホストオペレーティングシステムを設定する必要があります。
クラウドサービスへのアクセスなど、Egress トラフィックを伴うユーザー固有のワークロードまたは Pod はすべて、プロキシーを使用するように設定する必要があります。MicroShift には、Egress トラフィックをプロキシーする、埋め込みの透過的機能はありません。
2.4. RPM-OStree HTTP または HTTPS プロキシーの使用
RPM-OStree で HTTP または HTTPS プロキシーを使用するには、設定ファイルに Service
セクションを追加し、rpm-ostree
サービスの http_proxy
環境変数を設定する必要があります。
手順
次の設定を
/etc/systemd/system/rpm-ostreed.service.d/00-proxy.conf
ファイルに追加します。[Service] Environment="http_proxy=http://$PROXY_USER:$PROXY_PASSWORD@$PROXY_SERVER:$PROXY_PORT/"
[Service] Environment="http_proxy=http://$PROXY_USER:$PROXY_PASSWORD@$PROXY_SERVER:$PROXY_PORT/"
Copy to Clipboard Copied! 次に、設定をリロードして、サービスを再起動して変更を適用します。
次のコマンドを実行して、設定をリロードします。
sudo systemctl daemon-reload
$ sudo systemctl daemon-reload
Copy to Clipboard Copied! 次のコマンドを実行して、
rpm-ostreed
サービスを再起動します。sudo systemctl restart rpm-ostreed.service
$ sudo systemctl restart rpm-ostreed.service
Copy to Clipboard Copied!
2.5. CRI-O コンテナーランタイムでのプロキシーの使用
CRI-O
で HTTP または HTTPS プロキシーを使用するには、設定ファイルに Service
セクションを追加し、HTTP_PROXY
および HTTPS_PROXY
環境変数を設定する必要があります。NO_PROXY
変数を設定して、ホストのリストをプロキシーから除外することもできます。
手順
設定ファイル用のディレクトリーが存在しない場合は、作成します。
sudo mkdir /etc/systemd/system/crio.service.d/
$ sudo mkdir /etc/systemd/system/crio.service.d/
Copy to Clipboard Copied! 次の設定を
/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] 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/"
Copy to Clipboard Copied! 重要環境変数の設定ファイルの
Service
セクションを定義する必要があります。定義しないと、プロキシー設定が適用されません。設定を再読み込みします。
sudo systemctl daemon-reload
$ sudo systemctl daemon-reload
Copy to Clipboard Copied! CRI-O サービスを再起動します。
sudo systemctl restart crio
$ sudo systemctl restart crio
Copy to Clipboard Copied! MicroShift サービスを再起動して設定を適用します。
sudo systemctl restart microshift
$ sudo systemctl restart microshift
Copy to Clipboard Copied!
検証
次のコマンドを実行し、出力を調べて、Pod が起動していることを確認します。
oc get all -A
$ oc get all -A
Copy to Clipboard Copied! 次のコマンドを実行し、出力を調べて、MicroShift がコンテナーイメージをプルできることを確認します。
sudo crictl images
$ sudo crictl images
Copy to Clipboard Copied!
2.6. 実行中のクラスターからの OVS インターフェイスのスナップショット取得
スナップショットは、特定の時点における OVS インターフェイスの状態とデータを表します。
手順
実行中の MicroShift クラスターから OVS インターフェイスのスナップショットを表示するには、次のコマンドを使用します。
sudo ovs-vsctl show
$ sudo ovs-vsctl show
Copy to Clipboard Copied! 実行中のクラスターでの 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 Interface patch-br-ex_localhost.localdomain-to-br-int type: patch options: {peer=patch-br-int-to-br-ex_localhost.localdomain} 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 Port b47b1995ada84f4 Interface b47b1995ada84f4 Port "3031f43d67c167f" Interface "3031f43d67c167f" Port br-int Interface br-int type: internal Port ovn-k8s-mp0 Interface ovn-k8s-mp0 type: internal ovs_version: "2.17.3"
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"
Copy to Clipboard Copied! - 1
patch-br-ex_localhost.localdomain-to-br-int
とpatch-br-int-to-br-ex_localhost.localdomain
は、br-ex
とbr-int
を接続する OVS パッチポートです。- 2
patch-br-ex_localhost.localdomain-to-br-int
とpatch-br-int-to-br-ex_localhost.localdomain
は、br-ex
とbr-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 LoadBalancer サービス
MicroShift には、クラスター内のワークロードとアプリケーションに使用できる Network Load Balancer の実装が組み込まれています。Ingress ルールを理解し、Ingress コントローラーとして機能するように Pod を設定することで、LoadBalancer
サービスを作成できます。以下の手順では、デプロイメントベースの LoadBalancer
サービスの例を示します。
2.8. アプリケーション用のロードバランサーのデプロイ
次の手順例では、ノード IP アドレスを LoadBalancer
サービス設定ファイルの外部 IP アドレスとして使用します。この例を、ロードバランサーをデプロイする方法のガイダンスとして使用します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - OVN-Kubernetes ネットワークプラグインで設定されたインフラストラクチャーにクラスターがインストールされている。
-
KUBECONFIG
環境変数が設定されている。
手順
次のコマンドを入力して、Pod が実行されていることを確認します。
oc get pods -A
$ oc get pods -A
Copy to Clipboard Copied! 出力例
NAMESPACE NAME READY STATUS RESTARTS AGE default i-06166fbb376f14a8bus-west-2computeinternal-debug-qtwcr 1/1 Running 0 46m kube-system csi-snapshot-controller-5c6586d546-lprv4 1/1 Running 0 51m kube-system csi-snapshot-webhook-6bf8ddc7f5-kz6k9 1/1 Running 0 51m openshift-dns dns-default-45jl7 2/2 Running 0 50m openshift-dns node-resolver-7wmzf 1/1 Running 0 51m openshift-ingress router-default-78b86fbf9d-qvj9s 1/1 Running 0 51m openshift-multus dhcp-daemon-j7qnf 1/1 Running 0 51m openshift-multus multus-r758z 1/1 Running 0 51m openshift-operator-lifecycle-manager catalog-operator-85fb86fcb9-t6zm7 1/1 Running 0 51m openshift-operator-lifecycle-manager olm-operator-87656d995-fvz84 1/1 Running 0 51m openshift-ovn-kubernetes ovnkube-master-5rfhh 4/4 Running 0 51m openshift-ovn-kubernetes ovnkube-node-gcnt6 1/1 Running 0 51m openshift-service-ca service-ca-bf5b7c9f8-pn6rk 1/1 Running 0 51m openshift-storage topolvm-controller-549f7fbdd5-7vrmv 5/5 Running 0 51m openshift-storage topolvm-node-rht2m 3/3 Running 0 50m
NAMESPACE NAME READY STATUS RESTARTS AGE default i-06166fbb376f14a8bus-west-2computeinternal-debug-qtwcr 1/1 Running 0 46m kube-system csi-snapshot-controller-5c6586d546-lprv4 1/1 Running 0 51m kube-system csi-snapshot-webhook-6bf8ddc7f5-kz6k9 1/1 Running 0 51m openshift-dns dns-default-45jl7 2/2 Running 0 50m openshift-dns node-resolver-7wmzf 1/1 Running 0 51m openshift-ingress router-default-78b86fbf9d-qvj9s 1/1 Running 0 51m openshift-multus dhcp-daemon-j7qnf 1/1 Running 0 51m openshift-multus multus-r758z 1/1 Running 0 51m openshift-operator-lifecycle-manager catalog-operator-85fb86fcb9-t6zm7 1/1 Running 0 51m openshift-operator-lifecycle-manager olm-operator-87656d995-fvz84 1/1 Running 0 51m openshift-ovn-kubernetes ovnkube-master-5rfhh 4/4 Running 0 51m openshift-ovn-kubernetes ovnkube-node-gcnt6 1/1 Running 0 51m openshift-service-ca service-ca-bf5b7c9f8-pn6rk 1/1 Running 0 51m openshift-storage topolvm-controller-549f7fbdd5-7vrmv 5/5 Running 0 51m openshift-storage topolvm-node-rht2m 3/3 Running 0 50m
Copy to Clipboard Copied! 次のコマンドを実行して、namespace を作成します。
NAMESPACE=<nginx-lb-test>
$ NAMESPACE=<nginx-lb-test>
1 Copy to Clipboard Copied! - 1
- _<nginx-lb-test> は、作成するアプリケーション namespace に置き換えます。
oc create ns $NAMESPACE
$ oc create ns $NAMESPACE
Copy to Clipboard Copied! namespace の例
次の例では、
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
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
Copy to Clipboard Copied! 次のコマンドを実行すると、3 つのサンプルレプリカが正常に開始したことを確認できます。
oc get pods -n $NAMESPACE
$ oc get pods -n $NAMESPACE
Copy to Clipboard Copied! 次のコマンドを実行して、
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
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
Copy to Clipboard Copied! 注記port
パラメーターが、他のLoadBalancer
サービスまたは MicroShift コンポーネントによって占有されていないホストポートであることを確認する必要があります。サービスファイルが存在し、外部 IP アドレスが適切に割り当てられていること、および外部 IP がノード IP と同一であることを確認するには、次のコマンドを実行します。
oc get svc -n $NAMESPACE
$ oc get svc -n $NAMESPACE
Copy to Clipboard Copied! 出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.43.183.104 192.168.1.241 81:32434/TCP 2m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.43.183.104 192.168.1.241 81:32434/TCP 2m
Copy to Clipboard Copied!
検証
次のコマンドは、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
EXTERNAL_IP=192.168.1.241 seq 5 | xargs -Iz curl -s -I http://$EXTERNAL_IP:81 | grep X-Server-IP
Copy to Clipboard Copied! LoadBalancer
サービスがトラフィックをアプリケーションに正常に分散している場合、前のコマンドの出力には異なる 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
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
Copy to Clipboard Copied!
2.9. 特定のホストインターフェイス上の NodePort サービスへの外部アクセスをブロック
OVN-Kubernetes は、Red Hat build of MicroShift ノードの外部から NodePort サービスにアクセスできるホストインターフェイスを制限しません。次の手順では、特定のホストインターフェイスで NodePort サービスをブロックし、外部アクセスを制限する方法を説明します。
前提条件
- root 権限を持つアカウント。
手順
次のコマンドを実行して、
NODEPORT
変数を Kubernetes NodePort サービスに割り当てられたホストポート番号に変更します。export NODEPORT=30700
# export NODEPORT=30700
Copy to Clipboard Copied! INTERFACE_IP
値を、ブロックするホストインターフェイスの IP アドレスに変更します。以下に例を示します。export INTERFACE_IP=192.168.150.33
# export INTERFACE_IP=192.168.150.33
Copy to Clipboard Copied! nat
テーブル PREROUTING チェーンに新しいルールを挿入して、宛先ポートと IP アドレスに一致するすべてのパケットをドロップします。以下に例を示します。sudo nft -a insert rule ip nat PREROUTING tcp dport $NODEPORT ip daddr $INTERFACE_IP drop
$ sudo nft -a insert rule ip nat PREROUTING tcp dport $NODEPORT ip daddr $INTERFACE_IP drop
Copy to Clipboard Copied! 次のコマンドを実行して、新しいルールをリスト表示します。
sudo nft -a list chain ip nat PREROUTING
$ 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 } }
Copy to Clipboard Copied! 注記新しく追加したルールの
handle
番号をメモします。次の手順でhandle
番号を削除する必要があります次のサンプルコマンドを使用してカスタムルールを削除します。
sudo nft -a delete rule ip nat PREROUTING handle 134
$ sudo nft -a delete rule ip nat PREROUTING handle 134
Copy to Clipboard Copied!
2.10. マルチキャスト DNS プロトコル
マルチキャスト DNS プロトコル (mDNS) を使用することで、5353/UDP
ポートで公開されているマルチキャストを使用した、ローカルエリアネットワーク (LAN) 内で名前解決とサービス検出が可能になります。
MicroShift には、権威 DNS サーバーを MicroShift のサービスに対してクライアントを参照するように再設定できないデプロイメントシナリオ向けに、埋め込みの mDNS サーバーが含まれています。埋め込みの DNS サーバーにより、MicroShift によって公開された .local
ドメインが LAN 上の他の要素によって検出されるようになります。
2.11. 公開されたネットワークポートの監査
MicroShift では、次の場合にワークロードによってホストポートを開くことができます。ログを確認してネットワークサービスを表示できます。
2.11.1. hostNetwork
Pod が hostNetwork:true
で設定されている場合、Pod はホストネットワーク namespace で実行されています。この設定では、ホストポートを独立して開くことができます。MicroShift コンポーネントログを使用してこのケースを追跡することはできません。ポートは firewalld ルールの対象となります。firewalld でポートが開いている場合は、firewalld デバッグログでポートの開きを確認できます。
前提条件
- ビルドホストへの root ユーザーアクセス権がある。
手順
オプション: 次のコマンド例を使用して、
hostNetwork:true
パラメーターが ovnkube-node Pod に設定されていることを確認できます。sudo oc get pod -n openshift-ovn-kubernetes <ovnkube-node-pod-name> -o json | jq -r '.spec.hostNetwork' true
$ sudo oc get pod -n openshift-ovn-kubernetes <ovnkube-node-pod-name> -o json | jq -r '.spec.hostNetwork' true
Copy to Clipboard Copied! 次のコマンドを実行して、firewalld ログのデバッグを有効にします。
sudo vi /etc/sysconfig/firewalld
$ sudo vi /etc/sysconfig/firewalld FIREWALLD_ARGS=--debug=10
Copy to Clipboard Copied! firewalld サービスを再起動します。
sudo systemctl restart firewalld.service
$ sudo systemctl restart firewalld.service
Copy to Clipboard Copied! デバッグオプションが適切に追加されたことを確認するには、次のコマンドを実行します。
sudo systemd-cgls -u firewalld.service
$ sudo systemd-cgls -u firewalld.service
Copy to Clipboard Copied! firewalld デバッグログは、
/var/log/firewalld
パスに保存されます。ポートオープンルールが追加されたときのログの例:
2023-06-28 10:46:37 DEBUG1: config.getZoneByName('public') 2023-06-28 10:46:37 DEBUG1: config.zone.7.addPort('8080', 'tcp') 2023-06-28 10:46:37 DEBUG1: config.zone.7.getSettings() 2023-06-28 10:46:37 DEBUG1: config.zone.7.update('...') 2023-06-28 10:46:37 DEBUG1: config.zone.7.Updated('public')
2023-06-28 10:46:37 DEBUG1: config.getZoneByName('public') 2023-06-28 10:46:37 DEBUG1: config.zone.7.addPort('8080', 'tcp') 2023-06-28 10:46:37 DEBUG1: config.zone.7.getSettings() 2023-06-28 10:46:37 DEBUG1: config.zone.7.update('...') 2023-06-28 10:46:37 DEBUG1: config.zone.7.Updated('public')
Copy to Clipboard Copied! ポートオープンルールが削除されたときのログの例:
2023-06-28 10:47:57 DEBUG1: config.getZoneByName('public') 2023-06-28 10:47:57 DEBUG2: config.zone.7.Introspect() 2023-06-28 10:47:57 DEBUG1: config.zone.7.removePort('8080', 'tcp') 2023-06-28 10:47:57 DEBUG1: config.zone.7.getSettings() 2023-06-28 10:47:57 DEBUG1: config.zone.7.update('...') 2023-06-28 10:47:57 DEBUG1: config.zone.7.Updated('public')
2023-06-28 10:47:57 DEBUG1: config.getZoneByName('public') 2023-06-28 10:47:57 DEBUG2: config.zone.7.Introspect() 2023-06-28 10:47:57 DEBUG1: config.zone.7.removePort('8080', 'tcp') 2023-06-28 10:47:57 DEBUG1: config.zone.7.getSettings() 2023-06-28 10:47:57 DEBUG1: config.zone.7.update('...') 2023-06-28 10:47:57 DEBUG1: config.zone.7.Updated('public')
Copy to Clipboard Copied!
2.11.2. hostPort
MicroShift で hostPort 設定ログにアクセスできます。次のログは、hostPort 設定の例です。
手順
次のコマンドを実行すると、ログにアクセスできます。
journalctl -u crio | grep "local port"
$ journalctl -u crio | grep "local port"
Copy to Clipboard Copied! ホストポートが開いている場合の CRI-O ログの例:
Jun 25 16:27:37 rhel92 crio[77216]: time="2023-06-25 16:27:37.033003098+08:00" level=info msg="Opened local port tcp:443"
$ Jun 25 16:27:37 rhel92 crio[77216]: time="2023-06-25 16:27:37.033003098+08:00" level=info msg="Opened local port tcp:443"
Copy to Clipboard Copied! ホストポートが閉じている場合の CRI-O ログの例:
Jun 25 16:24:11 rhel92 crio[77216]: time="2023-06-25 16:24:11.342088450+08:00" level=info msg="Closing host port tcp:443"
$ Jun 25 16:24:11 rhel92 crio[77216]: time="2023-06-25 16:24:11.342088450+08:00" level=info msg="Closing host port tcp:443"
Copy to Clipboard Copied!
2.11.3. NodePort および LoadBalancer サービス
OVN-Kubernetes は、NodePort
および LoadBalancer
サービスタイプのホストポートを開きます。これらのサービスは、ホストポートから Ingress トラフィックを取得し、それを clusterIP に転送する iptables ルールを追加します。NodePort
および LoadBalancer
サービスのログを次の例に示します。
手順
ovnkube-master
Pod の名前にアクセスするには、次のコマンドを実行します。oc get pods -n openshift-ovn-kubernetes | awk '/ovnkube-master/{print $1}'
$ oc get pods -n openshift-ovn-kubernetes | awk '/ovnkube-master/{print $1}'
Copy to Clipboard Copied! ovnkube-master
Pod 名の例ovnkube-master-n2shv
ovnkube-master-n2shv
Copy to Clipboard Copied! ovnkube-master
Pod を使用し、次のコマンド例を実行すると、NodePort
およびLoadBalancer
サービスのログにアクセスできます。oc logs -n openshift-ovn-kubernetes <ovnkube-master-pod-name> ovnkube-master | grep -E "OVN-KUBE-NODEPORT|OVN-KUBE-EXTERNALIP"
$ oc logs -n openshift-ovn-kubernetes <ovnkube-master-pod-name> ovnkube-master | grep -E "OVN-KUBE-NODEPORT|OVN-KUBE-EXTERNALIP"
Copy to Clipboard Copied! NodePort サービス:
ホストポートが開いている場合の ovnkube-master Pod の ovnkube-master コンテナー内のログの例:
I0625 09:07:00.992980 2118395 iptables.go:27] Adding rule in table: nat, chain: OVN-KUBE-NODEPORT with args: "-p TCP -m addrtype --dst-type LOCAL --dport 32718 -j DNAT --to-destination 10.96.178.142:8081" for protocol: 0
$ I0625 09:07:00.992980 2118395 iptables.go:27] Adding rule in table: nat, chain: OVN-KUBE-NODEPORT with args: "-p TCP -m addrtype --dst-type LOCAL --dport 32718 -j DNAT --to-destination 10.96.178.142:8081" for protocol: 0
Copy to Clipboard Copied! ホストポートが閉じている場合の ovnkube-master Pod の ovnkube-master コンテナー内のログの例:
Deleting rule in table: nat, chain: OVN-KUBE-NODEPORT with args: "-p TCP -m addrtype --dst-type LOCAL --dport 32718 -j DNAT --to-destination 10.96.178.142:8081" for protocol: 0
$ Deleting rule in table: nat, chain: OVN-KUBE-NODEPORT with args: "-p TCP -m addrtype --dst-type LOCAL --dport 32718 -j DNAT --to-destination 10.96.178.142:8081" for protocol: 0
Copy to Clipboard Copied! LoadBalancer サービス:
ホストポートが開いている場合の ovnkube-master Pod の ovnkube-master コンテナー内のログの例:
I0625 09:34:10.406067 128902 iptables.go:27] Adding rule in table: nat, chain: OVN-KUBE-EXTERNALIP with args: "-p TCP -d 172.16.47.129 --dport 8081 -j DNAT --to-destination 10.43.114.94:8081" for protocol: 0
$ I0625 09:34:10.406067 128902 iptables.go:27] Adding rule in table: nat, chain: OVN-KUBE-EXTERNALIP with args: "-p TCP -d 172.16.47.129 --dport 8081 -j DNAT --to-destination 10.43.114.94:8081" for protocol: 0
Copy to Clipboard Copied! ホストポートが閉じている場合の ovnkube-master Pod の ovnkube-master コンテナー内のログの例:
I0625 09:37:00.976953 128902 iptables.go:63] Deleting rule in table: nat, chain: OVN-KUBE-EXTERNALIP with args: "-p TCP -d 172.16.47.129 --dport 8081 -j DNAT --to-destination 10.43.114.94:8081" for protocol: 0
$ I0625 09:37:00.976953 128902 iptables.go:63] Deleting rule in table: nat, chain: OVN-KUBE-EXTERNALIP with args: "-p TCP -d 172.16.47.129 --dport 8081 -j DNAT --to-destination 10.43.114.94:8081" for protocol: 0
Copy to Clipboard Copied!
第3章 ルーターの概要および設定
MicroShift を使用して、ルーターとルート許可ポリシーを設定するためのデフォルト設定とカスタム設定を学習します。
3.1. ルーターの設定について
Ingress をオプションにするには、MicroShift Ingress ルーター設定を指定して、ネットワークトラフィックに公開されるポート (存在する場合) を管理できます。指定されたルーティングは、Ingress ロードバランシングの例です。
-
デフォルトの Ingress ルーターは常にオンになっており、
http: 80
およびhttps: 443
ポート上のすべての IP アドレスで実行されます。 - デフォルトのルーター設定では、任意の namespace にアクセスできます。
MicroShift 上で実行されるアプリケーションによっては、デフォルトのルーターは必要なく、代わりに独自のルーターが作成される場合があります。ルーターを設定して、Ingress と namespace アクセスの両方を制御できます。
設定を開始する前に oc get deployment -n openshift-ingress
コマンドを使用して MicroShift インストールにデフォルトルーターが存在するかどうかを確認できます。このコマンドは、次の出力を返します。
NAME READY UP-TO-DATE AVAILABLE AGE router-default 1/1 1 1 2d23h
NAME READY UP-TO-DATE AVAILABLE AGE
router-default 1/1 1 1 2d23h
3.1.1. ルーターの設定および有効な値
Ingress ルーターの設定は、以下のパラメーターおよび有効な値で構成されます。
config.yaml
ルーター設定の例
# ... ingress: listenAddress: - "" ports: http: 80 https: 443 routeAdmissionPolicy: namespaceOwnership: InterNamespaceAllowed status: Managed # ...
# ...
ingress:
listenAddress:
- ""
ports:
http: 80
https: 443
routeAdmissionPolicy:
namespaceOwnership: InterNamespaceAllowed
status: Managed
# ...
- 1
ingress.listenAddress
の値は、デフォルトでホストのネットワーク全体に設定されます。有効なカスタマイズ可能な値は、単一の IP アドレスまたはホスト名、あるいは IP アドレスまたはホスト名のリストです。- 2
- 両方のポートエントリーの有効な値は、1 - 65535 の範囲にある単一の一意のポートです。
ports.http
およびports.https
フィールドの値は、同じにすることはできません。 - 3
- デフォルト値。ルートが、複数の namespace において名前が同じでパスが異なる要求を許可します。
- 4
- デフォルト値。Ingress ポートを開いたままにするには、
Managed
が必要です。
デフォルトの MicroShift ルーターとルーターを有効化二設定することで、firewalld サービスはバイパスされます。ルーターがアクティブな場合にネットワークポリシーを設定し、Ingress および Egress を制御する必要があります。
3.2. ルーターの無効化
MicroShift Pod がサウスバウンドの運用システムとノースバウンドのクラウドデータシステムのみに接続する必要がある産業用 IoT スペースなどのユースケースでは、インバウンドサービスは必要ありません。このような Egress のみのユースケースでルーターを無効にするには、この手順を使用します。
前提条件
- MicroShift をインストールしている。
-
MicroShift の
config.yaml
ファイルが作成されている。 -
OpenShift CLI (
oc
) がインストールされている。
MicroShift config.yaml
ファイルで指定する必要のある設定をすべて同時に完了すると、システムの再起動を最小限に抑えることができます。
手順
次の例に示すように、MicroShift
config.yaml
ファイルのingress.status
フィールドの値をRemoved
に更新します。config.yaml
Ingress スタンザの例# ... ingress: ports: http: 80 https: 443 routeAdmissionPolicy: namespaceOwnership: InterNamespaceAllowed status: Removed # ...
# ... ingress: ports: http: 80 https: 443 routeAdmissionPolicy: namespaceOwnership: InterNamespaceAllowed status: Removed
1 # ...
Copy to Clipboard Copied! - 1
- 値が
Removed
に設定されている場合、ingress.ports
にリストされているポートは自動的に閉じられます。Ingress
スタンザ内のその他の設定 (routeAdmissionPolicy.namespaceOwnership
フィールドの値など) は無視されます。
次のコマンドを実行して、MicroShift サービスを再起動します。
sudo systemctl restart microshift
$ sudo systemctl restart microshift
Copy to Clipboard Copied! 注記MicroShift サービスは、再起動時に現在の設定を出力します。
検証
システムが再起動されると、次のコマンドを実行して、ルーターが削除され、Ingress が停止されていることを確認します。
oc -n openshift-ingress get svc
$ oc -n openshift-ingress get svc
Copy to Clipboard Copied! 予想される出力
No resources found in openshift-ingress namespace.
No resources found in openshift-ingress namespace.
Copy to Clipboard Copied!
3.3. ルーター Ingress の設定
MicroShift アプリケーションがデータトラフィックのみをリッスンする必要がある場合は、listenAddress
設定を指定してデバイスを分離できます。ネットワーク接続用の特定のポートと IP アドレスを設定することもできます。ユースケースに合わせてエンドポイント設定をカスタマイズするために必要な組み合わせを使用します。
3.3.1. ルーターポートの設定
ルーター Ingress フィールドを設定することで、デバイスが使用するポートを制御できます。
前提条件
- MicroShift をインストールしている。
-
MicroShift の
config.yaml
ファイルが作成されている。 -
OpenShift CLI (
oc
) がインストールされている。
MicroShift config.yaml
ファイルで指定する必要のある設定をすべて同時に完了すると、システムの再起動を最小限に抑えることができます。
手順
ingress.ports.http
およびingress.ports.https
フィールドの MicroShiftconfig.yaml
ポート値を、使用するポートに更新します。config.yaml
ルーター設定の例# ... ingress: ports: http: 80 https: 443 routeAdmissionPolicy: namespaceOwnership: InterNamespaceAllowed status: Managed # ...
# ... ingress: ports:
1 http: 80 https: 443 routeAdmissionPolicy: namespaceOwnership: InterNamespaceAllowed status: Managed
2 # ...
Copy to Clipboard Copied! 次のコマンドを実行して、MicroShift サービスを再起動します。
sudo systemctl restart microshift
$ sudo systemctl restart microshift
Copy to Clipboard Copied!
3.3.2. ルーターの IP アドレスの設定
特定の IP アドレスを設定することで、ルーターへのネットワークトラフィックを制限できます。以下に例を示します。
- ルーターが内部ネットワークでのみアクセス可能で、ノースバウンドのパブリックネットワークではアクセスできないユースケース
- ルーターがノースバウンドのパブリックネットワークからのみアクセス可能で、内部ネットワークからはアクセスできないユースケース
- ルーターが内部ネットワークとノースバウンドのパブリックネットワークの両方から到達可能であるが、別々の IP アドレス上にある場合のユースケース
前提条件
- MicroShift をインストールしている。
-
MicroShift の
config.yaml
ファイルが作成されている。 -
OpenShift CLI (
oc
) がインストールされている。
MicroShift config.yaml
ファイルで指定する必要のある設定をすべて同時に完了すると、システムの再起動を最小限に抑えることができます。
手順
要件に応じて、次の例に示すように、MicroShift
config.yaml
のingress.listenAddress
フィールドのリストを更新します。デフォルトのルーター IP アドレスリスト
# ... ingress: listenAddress: - "<host_network>" # ...
# ... ingress: listenAddress: - "<host_network>"
1 # ...
Copy to Clipboard Copied! - 1
ingress.listenAddress
の値は、デフォルトでホストのネットワーク全体に設定されます。デフォルトのリストを引き続き使用するには、MicroShiftconfig.yaml
ファイルからlisten.Address
フィールドを削除します。このパラメーターをカスタマイズするには、リストを使用します。リストには、単一の IP アドレスまたは NIC 名、あるいは複数の IP アドレスと NIC 名を含めることができます。
重要config.yaml
ファイルを使用する場合は、listenAddress
パラメーターを削除するか、リスト形式で値を追加する必要があります。フィールドを空白のままにしないでください。空白のままにすると、再起動時に MicroShift がクラッシュします。単一のホスト IP アドレスを持つルーターの設定例
# ... ingress: listenAddress: - 10.2.1.100 # ...
# ... ingress: listenAddress: - 10.2.1.100 # ...
Copy to Clipboard Copied! IP アドレスと NIC 名を組み合わせたルーター設定の例
# ... ingress: listenAddress: - 10.2.1.100 - 10.2.2.10 - ens3 # ...
# ... ingress: listenAddress: - 10.2.1.100 - 10.2.2.10 - ens3 # ...
Copy to Clipboard Copied! 次のコマンドを実行して、MicroShift サービスを再起動します。
sudo systemctl restart microshift
$ sudo systemctl restart microshift
Copy to Clipboard Copied!
検証
-
設定が適用されていることを確認するには、
ingress.listenAddress
の IP アドレスに到達可能であることを確認してから、これらのロードバランサー IP アドレスのいずれかを宛先とするルートをcurl
で取得します。
3.5. ルートの受付ポリシーの設定
デフォルトでは、MicroShift は複数の namespace 内のルートが同じホスト名を使用することを許可します。ルートのポリシーを設定することで、namespace が異なる同じホスト名をルートが要求しないようにできます。
前提条件
- MicroShift をインストールしている。
-
MicroShift の
config.yaml
ファイルが作成されている。 OpenShift CLI (
oc
) がインストールされている。ヒントMicroShift
config.yaml
ファイルで指定する必要のある設定をすべて同時に完了すると、システムの再起動を最小限に抑えることができます。
手順
異なる namespace 内のルートが同じホスト名を要求しないようにするには、MicroShift
config.yaml
ファイルでnamespaceOwnership
フィールドの値をStrict
に更新します。以下の例を参照してください。config.yaml
ルート受付ポリシーの例# ... ingress: routeAdmissionPolicy: namespaceOwnership: Strict # ...
# ... ingress: routeAdmissionPolicy: namespaceOwnership: Strict
1 # ...
Copy to Clipboard Copied! - 1
- 異なる namespace のルートが同じホストを要求しないようにします。有効な値は
Strict
およびInterNamespaceAllowed
です。カスタマイズされたconfig.yaml
内の値を削除すると、InterNamespaceAllowed
値が自動的に設定されます。
設定を適用するには、次のコマンドを実行して MicroShift サービスを再起動します。
sudo systemctl restart microshift
$ sudo systemctl restart microshift
Copy to Clipboard Copied!
第4章 ネットワークポリシー
4.1. ネットワークポリシーについて
MicroShift でネットワークポリシーがどのように機能し、クラスター内の Pod へのネットワークトラフィックを制限または許可するかを説明します。
4.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: []
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default spec: podSelector: {} ingress: []
Copy to Clipboard Copied! 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
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
Copy to Clipboard Copied! 同じ 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: {}
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-same-namespace spec: podSelector: {} ingress: - from: - podSelector: {}
Copy to Clipboard Copied! 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
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
Copy to Clipboard Copied! 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
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
Copy to Clipboard Copied!
NetworkPolicy
オブジェクトは加算されるものです。つまり、複数の NetworkPolicy
オブジェクトを組み合わせて複雑なネットワーク要件を満すことができます。
たとえば、先の例で定義された NetworkPolicy
オブジェクトの場合、allow-same-namespace
および allow-http-and-https
ポリシーの両方を定義できます。この設定により、role=frontend
ラベルの付いた Pod は各ポリシーで許可されている接続をすべて受け入れることができます。つまり、同じ namespace の Pod からのすべてのポート、およびすべての namespace の Pod からのポート 80
および 443
での接続を受け入れます。
4.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
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
Copy to Clipboard Copied! 以下のポリシーは、上記と同じ 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]}
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]}
Copy to Clipboard Copied! 同じガイドラインが
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
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
Copy to Clipboard Copied! 以下のネットワークポリシーは、上記と同じ 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
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
Copy to Clipboard Copied! この最適化は、複数のセレクターを 1 つのセレクターとして表現する場合に限り適用できます。セレクターが異なるラベルに基づいている場合、この最適化は適用できない可能性があります。その場合は、ネットワークポリシーの最適化に特化して新規ラベルをいくつか適用することを検討してください。
4.1.2.1. OVN-Kubernetes の NetworkPolicy CR と外部 IP
OVN-Kubernetes では、NetworkPolicy
カスタムリソース (CR) によって厳密な分離ルールが適用されます。サービスが外部 IP を使用して公開されている場合、トラフィックを許可するように明示的に設定されていない限り、ネットワークポリシーによって他の namespace からのアクセスがブロックされる可能性があります。
namespace をまたいで外部 IP へのアクセスを許可するには、必要な namespace からの Ingress を明示的に許可し、指定されたサービスポートへのトラフィックが許可されるようにする NetworkPolicy
CR を作成します。必要なポートへのトラフィックを許可しなければ、アクセスが制限される可能性があります。
出力例
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: annotations: name: <policy_name> namespace: openshift-ingress spec: ingress: - ports: - port: 80 protocol: TCP - ports: - port: 443 protocol: TCP - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: <my_namespace> podSelector: {} policyTypes: - Ingress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
annotations:
name: <policy_name>
namespace: openshift-ingress
spec:
ingress:
- ports:
- port: 80
protocol: TCP
- ports:
- port: 443
protocol: TCP
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: <my_namespace>
podSelector: {}
policyTypes:
- Ingress
ここでは、以下のようになります。
<policy_name>
- ポリシーの名前を指定します。
<my_namespace>
- ポリシーがデプロイされる namespace の名前を指定します。
詳細は、「ネットワークポリシーについて」を参照してください。
4.2. ネットワークポリシーの作成
namespace のネットワークポリシーを作成できます。
4.2.1. サンプル NetworkPolicy オブジェクト
以下は、サンプル NetworkPolicy オブジェクトにアノテーションを付けます。
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-27107 spec: podSelector: matchLabels: app: mongodb ingress: - from: - podSelector: matchLabels: app: app ports: - protocol: TCP port: 27017
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-27107
spec:
podSelector:
matchLabels:
app: mongodb
ingress:
- from:
- podSelector:
matchLabels:
app: app
ports:
- protocol: TCP
port: 27017
4.2.2. CLI を使用したネットワークポリシーの作成
クラスターの namespace に許可される Ingress または Egress ネットワークトラフィックを記述する詳細なルールを定義するには、ネットワークポリシーを作成できます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - ネットワークポリシーが適用される namespace で作業している。
手順
ポリシールールを作成します。
<policy_name>.yaml
ファイルを作成します。touch <policy_name>.yaml
$ touch <policy_name>.yaml
Copy to Clipboard Copied! ここでは、以下のようになります。
<policy_name>
- ネットワークポリシーファイル名を指定します。
作成したばかりのファイルで、以下の例のようなネットワークポリシーを定義します。
すべての namespace のすべての Pod から Ingress を拒否します。
これは基本的なポリシーであり、他のネットワークポリシーの設定によって許可されたクロス Pod トラフィック以外のすべてのクロス Pod ネットワーキングをブロックします。
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default spec: podSelector: {} policyTypes: - Ingress ingress: []
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default spec: podSelector: {} policyTypes: - Ingress ingress: []
Copy to Clipboard Copied! 同じ namespace のすべての Pod から Ingress を許可します。
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-same-namespace spec: podSelector: ingress: - from: - podSelector: {}
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-same-namespace spec: podSelector: ingress: - from: - podSelector: {}
Copy to Clipboard Copied! 特定の 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
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
Copy to Clipboard Copied!
ネットワークポリシーオブジェクトを作成するには、以下のコマンドを入力します。
oc apply -f <policy_name>.yaml -n <namespace>
$ oc apply -f <policy_name>.yaml -n <namespace>
Copy to Clipboard Copied! ここでは、以下のようになります。
<policy_name>
- ネットワークポリシーファイル名を指定します。
<namespace>
- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
出力例
networkpolicy.networking.k8s.io/deny-by-default created
networkpolicy.networking.k8s.io/deny-by-default created
Copy to Clipboard Copied!
4.2.3. デフォルトの全拒否ネットワークポリシーの作成
このポリシーは、デプロイされた他のネットワークポリシーの設定によって許可されたネットワークトラフィックと、ホストネットワークを使用する Pod 間のトラフィック以外のすべての Pod 間ネットワークをブロックします。この手順では、my-project
namespace に deny-by-default
ポリシーを適用することにより、強力な拒否ポリシーを強制します。
トラフィック通信を許可する NetworkPolicy
カスタムリソース (CR) を設定しない場合、次のポリシーによってクラスター全体で通信問題が発生する可能性があります。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - ネットワークポリシーが適用される namespace で作業している。
手順
すべての 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: my-project spec: podSelector: {} ingress: []
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default namespace: my-project
1 spec: podSelector: {}
2 ingress: []
3 Copy to Clipboard Copied! 次のコマンドを入力して、ポリシーを適用します。
oc apply -f deny-by-default.yaml
$ oc apply -f deny-by-default.yaml
Copy to Clipboard Copied! 出力例
networkpolicy.networking.k8s.io/deny-by-default created
networkpolicy.networking.k8s.io/deny-by-default created
Copy to Clipboard Copied!
4.2.4. 外部クライアントからのトラフィックを許可するネットワークポリシーの作成
deny-by-default
ポリシーを設定すると、外部クライアントからラベル app=web
を持つ Pod へのトラフィックを許可するポリシーの設定に進むことができます。
firewalld ルールは、NetworkPolicy
が適用される前に実行されます。
この手順に従って、パブリックインターネットから直接、またはロードバランサーを使用して Pod にアクセスすることにより、外部サービスを許可するポリシーを設定します。トラフィックは、ラベル app=web
を持つ Pod にのみ許可されます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - ネットワークポリシーが適用される namespace で作業している。
手順
パブリックインターネットからのトラフィックが直接、またはロードバランサーを使用して 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: - {}
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-allow-external namespace: default spec: policyTypes: - Ingress podSelector: matchLabels: app: web ingress: - {}
Copy to Clipboard Copied! 次のコマンドを入力して、ポリシーを適用します。
oc apply -f web-allow-external.yaml
$ oc apply -f web-allow-external.yaml
Copy to Clipboard Copied! 出力例
networkpolicy.networking.k8s.io/web-allow-external created
networkpolicy.networking.k8s.io/web-allow-external created
Copy to Clipboard Copied!
4.2.5. すべての namespace からアプリケーションへのトラフィックを許可するネットワークポリシーを作成する
この手順に従って、すべての namespace 内のすべての Pod から特定のアプリケーションへのトラフィックを許可するポリシーを設定します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - ネットワークポリシーが適用される namespace で作業している。
手順
すべての 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 policyTypes: - Ingress ingress: - from: - namespaceSelector: {}
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 Copy to Clipboard Copied! 注記デフォルトでは、
namespaceSelector
の指定を省略した場合、namespace は選択されません。つまり、ポリシーは、ネットワークポリシーがデプロイされている namespace からのトラフィックのみを許可します。次のコマンドを入力して、ポリシーを適用します。
oc apply -f web-allow-all-namespaces.yaml
$ oc apply -f web-allow-all-namespaces.yaml
Copy to Clipboard Copied! 出力例
networkpolicy.networking.k8s.io/web-allow-all-namespaces created
networkpolicy.networking.k8s.io/web-allow-all-namespaces created
Copy to Clipboard Copied!
検証
次のコマンドを入力して、
default
namespace で Web サービスを開始します。oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
Copy to Clipboard Copied! 次のコマンドを実行して、
alpine
イメージをsecondary
namespace にデプロイし、シェルを開始します。oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
$ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
Copy to Clipboard Copied! シェルで次のコマンドを実行し、リクエストが許可されていることを確認します。
wget -qO- --timeout=2 http://web.default
# wget -qO- --timeout=2 http://web.default
Copy to Clipboard Copied! 予想される出力
<!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>
<!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>
Copy to Clipboard Copied!
4.2.6. namespace からアプリケーションへのトラフィックを許可するネットワークポリシーの作成
特定の namespace からラベル app=web
を持つ Pod へのトラフィックを許可するポリシーを設定するには、次の手順に従います。以下の場合にこれを行うことができます。
- 運用データベースへのトラフィックを、運用ワークロードがデプロイされている namespace のみに制限します。
- 特定の namespace にデプロイされた監視ツールを有効にして、現在の namespace からメトリクスをスクレイピングします。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - ネットワークポリシーが適用される namespace で作業している。
手順
ラベルが
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 policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: purpose: production
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 Copy to Clipboard Copied! 次のコマンドを入力して、ポリシーを適用します。
oc apply -f web-allow-prod.yaml
$ oc apply -f web-allow-prod.yaml
Copy to Clipboard Copied! 出力例
networkpolicy.networking.k8s.io/web-allow-prod created
networkpolicy.networking.k8s.io/web-allow-prod created
Copy to Clipboard Copied!
検証
次のコマンドを入力して、
default
namespace で Web サービスを開始します。oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
Copy to Clipboard Copied! 次のコマンドを実行して、
prod
namespace を作成します。oc create namespace prod
$ oc create namespace prod
Copy to Clipboard Copied! 次のコマンドを実行して、
prod
namespace にラベルを付けます。oc label namespace/prod purpose=production
$ oc label namespace/prod purpose=production
Copy to Clipboard Copied! 次のコマンドを実行して、
dev
namespace を作成します。oc create namespace dev
$ oc create namespace dev
Copy to Clipboard Copied! 次のコマンドを実行して、
dev
namespace にラベルを付けます。oc label namespace/dev purpose=testing
$ oc label namespace/dev purpose=testing
Copy to Clipboard Copied! 次のコマンドを実行して、
alpine
イメージをdev
namespace にデプロイし、シェルを開始します。oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
$ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
Copy to Clipboard Copied! シェルで次のコマンドを実行し、リクエストがブロックされていることを確認します。
wget -qO- --timeout=2 http://web.default
# wget -qO- --timeout=2 http://web.default
Copy to Clipboard Copied! 予想される出力
wget: download timed out
wget: download timed out
Copy to Clipboard Copied! 次のコマンドを実行して、
alpine
イメージをprod
namespace にデプロイし、シェルを開始します。oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
$ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
Copy to Clipboard Copied! シェルで次のコマンドを実行し、リクエストが許可されていることを確認します。
wget -qO- --timeout=2 http://web.default
# wget -qO- --timeout=2 http://web.default
Copy to Clipboard Copied! 予想される出力
<!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>
<!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>
Copy to Clipboard Copied!
4.3. ネットワークポリシーの編集
namespace の既存のネットワークポリシーを編集できます。通常の編集には、ポリシーが適用される Pod、許可される Ingress トラフィック、トラフィックを受け入れる宛先ポートへの変更が含まれる場合があります。apiVersion
、kind
、および name
フィールドは、リソース自体を定義するためのもので、NetworkPolicy
オブジェクトを編集するときは、これらを変更しないでください。
4.3.1. ネットワークポリシーの編集
namespace のネットワークポリシーを編集できます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - ネットワークポリシーが存在する namespace で作業している。
手順
オプション: namespace のネットワークポリシーオブジェクトをリスト表示するには、以下のコマンドを入力します。
oc get networkpolicy
$ oc get networkpolicy
Copy to Clipboard Copied! ここでは、以下のようになります。
<namespace>
- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
ネットワークポリシーオブジェクトを編集します。
ネットワークポリシーの定義をファイルに保存した場合は、ファイルを編集して必要な変更を加えてから、以下のコマンドを入力します。
oc apply -n <namespace> -f <policy_file>.yaml
$ oc apply -n <namespace> -f <policy_file>.yaml
Copy to Clipboard Copied! ここでは、以下のようになります。
<namespace>
- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
<policy_file>
- ネットワークポリシーを含むファイルの名前を指定します。
ネットワークポリシーオブジェクトを直接更新する必要がある場合、以下のコマンドを入力できます。
oc edit networkpolicy <policy_name> -n <namespace>
$ oc edit networkpolicy <policy_name> -n <namespace>
Copy to Clipboard Copied! ここでは、以下のようになります。
<policy_name>
- ネットワークポリシーの名前を指定します。
<namespace>
- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
ネットワークポリシーオブジェクトが更新されていることを確認します。
oc describe networkpolicy <policy_name> -n <namespace>
$ oc describe networkpolicy <policy_name> -n <namespace>
Copy to Clipboard Copied! ここでは、以下のようになります。
<policy_name>
- ネットワークポリシーの名前を指定します。
<namespace>
- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
4.3.2. サンプル NetworkPolicy オブジェクト
以下は、サンプル NetworkPolicy オブジェクトにアノテーションを付けます。
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-27107 spec: podSelector: matchLabels: app: mongodb ingress: - from: - podSelector: matchLabels: app: app ports: - protocol: TCP port: 27017
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-27107
spec:
podSelector:
matchLabels:
app: mongodb
ingress:
- from:
- podSelector:
matchLabels:
app: app
ports:
- protocol: TCP
port: 27017
4.4. ネットワークポリシーの削除
namespace からネットワークポリシーを削除できます。
4.4.1. CLI を使用したネットワークポリシーの削除
namespace のネットワークポリシーを削除できます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - ネットワークポリシーが存在する namespace で作業している。
手順
ネットワークポリシーオブジェクトを削除するには、以下のコマンドを入力します。
oc delete networkpolicy <policy_name> -n <namespace>
$ oc delete networkpolicy <policy_name> -n <namespace>
Copy to Clipboard Copied! ここでは、以下のようになります。
<policy_name>
- ネットワークポリシーの名前を指定します。
<namespace>
- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
出力例
networkpolicy.networking.k8s.io/default-deny deleted
networkpolicy.networking.k8s.io/default-deny deleted
Copy to Clipboard Copied!
4.5. ネットワークポリシーの表示
namespace のネットワークポリシーを表示するには、次の手順を使用します。
4.5.1. CLI を使用したネットワークポリシーの表示
namespace のネットワークポリシーを検査できます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - ネットワークポリシーが存在する namespace で作業している。
手順
namespace のネットワークポリシーを一覧表示します。
namespace で定義されたネットワークポリシーオブジェクトを表示するには、以下のコマンドを実行します。
oc get networkpolicy
$ oc get networkpolicy
Copy to Clipboard Copied! オプション: 特定のネットワークポリシーを検査するには、以下のコマンドを入力します。
oc describe networkpolicy <policy_name> -n <namespace>
$ oc describe networkpolicy <policy_name> -n <namespace>
Copy to Clipboard Copied! ここでは、以下のようになります。
<policy_name>
- 検査するネットワークポリシーの名前を指定します。
<namespace>
- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
以下に例を示します。
oc describe networkpolicy allow-same-namespace
$ oc describe networkpolicy allow-same-namespace
Copy to Clipboard Copied! 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
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
Copy to Clipboard Copied!
第5章 複数ネットワーク
5.1. 複数ネットワークの使用について
デフォルトの OVN-Kubernetes Container Network Interface (CNI) プラグインに加えて、MicroShift Multus CNI を使用して他の CNI プラグインをチェーンすることもできます。MicroShift Multus のインストールおよび使用はオプションです。
5.1.1. MicroShift の追加ネットワーク
クラスターのインストール中、設定をカスタマイズしない限り、default の Pod ネットワークはデフォルト値で設定されます。デフォルトのネットワークは、クラスターの通常のネットワークトラフィックをすべて処理します。MicroShift Multus CNI プラグインを使用すると、他のネットワークの Pod に追加のインターフェイスを追加できます。これにより、スイッチングやルーティングなどのネットワーク機能を提供する Pod を設定する際に柔軟性が得られます。
5.1.1.1. ネットワーク分離のための追加ネットワークをサポート
MicroShift 4.16 では、次の追加ネットワークがサポートされています。
- Bridge: 同じホスト上の Pod が相互に、またホストと通信できるようにします。
IPVLAN: ホスト上の Pod が他のホストと通信できるようにします。
- これは、MACVLAN ベースの追加ネットワークに似ています。
- MACVLAN ベースの追加ネットワークとは異なり、各 Pod は親物理ネットワークインターフェイスと同じ MAC アドレスを共有します。
- MACVLAN: ホスト上の Pod が物理ネットワークインターフェイスを使用して他のホストや他のホスト上の Pod と通信できるようにします。MACVLAN ベースの追加ネットワークに接続された各 Pod には、一意の MAC アドレスが提供されます。
追加のネットワークに対するネットワークポリシーの設定はサポートされていません。
5.1.1.2. 使用例: ネットワーク分離のための追加ネットワーク
コントロールプレーンとデータプレーンの分離など、ネットワークの分離が必要な状況では、追加のネットワークを使用できます。たとえば、Pod がホスト上のネットワークにアクセスし、エッジにデプロイされたデバイスと通信できるようにする場合は、追加のインターフェイスを設定できます。これらのエッジデバイスは、分離された Operator ネットワーク上にあるか、定期的に切断される可能性があります。
トラフィックの分離は、以下のようなパフォーマンスおよびセキュリティー関連の理由で必要になります。
- パフォーマンス
- 2 つの異なるプレーンでトラフィックを送信して、各プレーンのトラフィック量を管理できます。
- セキュリティー
- 機密トラフィックは、セキュリティー上の考慮に基づいて管理されているネットワークに送信でき、テナントまたはカスタマー間で共有できないプライベートを分離できます。
Multus CNI プラグインは、MicroShift サービスの起動時にデプロイされます。したがって、MicroShift の起動後に microshift-multus
RPM パッケージを追加する場合は、ホストの再起動が必要です。再起動すると、すべてのコンテナーが Multus アノテーション付きで再作成されます。
5.1.1.3. 追加ネットワークの実装方法
クラスターのすべての Pod はクラスター全体のデフォルトネットワークを依然として使用し、クラスター全体での接続性を維持します。すべての Pod には、クラスター全体の Pod ネットワークに割り当てられる eth0
インターフェイスがあります。
-
oc get pod <pod_name> -o=jsonpath='{ .metadata.annotations.k8s\.v1\.cni\.cncf\.io/network-status }'
コマンドを使用して、Pod のインターフェイスを表示できます。 -
MicroShift Multus CNI を使用するネットワークインターフェイスを追加する場合、その名前は
net1
、net2
、…、netN
です。 - CNI 設定は、MicroShift Multus DaemonSet の起動時に作成されます。この設定は自動生成され、デフォルトの委譲であるプライマリー CNI が含まれます。MicroShift の場合、デフォルトの CNI は OVN-Kubernetes です。
5.1.1.4. Pod にセカンダリーネットワークを接続する方法
Pod に追加のネットワークインターフェイスを接続するには、インターフェイスの接続方法を定義する設定を作成して適用する必要があります。
- 使用する追加のネットワークを設定する必要があります。ネットワークにはそれぞれ違いがあるため、デフォルトの設定はありません。
-
NetworkAttachmentDefinition
カスタムリソース (CR) を使用して各インターフェイスを指定するには、YAML マニフェストを適用する必要があります。これらの各 CR 内の設定は、そのインターフェイスがどのように作成されるかを定義します。 CRI-O は Multus を使用するように設定する必要があります。デフォルト設定は
microshift-multus
RPM に含まれています。- Multus CNI が既存の MicroShift インスタンスにインストールされている場合は、ホストを再起動する必要があります。
- Multus CNI が MicroShift と一緒にインストールされている場合は、CR と Pod を追加してから MicroShift サービスを開始できます。このシナリオではホストを再起動する必要はありません。
5.1.1.5. 追加のネットワークタイプの設定
次のセクションでは、追加のネットワークの具体的な設定フィールドを説明します。
5.1.2. 実行中のクラスターへの Multus CNI プラグインのインストール
高性能ネットワーク設定のために Pod に追加のネットワークを接続する場合は、MicroShift Multus RPM パッケージをインストールできます。インストール後、Multus アノテーションを持つすべての Pod を再作成するには、ホストを再起動する必要があります。
Multus CNI プラグインのアンインストールはサポートされていません。
前提条件
- ホストへの root アクセス権限がある。
手順
次のコマンドを実行して、Multus RPM パッケージをインストールします。
sudo dnf install microshift-multus
$ sudo dnf install microshift-multus
Copy to Clipboard Copied! ヒントここで追加のネットワーク用のカスタムリソース (CR) を作成すると、1 回の再起動でインストールを完了し、設定を適用できます。
パッケージマニフェストをアクティブなクラスターに適用するには、次のコマンドを実行してホストを再起動します。
sudo systemctl restart
$ sudo systemctl restart
Copy to Clipboard Copied!
検証
再起動後、次のコマンドを実行して、Multus CNI プラグインコンポーネントが作成されていることを確認します。
oc get pod -A | grep multus
$ oc get pod -A | grep multus
Copy to Clipboard Copied! 出力例
openshift-multus dhcp-daemon-ktzqf 1/1 Running 0 45h openshift-multus multus-4frf4 1/1 Running 0 45h
openshift-multus dhcp-daemon-ktzqf 1/1 Running 0 45h openshift-multus multus-4frf4 1/1 Running 0 45h
Copy to Clipboard Copied!
次のステップ
- まだ行っていない場合は、使用する追加のネットワークを設定して適用します。
- 作成された CR を使用するアプリケーションをデプロイします。
5.1.3. ブリッジネットワークの追加設定
次のオブジェクトは、Bridge CNI プラグインの設定パラメーターを説明します。
フィールド | 型 | 説明 |
---|---|---|
|
|
CNI 仕様のバージョン。値 |
|
|
設定する CNI プラグインの名前: |
|
| IPAM CNI プラグインの設定オブジェクト。プラグインは、アタッチメント定義への IP アドレスの割り当てを管理します。 |
|
|
オプション: 使用する仮想ブリッジの名前を指定します。ブリッジインターフェイスがホストに存在しない場合は、これが作成されます。デフォルト値は |
|
|
オプション: 仮想ネットワークから外すトラフィックの IP マスカレードを有効にするには、 |
|
|
オプション: IP アドレスをブリッジに割り当てるには |
|
|
オプション: ブリッジを仮想ネットワークのデフォルトゲートウェイとして設定するには、 |
|
|
オプション: 仮想ブリッジの事前に割り当てられた IP アドレスの割り当てを許可するには、 |
|
|
オプション: 仮想ブリッジが受信時に使用した仮想ポートでイーサネットフレームを送信できるようにするには、 |
|
|
オプション: ブリッジで無作為検出モード (Promiscuous Mode) を有効にするには、 |
|
| オプション: 最大転送単位 (MTU) を指定された値に設定します。デフォルト値はカーネルによって自動的に設定されます。 |
|
|
オプション: コンテナー側の |
|
|
オプション: MAC スプーフィングチェックを有効にして、コンテナーから発信されるトラフィックをインターフェイスの MAC アドレスに制限します。デフォルト値は |
5.1.3.1. ブリッジ CNI プラグインの設定例
次の例では、MicroShift Multus CNI で使用するために bridge-conf
という名前の追加ネットワークを設定します。
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: bridge-conf spec: config: '{ "cniVersion": "0.4.0", "type": "bridge", "bridge": "test-bridge", "mode": "bridge", "ipam": { "type": "host-local", "ranges": [ [ { "subnet": "10.10.0.0/16", "rangeStart": "10.10.1.20", "rangeEnd": "10.10.3.50", "gateway": "10.10.0.254" } ] ], "dataDir": "/var/lib/cni/test-bridge" } }'
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: bridge-conf
spec:
config: '{
"cniVersion": "0.4.0",
"type": "bridge",
"bridge": "test-bridge",
"mode": "bridge",
"ipam": {
"type": "host-local",
"ranges": [
[
{
"subnet": "10.10.0.0/16",
"rangeStart": "10.10.1.20",
"rangeEnd": "10.10.3.50",
"gateway": "10.10.0.254"
}
]
],
"dataDir": "/var/lib/cni/test-bridge"
}
}'
5.1.4. IPVLAN 追加ネットワークの設定
次のオブジェクトは、IPVLAN、ipvlan
、CNI プラグインの設定パラメーターを示しています。
フィールド | 型 | 説明 |
---|---|---|
|
|
CNI 仕様のバージョン。値 |
|
|
CNO 設定に以前に指定した |
|
|
設定する CNI プラグインの名前: |
|
| IPAM CNI プラグインの設定オブジェクト。プラグインは、アタッチメント定義への IP アドレスの割り当てを管理します。これは、プラグインが連鎖している場合を除き必要です。 |
|
|
オプション: 仮想ネットワークの操作モードを指定します。この値は、 |
|
|
オプション: ネットワーク割り当てに関連付けるイーサネットインターフェイスを指定します。 |
|
| オプション: 最大転送単位 (MTU) を指定された値に設定します。デフォルト値はカーネルによって自動的に設定されます。 |
|
|
オプション: |
-
ipvlan
オブジェクトは、仮想インターフェイスがmaster
インターフェイスと通信することを許可しません。したがって、コンテナーはipvlan
インターフェイスを使用してホストに到達できません。コンテナーが、Precision Time Protocol (PTP
) をサポートするネットワークなど、ホストへの接続を提供するネットワークに参加していることを確認してください。 -
1 つの
master
インターフェイスを、macvlan
とipvlan
の両方を同時に使用するように設定することはできません。 -
インターフェイスに依存できない IP 割り当てスキームの場合、
ipvlan
プラグインは、このロジックを処理する以前のプラグインと連鎖させることができます。master
が省略された場合、前の結果にはスレーブにするipvlan
プラグインのインターフェイス名が 1 つ含まれていなければなりません。ipam
が省略された場合、ipvlan
インターフェイスの設定には前の結果が使用されます。
5.1.4.1. IPVLAN CNI プラグインの設定例
以下の例では、ipvlan-net
という名前の追加のネットワークを設定します。
{ "cniVersion": "0.3.1", "name": "ipvlan-net", "type": "ipvlan", "master": "eth1", "linkInContainer": false, "mode": "l3", "ipam": { "type": "static", "addresses": [ { "address": "192.168.10.10/24" } ] } }
{
"cniVersion": "0.3.1",
"name": "ipvlan-net",
"type": "ipvlan",
"master": "eth1",
"linkInContainer": false,
"mode": "l3",
"ipam": {
"type": "static",
"addresses": [
{
"address": "192.168.10.10/24"
}
]
}
}
5.1.5. MACVLAN 追加ネットワークの設定
以下のオブジェクトは、MAC 仮想 LAN (MACVLAN) Container Network Interface (CNI) プラグインの設定パラメーターについて説明しています。
フィールド | 型 | 説明 |
---|---|---|
|
|
CNI 仕様のバージョン。値 |
|
|
CNO 設定に以前に指定した |
|
|
設定する CNI プラグインの名前: |
|
| IPAM CNI プラグインの設定オブジェクト。プラグインは、アタッチメント定義への IP アドレスの割り当てを管理します。 |
|
|
オプション: 仮想ネットワークのトラフィックの可視性を設定します。 |
|
| オプション: 新しく作成された macvlan インターフェイスに関連付けるホストネットワークインターフェイス。値が指定されていない場合は、デフォルトのルートインターフェイスが使用されます。 |
|
| オプション: 指定された値への最大転送単位 (MTU)。デフォルト値はカーネルによって自動的に設定されます。 |
|
|
オプション: |
プラグイン設定の master
キーを指定する場合は、競合の可能性を回避するために、プライマリーネットワークプラグインに関連付けられているものとは異なる物理ネットワークインターフェイスを使用してください。
5.1.5.1. MACVLAN CNI プラグイン設定の例
以下の例では、macvlan-net
という名前の追加のネットワークを設定します。
{ "cniVersion": "0.3.1", "name": "macvlan-net", "type": "macvlan", "master": "eth1", "linkInContainer": false, "mode": "bridge", "ipam": { "type": "dhcp" } }
{
"cniVersion": "0.3.1",
"name": "macvlan-net",
"type": "macvlan",
"master": "eth1",
"linkInContainer": false,
"mode": "bridge",
"ipam": {
"type": "dhcp"
}
}
5.1.6. 関連情報
5.2. 複数のネットワークの設定と使用
MicroShift Multus Container Network Interface (CNI) をインストールした後、設定を使用して他のネットワークプラグインを使用できます。
5.2.1. IP アドレス管理タイプと追加ネットワーク
IP アドレスは、設定した IP アドレス管理 (IPAM) CNI プラグインを通じて追加のネットワークにプロビジョニングされます。MicroShift でサポートされている IP アドレスのプロビジョニングタイプは host-local
、static
、および dhcp
です。
5.2.1.1. ブリッジインターフェイスの詳細
bridge
タイプのインターフェイスと dhcp
IPAM を使用する場合は、ブリッジネットワークでリッスンする DHCP サーバーが必要です。ファイアウォールを使用している場合は、ネットワークゾーンで DHCP トラフィックを許可するために、firewall-cmd --remove-service=dhcp
コマンドを実行して、firewalld
サービスを設定することも必要です。
5.2.1.2. macvlan インターフェイスの詳細
macvlan
タイプのインターフェイスは、ホストが接続されているネットワークにアクセスします。つまり、dhcp
IPAM プラグインが使用されている場合、インターフェイスがホストネットワーク上の DHCP サーバーから IP アドレスを受信できます。
5.2.1.3. ipvlan インターフェイスの詳細
ipvlan
インターフェイスは、ホストネットワークにも直接アクセスできますが、ホストインターフェイスと MAC アドレスを共有します。共有 MAC アドレスにより、ipvlan
タイプのインターフェイスは、dhcp
プラグインでは使用できません。IPAM プラグインは、ClientID
を使用した DHCP プロトコルをサポートしていません。
5.2.2. 追加ネットワーク用の NetworkAttachmentDefinition の作成
追加のネットワークの NetworkAttachmentDefinition
設定ファイルを作成するには、次の手順に従います。この例では、bridge-type インターフェイスを使用します。また、host-local
IP アドレス管理 (IPAM) を使用するここでのサンプルワークフローを使用して、サポートされているその他の追加ネットワークタイプを設定することもできます。
bridge
と dhcp
IPAM を使用する場合は、ブリッジされたネットワークでリッスンする DHCP サーバーが必要です。ファイアウォールも使用している場合は、ネットワークゾーンで DHCP トラフィックを許可するように firewalld サービスを設定することも必要です。この場合は、firewall-cmd --remove-service=dhcp
コマンドを実行できます。
前提条件
- MicroShift Multus CNI がインストールされている。
-
OpenShift CLI (
oc
) がインストールされている。 - クラスターが実行されている。
手順
オプション: 次のコマンドを実行して、MicroShift クラスターが Multus CNI で実行されていることを確認します。
oc get pods -n openshift-multus
$ oc get pods -n openshift-multus
Copy to Clipboard Copied! 出力例
NAME READY STATUS RESTARTS AGE dhcp-daemon-dfbzw 1/1 Running 0 5h multus-rz8xc 1/1 Running 0 5h
NAME READY STATUS RESTARTS AGE dhcp-daemon-dfbzw 1/1 Running 0 5h multus-rz8xc 1/1 Running 0 5h
Copy to Clipboard Copied! 次のコマンドを実行し、次のサンプルファイルを参照して
NetworkAttachmentDefinition
設定ファイルを作成します。oc apply -f network-attachment-definition.yaml
$ oc apply -f network-attachment-definition.yaml
Copy to Clipboard Copied! NetworkAttachmentDefinition
のファイルの例apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: bridge-conf spec: config: '{ "cniVersion": "0.4.0", "type": "bridge", "bridge": "br-test", "mode": "bridge", "ipam": { "type": "host-local", "ranges": [ [ { "subnet": "10.10.0.0/24", "rangeStart": "10.10.0.20", "rangeEnd": "10.10.0.50", "gateway": "10.10.0.254" } ], [ { "subnet": "fd00:IJKL:MNOP:10::0/64", "rangeStart": "fd00:IJKL:MNOP:10::1", "rangeEnd": "fd00:IJKL:MNOP:10::9" "dataDir": "/var/lib/cni/br-test" } }'
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: bridge-conf spec: config: '{ "cniVersion": "0.4.0", "type": "bridge",
1 "bridge": "br-test",
2 "mode": "bridge", "ipam": { "type": "host-local",
3 "ranges": [ [ { "subnet": "10.10.0.0/24", "rangeStart": "10.10.0.20", "rangeEnd": "10.10.0.50", "gateway": "10.10.0.254" } ], [ { "subnet": "fd00:IJKL:MNOP:10::0/64",
4 "rangeStart": "fd00:IJKL:MNOP:10::1", "rangeEnd": "fd00:IJKL:MNOP:10::9" "dataDir": "/var/lib/cni/br-test" } }'
Copy to Clipboard Copied! 注記ブリッジの名前の使用は、プラグインの
bridge
タイプに固有です。他のプラグインはNetworkAttachmentDefinitions
で異なるフィールドを使用します。たとえば、macvlan
およびipvlan
設定はmaster
を使用して、割り当てるホストインターフェイスを指定します。
5.2.3. Pod の追加ネットワークへの追加
Pod を追加のネットワークに追加できます。Pod が作成されると、追加のネットワークが Pod に接続されます。Pod は、デフォルトネットワークで通常のクラスター関連のネットワークトラフィックを継続的に送信します。
すでに実行中の Pod に追加のネットワークを接続する場合は、Pod を再起動する必要があります。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - クラスターが実行されている。
-
Pod を接続する
NetworkAttachmentDefinition
オブジェクトによって定義されたネットワークが存在します。
手順
Pod
YAML ファイルにアノテーションを追加します。以下のアノテーション形式のいずれかのみを使用できます。カスタマイズせずに追加ネットワークを割り当てるには、以下の形式でアノテーションを追加します。
<network>
を、Pod に関連付ける追加ネットワークの名前に置き換えます。apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] # ...
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]
1 # ...
Copy to Clipboard Copied! - 1
<network>
は、Pod に関連付ける各追加ネットワークの名前に置き換えます。複数の追加ネットワークを指定するには、各ネットワークをコンマで区切ります。コンマの間に空白を入れないでください。同じ追加ネットワークを複数回指定すると、その Pod にはそのネットワークに接続された複数のネットワークインターフェイスが存在することになります。
ブリッジタイプの追加ネットワークのアノテーションの例
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: bridge-conf # ...
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: bridge-conf # ...
Copy to Clipboard Copied! カスタマイズして追加のネットワークを割り当てるには、以下の形式でアノテーションを追加します。
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: |- [ { "name": "<network>", "namespace": "<namespace>", "default-route": ["<default-route>"] } ] # ...
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: |- [ { "name": "<network>",
1 "namespace": "<namespace>",
2 "default-route": ["<default-route>"]
3 } ] # ...
Copy to Clipboard Copied!
Pod
YAML ファイルを作成し、追加のネットワークのNetworkAttachmentDefinition
アノテーションを追加するには、次のコマンドを実行し、サンプル YAML を使用します。oc apply -f ./<test_bridge>.yaml
$ oc apply -f ./<test_bridge>.yaml
1 Copy to Clipboard Copied! - 1
- <test-bridge> を、使用する Pod 名に置き換えます。
出力例
pod/test-bridge created
pod/test-bridge created
Copy to Clipboard Copied! test-bridge
Pod YAML の例apiVersion: v1 kind: Pod metadata: name: test-bridge annotations: k8s.v1.cni.cncf.io/networks: bridge-conf labels: app: test-bridge spec: terminationGracePeriodSeconds: 0 containers: - name: hello-microshift image: quay.io/microshift/busybox:1.36 command: ["/bin/sh"] args: ["-c", "while true; do echo -ne \"HTTP/1.0 200 OK\r\nContent-Length: 16\r\n\r\nHello MicroShift\" | nc -l -p 8080 ; done"] ports: - containerPort: 8080 protocol: TCP securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL runAsNonRoot: true runAsUser: 1001 runAsGroup: 1001 seccompProfile: type: RuntimeDefault
apiVersion: v1 kind: Pod metadata: name: test-bridge annotations: k8s.v1.cni.cncf.io/networks: bridge-conf labels: app: test-bridge spec: terminationGracePeriodSeconds: 0 containers: - name: hello-microshift image: quay.io/microshift/busybox:1.36 command: ["/bin/sh"] args: ["-c", "while true; do echo -ne \"HTTP/1.0 200 OK\r\nContent-Length: 16\r\n\r\nHello MicroShift\" | nc -l -p 8080 ; done"] ports: - containerPort: 8080 protocol: TCP securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL runAsNonRoot: true runAsUser: 1001 runAsGroup: 1001 seccompProfile: type: RuntimeDefault
Copy to Clipboard Copied! NetworkAttachmentDefinition
アノテーションが正しいことを確認します。NetworkAttachmentDefinition
アノテーションの例apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: bridge-conf # ...
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: bridge-conf # ...
Copy to Clipboard Copied! オプション:
NetworkAttachmentDefinition
アノテーションがPod
YAML に存在することを確認するには、<name>
を Pod の名前に置き換えて次のコマンドを実行します。oc get pod <name> -o yaml
$ oc get pod <name> -o yaml
1 Copy to Clipboard Copied! - 1
- <name> を、使用する Pod 名に置き換えます。以下の例では、
test-bridge
が使用されます。
出力例
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: bridge-conf k8s.v1.cni.cncf.io/network-status: |- [{ "name": "ovn-kubernetes", "interface": "eth0", "ips": [ "10.42.0.18" ], "default": true, "dns": {} },{ "name": "bridge-conf", "interface": "net1", "ips": [ "20.2.2.100" ], "mac": "22:2f:60:a5:f8:00", "dns": {} }] name: pod namespace: default spec: # ... status: # ...
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: bridge-conf k8s.v1.cni.cncf.io/network-status: |-
1 [{ "name": "ovn-kubernetes", "interface": "eth0", "ips": [ "10.42.0.18" ], "default": true, "dns": {} },{ "name": "bridge-conf", "interface": "net1", "ips": [ "20.2.2.100" ], "mac": "22:2f:60:a5:f8:00", "dns": {} }] name: pod namespace: default spec: # ... status: # ...
Copy to Clipboard Copied! - 1
k8s.v1.cni.cncf.io/network-status
パラメーターは、オブジェクトの JSON 配列です。各オブジェクトは、Pod に割り当てられる追加のネットワークのステータスを説明します。アノテーションの値はプレーンテキストの値として保存されます。
以下のコマンドを使用して、Pod が実行されていることを確認します。
oc get pod
$ oc get pod
Copy to Clipboard Copied! 出力例
NAME READY STATUS RESTARTS AGE test-bridge 1/1 Running 0 81s
NAME READY STATUS RESTARTS AGE test-bridge 1/1 Running 0 81s
Copy to Clipboard Copied!
5.2.4. 追加のネットワークの設定
NetworkAttachmentDefinition オブジェクトを作成して適用した後、次の例の手順に従って追加のネットワークを設定します。この例では、bridge
タイプの追加ネットワークが使用されます。このワークフローは、他の追加のネットワークタイプにも使用できます。
前提条件
-
NetworkAttachmentDefinition
オブジェクト設定を作成して適用しました。
手順
以下のコマンドを実行して、ブリッジがホストに作成されていることを確認します。
ip a show br-test
$ ip a show br-test
Copy to Clipboard Copied! 出力例
22: br-test: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 96:bf:ca:be:1d:15 brd ff:ff:ff:ff:ff:ff inet6 fe80::34e2:bbff:fed2:31f2/64 scope link valid_lft forever preferred_lft forever
22: br-test: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 96:bf:ca:be:1d:15 brd ff:ff:ff:ff:ff:ff inet6 fe80::34e2:bbff:fed2:31f2/64 scope link valid_lft forever preferred_lft forever
Copy to Clipboard Copied! 次のコマンドを実行して、ブリッジの IP アドレスを設定します。
sudo ip addr add 10.10.0.10/24 dev br-test
$ sudo ip addr add 10.10.0.10/24 dev br-test
Copy to Clipboard Copied! 次のコマンドを実行して、IP アドレス設定がブリッジに追加されたことを確認します。
ip a show br-test
$ ip a show br-test
Copy to Clipboard Copied! 出力例
22: br-test: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 96:bf:ca:be:1d:15 brd ff:ff:ff:ff:ff:ff inet 10.10.0.10/24 scope global br-test valid_lft forever preferred_lft forever inet6 fe80::34e2:bbff:fed2:31f2/64 scope link valid_lft forever preferred_lft forever
22: br-test: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 96:bf:ca:be:1d:15 brd ff:ff:ff:ff:ff:ff inet 10.10.0.10/24 scope global br-test
1 valid_lft forever preferred_lft forever inet6 fe80::34e2:bbff:fed2:31f2/64 scope link valid_lft forever preferred_lft forever
Copy to Clipboard Copied! - 1
- IP アドレスは想定どおりに設定されています。
次のコマンドを実行して、Pod の IP アドレスを確認します。
oc get pod test-bridge --output=jsonpath='{.metadata.annotations.k8s\.v1\.cni\.cncf\.io/network-status}'
$ oc get pod test-bridge --output=jsonpath='{.metadata.annotations.k8s\.v1\.cni\.cncf\.io/network-status}'
Copy to Clipboard Copied! 出力例
[{ "name": "ovn-kubernetes", "interface": "eth0", "ips": [ "10.42.0.17" ], "mac": "0a:58:0a:2a:00:11", "default": true, "dns": {} },{ "name": "default/bridge-conf", "interface": "net1", "ips": [ "10.10.0.20" ], "mac": "82:01:98:e5:0c:b7", "dns": {}
[{ "name": "ovn-kubernetes", "interface": "eth0", "ips": [ "10.42.0.17" ], "mac": "0a:58:0a:2a:00:11", "default": true, "dns": {} },{ "name": "default/bridge-conf",
1 "interface": "net1", "ips": [ "10.10.0.20" ], "mac": "82:01:98:e5:0c:b7", "dns": {}
Copy to Clipboard Copied! - 1
- ブリッジの追加ネットワークは想定どおりに接続されます。
オプション:
oc exec
を使用して Pod にアクセスし、ip
コマンドを使用してそのインターフェイスを確認できます。oc exec -ti test-bridge -- ip a
$ oc exec -ti test-bridge -- ip a
Copy to Clipboard Copied! 出力例
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 0a:58:0a:2a:00:11 brd ff:ff:ff:ff:ff:ff inet 10.42.0.17/24 brd 10.42.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::858:aff:fe2a:11/64 scope link valid_lft forever preferred_lft forever 3: net1@if23: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 82:01:98:e5:0c:b7 brd ff:ff:ff:ff:ff:ff inet 10.10.0.20/24 brd 10.10.0.255 scope global net1 valid_lft forever preferred_lft forever inet6 fe80::8001:98ff:fee5:cb7/64 scope link valid_lft forever preferred_lft forever
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 0a:58:0a:2a:00:11 brd ff:ff:ff:ff:ff:ff inet 10.42.0.17/24 brd 10.42.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::858:aff:fe2a:11/64 scope link valid_lft forever preferred_lft forever 3: net1@if23: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 82:01:98:e5:0c:b7 brd ff:ff:ff:ff:ff:ff inet 10.10.0.20/24 brd 10.10.0.255 scope global net1
1 valid_lft forever preferred_lft forever inet6 fe80::8001:98ff:fee5:cb7/64 scope link valid_lft forever preferred_lft forever
Copy to Clipboard Copied! - 1
- 予想どおり、Pod は
net1 インターフェイス
上の 10.10.0.20 IP アドレスに接続されます。
MicroShift ホストから Pod 内の HTTP サーバーにアクセスして、接続が期待どおりに機能していることを確認します。以下のコマンドを使用します。
curl 10.10.0.20:8080
$ curl 10.10.0.20:8080
Copy to Clipboard Copied! 出力例
Hello MicroShift
Hello MicroShift
Copy to Clipboard Copied!
5.2.5. 追加ネットワークからの Pod の削除
Pod を削除するだけで、追加のネットワークから Pod を削除できます。
前提条件
- 追加のネットワークが Pod に割り当てられている。
-
OpenShift CLI (
oc
) がインストールされている。 - クラスターにログインする。
手順
Pod を削除するには、以下のコマンドを入力します。
oc delete pod <name> -n <namespace>
$ oc delete pod <name> -n <namespace>
Copy to Clipboard Copied! -
<name>
は Pod の名前です。 -
<namespace>
は Pod が含まれる namespace です。
-
5.2.6. Multus ネットワークのトラブルシューティング
複数のネットワークの設定が適切に設定されていない場合、Pod が起動に失敗する可能性があります。次の手順は、いくつかの一般的なシナリオを解決するのに役立ちます。
5.2.6.1. Pod のネットワークを設定できない
Multus CNI プラグインが Pod にネットワークアノテーションを適用できない場合、Pod は起動しません。追加のネットワーク CNI のいずれかが失敗した場合、Pod も起動に失敗する可能性があります。
エラーの例
Warning NoNetworkFound 0s multus cannot find a network-attachment-definitio (asdasd) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io "bad-ref-doesnt-exist" not found
Warning NoNetworkFound 0s multus cannot find a network-attachment-definitio (asdasd) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io "bad-ref-doesnt-exist" not found
この場合、CNI 障害を解決するには次の手順を実行できます。
-
NetworkAttachmentDefinitions
とアノテーションの両方の値を確認します。 - アノテーションを削除して、デフォルトネットワークのみで Pod が正常に作成されたかどうかを確認します。そうでない場合は、Multus 設定以外のネットワークの問題を示している可能性があります。
デバイス管理者の場合は、
kubelet
によって生成されたログに特に注意しながら、crio.service
またはmicroshift.service
ログを確認してください。たとえば、
kubelet
からの以下のエラーは、プライマリー CNI が実行されていないことを示しています。この状況は、Pod が起動していないこと、またはcni_default_network
設定が正しくないことなどの CRI-O の設定ミスが原因で発生する可能性があります。kubelet が生成したエラーの例
Feb 06 13:47:31 dev microshift[1494]: kubelet E0206 13:47:31.163290 1494 pod_workers.go:1298] "Error syncing pod, skipping" err="network is not ready: container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: No CNI configuration file in /etc/cni/net.d/. Has your network provider started?" pod="default/samplepod" podUID="fe0f7f7a-8c47-4488-952b-8abc0d8e2602"
Feb 06 13:47:31 dev microshift[1494]: kubelet E0206 13:47:31.163290 1494 pod_workers.go:1298] "Error syncing pod, skipping" err="network is not ready: container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: No CNI configuration file in /etc/cni/net.d/. Has your network provider started?" pod="default/samplepod" podUID="fe0f7f7a-8c47-4488-952b-8abc0d8e2602"
Copy to Clipboard Copied!
5.2.6.2. 設定ファイルがない
アノテーションが存在しない NetworkAttachmentDefinition
設定 YAML を参照しているため、Pod を作成できない場合があります。この場合、通常次のようなエラーが発生します。
ログの例
cannot find a network-attachment-definition (bad-conf) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io "bad-conf" not found" pod="default/samplepod"`
cannot find a network-attachment-definition (bad-conf) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io "bad-conf" not found" pod="default/samplepod"`
エラー出力の例
"CreatePodSandbox for pod failed" err="rpc error: code = Unknown desc = failed to create pod network sandbox k8s_samplepod_default_5fa13105-1bfb-4c6b-aee7-3437cfb50e25_0(7517818bd8e85f07b551f749c7529be88b4e7daef0dd572d049aa636950c76c6): error adding pod default_samplepod to CNI network \"multus-cni-network\": plugin type=\"multus\" name=\"multus-cni-network\" failed (add): Multus: [default/samplepod/5fa13105-1bfb-4c6b-aee7-3437cfb50e25]: error loading k8s delegates k8s args: TryLoadPodDelegates: error in getting k8s network for pod: GetNetworkDelegates: failed getting the delegate: getKubernetesDelegate: cannot find a network-attachment-definition (bad-conf) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io \"bad-conf\" not found" pod="default/samplepod"
"CreatePodSandbox for pod failed" err="rpc error: code = Unknown desc = failed to create pod network sandbox k8s_samplepod_default_5fa13105-1bfb-4c6b-aee7-3437cfb50e25_0(7517818bd8e85f07b551f749c7529be88b4e7daef0dd572d049aa636950c76c6): error adding pod default_samplepod to CNI network \"multus-cni-network\": plugin type=\"multus\" name=\"multus-cni-network\" failed (add): Multus: [default/samplepod/5fa13105-1bfb-4c6b-aee7-3437cfb50e25]: error loading k8s delegates k8s args: TryLoadPodDelegates: error in getting k8s network for pod: GetNetworkDelegates: failed getting the delegate: getKubernetesDelegate: cannot find a network-attachment-definition (bad-conf) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io \"bad-conf\" not found" pod="default/samplepod"
このエラーを修正するには、NetworkAttachmentDefinitions
YAML を作成し、適用します。
5.2.7. 関連情報
第6章 ルートの設定
クラスター用に MicroShift のルートを設定できます。
6.1. HTTP ベースのルートの作成
ルートを使用すると、公開された URL でアプリケーションをホストできます。これは、アプリケーションのネットワークセキュリティー設定に応じて、セキュリティー保護または保護なしを指定できます。HTTP ベースのルートとは、セキュアではないルートで、基本的な HTTP ルーティングプロトコルを使用してセキュリティー保護されていないアプリケーションポートでサービスを公開します。
次の手順では、hello-microshift
アプリケーションを例として使用して、Web アプリケーションへの単純な HTTP ベースのルートを作成する方法を説明します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - MicroShift クラスターにアクセスできる。
- あるポートを公開する Web アプリケーションと、そのポートでトラフィックをリッスンする TCP エンドポイントがあります。
手順
以下のコマンドを実行して、
hello-microshift
というサービスを作成します。oc expose pod hello-microshift -n $namespace
$ oc expose pod hello-microshift -n $namespace
Copy to Clipboard Copied! 次のコマンドを実行して、
hello-microshift
アプリケーションに対して、安全ではないルートを作成します。oc expose svc/hello-microshift --hostname=microshift.com $namespace
$ oc expose svc/hello-microshift --hostname=microshift.com $namespace
Copy to Clipboard Copied!
検証
以下のコマンドを実行して、
route
リソースが作成されたことを確認します。oc get routes -o yaml <name of resource> -n $namespace
$ oc get routes -o yaml <name of resource> -n $namespace
1 Copy to Clipboard Copied! - 1
- この例では、ルートの名前は
hello-microshift
で、namespace の名前はhello-microshift
です。
上記で作成されたセキュアでないルートの YAML 定義
apiVersion: route.openshift.io/v1 kind: Route metadata: name: hello-microshift namespace: hello-microshift spec: host: microshift.com port: targetPort: 8080 to: kind: Service name: hello-microshift
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: hello-microshift
namespace: hello-microshift
spec:
host: microshift.com
port:
targetPort: 8080
to:
kind: Service
name: hello-microshift
6.2. HTTP Strict Transport Security
HTTP Strict Transport Security (HSTS) ポリシーは、HTTPS トラフィックのみがルートホストで許可されるブラウザークライアントに通知するセキュリティーの拡張機能です。また、HSTS は、HTTP リダイレクトを使用せずに HTTPS トランスポートにシグナルを送ることで Web トラフィックを最適化します。HSTS は Web サイトとの対話を迅速化するのに便利です。
HSTS ポリシーが適用されると、HSTS はサイトから Strict Transport Security ヘッダーを HTTP および HTTPS 応答に追加します。HTTP を HTTPS にリダイレクトするルートで insecureEdgeTerminationPolicy
値を使用できます。HSTS を強制している場合は、要求の送信前にクライアントがすべての要求を HTTP URL から HTTPS に変更するため、リダイレクトの必要がなくなります。
クラスター管理者は、以下を実行するために HSTS を設定できます。
- ルートごとに HSTS を有効にします。
- ルートごとに HSTS を無効にします。
- ドメインごとに HSTS を適用するか、ドメインと組み合わせた namespace ラベルを使用します。
HSTS はセキュアなルート (edge-terminated または re-encrypt) でのみ機能します。この設定は、HTTP またはパススルールートには適していません。
6.3. ルートごとの HTTP Strict Transport Security の有効化
HTTP 厳密なトランスポートセキュリティー (HSTS) は HAProxy テンプレートに実装され、haproxy.router.openshift.io/hsts_header
アノテーションを持つ edge および re-encrypt ルートに適用されます。
前提条件
- クラスターへの root アクセス権限がある。
-
OpenShift CLI (
oc
) がインストールされている。
手順
ルートで HSTS を有効にするには、
haproxy.router.openshift.io/hsts_header
値を edge-terminated または re-encrypt ルートに追加します。これを実行するには、oc annotate
ツールを使用してこれを実行できます。oc annotate route <route_name> -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000;\ includeSubDomains;preload"
$ oc annotate route <route_name> -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000;\
1 includeSubDomains;preload"
Copy to Clipboard Copied! - 1
- この例では、最長期間は
31536000
ミリ秒 (約 8.5 時間) に設定されます。
注記この例では、等号 (
=
) が引用符で囲まれています。これは、annotate コマンドを正しく実行するために必要です。アノテーションで設定されたルートの例
apiVersion: route.openshift.io/v1 kind: Route metadata: annotations: haproxy.router.openshift.io/hsts_header: max-age=31536000;includeSubDomains;preload ... spec: host: def.abc.com tls: termination: "reencrypt" ... wildcardPolicy: "Subdomain"
apiVersion: route.openshift.io/v1 kind: Route metadata: annotations: haproxy.router.openshift.io/hsts_header: max-age=31536000;includeSubDomains;preload
1 2 3 ... spec: host: def.abc.com tls: termination: "reencrypt" ... wildcardPolicy: "Subdomain"
Copy to Clipboard Copied! - 1
- 必須。
max-age
は、HSTS ポリシーが有効な期間 (秒単位) を測定します。0
に設定すると、これはポリシーを無効にします。 - 2
- オプション:
includeSubDomains
は、クライアントに対し、ホストのすべてのサブドメインにホストと同じ HSTS ポリシーを持つ必要があることを指示します。 - 3
- オプション:
max-age
が 0 より大きい場合、preload
をhaproxy.router.openshift.io/hsts_header
に追加し、外部サービスがこのサイトをそれぞれの HSTS プリロードリストに含めることができます。たとえば、Google などのサイトはpreload
が設定されているサイトの一覧を作成します。ブラウザーはこれらのリストを使用し、サイトと対話する前でも HTTPS 経由で通信できるサイトを判別できます。preload
を設定していない場合、ブラウザーはヘッダーを取得するために、HTTPS を介してサイトと少なくとも 1 回対話している必要があります。
6.3.1. ルートごとの HTTP Strict Transport Security の無効化
ルートごとに HSTS (HTTP Strict Transport Security) を無効にするには、ルートアノテーションの max-age
の値を 0
に設定します。
前提条件
- クラスターへの root アクセス権限がある。
-
OpenShift CLI (
oc
) がインストールされている。
手順
HSTS を無効にするには、以下のコマンドを入力してルートアノテーションの
max-age
の値を0
に設定します。oc annotate route <route_name> -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=0"
$ oc annotate route <route_name> -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=0"
Copy to Clipboard Copied! ヒントまたは、以下の YAML を適用して config map を作成できます。
ルートごとに HSTS を無効にする例
metadata: annotations: haproxy.router.openshift.io/hsts_header: max-age=0
metadata: annotations: haproxy.router.openshift.io/hsts_header: max-age=0
Copy to Clipboard Copied! namespace のすべてのルートで HSTS を無効にするには、following コマンドを入力します。
oc annotate route --all -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=0"
$ oc annotate route --all -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=0"
Copy to Clipboard Copied!
検証
すべてのルートのアノテーションをクエリーするには、以下のコマンドを入力します。
oc get route --all-namespaces -o go-template='{{range .items}}{{if .metadata.annotations}}{{$a := index .metadata.annotations "haproxy.router.openshift.io/hsts_header"}}{{$n := .metadata.name}}{{with $a}}Name: {{$n}} HSTS: {{$a}}{{"\n"}}{{else}}{{""}}{{end}}{{end}}{{end}}'
$ oc get route --all-namespaces -o go-template='{{range .items}}{{if .metadata.annotations}}{{$a := index .metadata.annotations "haproxy.router.openshift.io/hsts_header"}}{{$n := .metadata.name}}{{with $a}}Name: {{$n}} HSTS: {{$a}}{{"\n"}}{{else}}{{""}}{{end}}{{end}}{{end}}'
Copy to Clipboard Copied! 出力例
Name: routename HSTS: max-age=0
Name: routename HSTS: max-age=0
Copy to Clipboard Copied!
6.3.2. ドメインごとに HTTP Strict Transport Security の強制
準拠した HSTS ポリシーアノテーションを使用してルートを設定できます。準拠しない HSTS ルートを持つアップグレードされたクラスターを処理するには、ソースでマニフェストを更新し、更新を適用できます。
oc expose route
コマンドまたは oc create route
コマンドを使用して、HSTS を強制するドメインにルートを追加することはできません。このコマンドの API はアノテーションを受け入れないためです。
HSTS は安全でないルート、つまり TLS 以外のルートには適用できません。
前提条件
- クラスターへの root アクセス権限がある。
-
OpenShift CLI (
oc
) がインストールされている。
手順
次の
oc annotate コマンド
を実行して、クラスター内のすべてのルートに HSTS を適用します。oc annotate route --all --all-namespaces --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000;preload;includeSubDomains"
$ oc annotate route --all --all-namespaces --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000;preload;includeSubDomains"
Copy to Clipboard Copied! 次の
oc annotate コマンド
を実行して、特定の namespace 内のすべてのルートに HSTS を適用します。oc annotate route --all -n <my_namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000;preload;includeSubDomains"
$ oc annotate route --all -n <my_namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000;preload;includeSubDomains"
1 Copy to Clipboard Copied! - 1
- _<my_namespace> は、使用する namespace に置き換えます。
検証
以下のコマンドを実行して、すべてのルートで HSTS アノテーションを確認します。
oc get route --all-namespaces -o go-template='{{range .items}}{{if .metadata.annotations}}{{$a := index .metadata.annotations "haproxy.router.openshift.io/hsts_header"}}{{$n := .metadata.name}}{{with $a}}Name: {{$n}} HSTS: {{$a}}{{"\n"}}{{else}}{{""}}{{end}}{{end}}{{end}}'
$ oc get route --all-namespaces -o go-template='{{range .items}}{{if .metadata.annotations}}{{$a := index .metadata.annotations "haproxy.router.openshift.io/hsts_header"}}{{$n := .metadata.name}}{{with $a}}Name: {{$n}} HSTS: {{$a}}{{"\n"}}{{else}}{{""}}{{end}}{{end}}{{end}}'
Copy to Clipboard Copied! 出力例
Name: <_routename_> HSTS: max-age=31536000;preload;includeSubDomains
Name: <_routename_> HSTS: max-age=31536000;preload;includeSubDomains
Copy to Clipboard Copied!
6.4. スループットの問題のトラブルシューティング方法
Red Hat build of MicroShift を使用してデプロイされたアプリケーションによって、特定のサービス間の待機時間が異常に長くなるなど、ネットワークスループットの問題が発生する場合があります。
Pod のログが問題の原因を指摘しない場合は、以下の方法を使用してパフォーマンスの問題を分析します。
ping
またはtcpdump
などのパケットアナライザーを使用して Pod とそのノード間のトラフィックを分析します。たとえば、問題を生じさせる動作を再現している間に各ノードで
tcpdump
ツールを実行 します。両サイトでキャプチャーしたデータを確認し、送信および受信タイムスタンプを比較して Pod への/からのトラフィックの待ち時間を分析します。ノードインターフェイスが他の Pod、ストレージデバイス、またはデータプレーンからのトラフィックで過負荷になると、Red Hat build of MicroShift で遅延が発生する可能性があります。tcpdump -s 0 -i any -w /tmp/dump.pcap host <podip 1> && host <podip 2>
$ tcpdump -s 0 -i any -w /tmp/dump.pcap host <podip 1> && host <podip 2>
1 Copy to Clipboard Copied! - 1
podip
は Pod の IP アドレスです。oc get pod <pod_name> -o wide
コマンドを実行して Pod の IP アドレスを取得します。
tcpdump
は、これらの 2 つの Pod 間のすべてのトラフィックが含まれる/tmp/dump.pcap
のファイルを生成します。ファイルサイズを最小限に抑えるために問題を再現するすぐ前と問題を再現したすぐ後ににアナライザーを実行することが良いでしょう。以下のように ノード間でパケットアナライザーを実行すること もできます (式から SDN を排除する)。tcpdump -s 0 -i any -w /tmp/dump.pcap port 4789
$ tcpdump -s 0 -i any -w /tmp/dump.pcap port 4789
Copy to Clipboard Copied! -
ストリーミングのスループットおよび UDP スループットを測定するために
iperf
などの帯域幅測定ツールを使用します。最初に Pod からツールを実行し、次にノードから実行して、ボトルネックを特定します。
6.5. Cookie の使用によるルートのステートフル性の維持
Red Hat build of MicroShift は、すべてのトラフィックを同じエンドポイントにヒットさせることによりステートフルなアプリケーションのトラフィックを可能にするスティッキーセッションを提供します。ただし、エンドポイント Pod が再起動、スケーリング、または設定の変更などによって終了する場合、このステートフル性はなくなります。
Red Hat build of MicroShift は Cookie を使用してセッションの永続化を設定できます。Ingress Controller はユーザー要求を処理するエンドポイントを選択し、そのセッションの Cookie を作成します。Cookie は要求の応答として戻され、ユーザーは Cookie をセッションの次の要求と共に送り返します。Cookie は Ingress Controller に対し、セッションを処理しているエンドポイントを示し、クライアント要求が Cookie を使用して同じ Pod にルーティングされるようにします。
Cookie は、HTTP トラフィックを表示できないので、パススルールートで設定できません。代わりに、送信元 IP アドレスをベースに数が計算され、バックエンドを判断します。
バックエンドが変わると、トラフィックが間違ったサーバーに転送されてしまい、スティッキーではなくなります。送信元 IP を非表示にするロードバランサーを使用している場合は、すべての接続に同じ番号が設定され、トラフィックは同じ Pod に送られます。
6.5.1. Cookie を使用したルートのアノテーション
ルート用に自動生成されるデフォルト名を上書きするために Cookie 名を設定できます。これにより、ルートトラフィックを受信するアプリケーションが Cookie 名を認識できるようになります。Cookie を削除すると、次の要求でエンドポイントの再選択が強制的に実行される可能性があります。その結果、サーバーがオーバーロードしている場合は、クライアントからの要求を取り除き、それらの再分配を試行します。
手順
指定される cookie 名でルートにアノテーションを付けます。
oc annotate route <route_name> router.openshift.io/cookie_name="<cookie_name>"
$ oc annotate route <route_name> router.openshift.io/cookie_name="<cookie_name>"
Copy to Clipboard Copied! ここでは、以下のようになります。
<route_name>
- ルートの名前を指定します。
<cookie_name>
- cookie の名前を指定します。
たとえば、ルート
my_route
に cookie 名my_cookie
でアノテーションを付けるには、以下を実行します。oc annotate route my_route router.openshift.io/cookie_name="my_cookie"
$ oc annotate route my_route router.openshift.io/cookie_name="my_cookie"
Copy to Clipboard Copied! 変数でルートのホスト名を取得します。
ROUTE_NAME=$(oc get route <route_name> -o jsonpath='{.spec.host}')
$ ROUTE_NAME=$(oc get route <route_name> -o jsonpath='{.spec.host}')
Copy to Clipboard Copied! ここでは、以下のようになります。
<route_name>
- ルートの名前を指定します。
cookie を保存してからルートにアクセスします。
curl $ROUTE_NAME -k -c /tmp/cookie_jar
$ curl $ROUTE_NAME -k -c /tmp/cookie_jar
Copy to Clipboard Copied! ルートに接続する際に、直前のコマンドによって保存される cookie を使用します。
curl $ROUTE_NAME -k -b /tmp/cookie_jar
$ curl $ROUTE_NAME -k -b /tmp/cookie_jar
Copy to Clipboard Copied!
6.6. パスベースのルート
パスベースのルートは、URL に対して比較できるパスコンポーネントを指定します。この場合、ルートのトラフィックは HTTP ベースである必要があります。そのため、それぞれが異なるパスを持つ同じホスト名を使用して複数のルートを提供できます。ルーターは、最も具体的なパスの順に基づいてルートと一致する必要があります。
以下の表は、ルートのサンプルおよびそれらのアクセシビリティーを示しています。
ルート | 比較対象 | アクセス可能 |
---|---|---|
www.example.com/test | www.example.com/test | はい |
www.example.com | いいえ | |
www.example.com/test および www.example.com | www.example.com/test | はい |
www.example.com | はい | |
www.example.com | www.example.com/text | Yes (ルートではなく、ホストで一致) |
www.example.com | はい |
パスが 1 つでセキュリティー保護されていないルート
apiVersion: route.openshift.io/v1 kind: Route metadata: name: route-unsecured spec: host: www.example.com path: "/test" to: kind: Service name: service-name
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: route-unsecured
spec:
host: www.example.com
path: "/test"
to:
kind: Service
name: service-name
- 1
- パスは、パスベースのルートに唯一追加される属性です。
ルーターは TLS を終了させず、要求のコンテンツを読み込みことができないので、パスベースのルーティングは、パススルー TLS を使用する場合には利用できません。
6.7. HTTP ヘッダーの設定
ヘッダーを設定または削除するときに、個別のルートを使用してリクエストヘッダーとレスポンスヘッダーを変更できます。ルートアノテーションを使用して特定のヘッダーを設定することもできます。ヘッダーを設定するさまざまな方法は、連携時に課題となる可能性があります。
ヘッダーを設定または削除できるのは、Route
CR 内のみです。ヘッダーは、追加できません。HTTP ヘッダーに値が設定されている場合、その値は完全である必要があるため、今後追加する必要はありません。X-Forwarded-For ヘッダーなどのヘッダーを追加することが適切な状況では、spec.httpHeaders.actions
の代わりに spec.httpHeaders.forwardedHeaderPolicy
フィールドを使用します。
Route
仕様の例
apiVersion: route.openshift.io/v1 kind: Route # ... spec: httpHeaders: actions: response: - name: X-Frame-Options action: type: Set set: value: SAMEORIGIN
apiVersion: route.openshift.io/v1
kind: Route
# ...
spec:
httpHeaders:
actions:
response:
- name: X-Frame-Options
action:
type: Set
set:
value: SAMEORIGIN
ルートオーバーライド値で定義されたアクションはすべて、ルートアノテーションを使用して設定されます。
6.7.1. 特殊なケースのヘッダー
次のヘッダーは、設定または削除が完全に禁止されているか、特定の状況下で許可されています。
ヘッダー名 | Route 仕様を使用して設定可能かどうか | 不許可の理由 | 別の方法で設定可能かどうか |
---|---|---|---|
| いいえ |
| いいえ |
| はい |
| いいえ |
| いいえ |
|
はい: |
| いいえ | HAProxy が設定する Cookie は、クライアント接続を特定のバックエンドサーバーにマップするセッション追跡に使用されます。これらのヘッダーの設定を許可すると、HAProxy のセッションアフィニティーが妨げられ、HAProxy の Cookie の所有権が制限される可能性があります。 | はい:
* |
6.8. ルート内の HTTP リクエストおよびレスポンスヘッダーの設定または削除
コンプライアンス目的またはその他の理由で、特定の HTTP 要求および応答ヘッダーを設定または削除できます。これらのヘッダーは、Ingress Controller によって提供されるすべてのルート、または特定のルートに対して設定または削除できます。
たとえば、ルートを提供する Ingress Controller によってデフォルトのグローバルな場所が指定されている場合でも、コンテンツが複数の言語で記述されていると、Web アプリケーションが特定のルートの別の場所でコンテンツを提供するように指定できます。
以下の手順では Content-Location HTTP リクエストヘッダーを設定するルートを作成し、アプリケーション (https://app.example.com
) に URL が関連付けられ、https://app.example.com/lang/en-us
のロケーションにダイレクトされるようにします。アプリケーショントラフィックをこの場所にダイレクトすると、特定のルートを使用する場合はすべて、アメリカ英語で記載された Web コンテンツにアクセスすることになります。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - Red Hat build of MicroShift クラスターにプロジェクト管理者としてログインしている。
- あるポートを公開する Web アプリケーションと、そのポートでトラフィックをリッスンする HTTP または TCP エンドポイントがある。
手順
ルート定義を作成し、
app-example-route.yaml
というファイルに保存します。HTTP ヘッダーディレクティブを使用して作成されたルートの YAML 定義
apiVersion: route.openshift.io/v1 kind: Route # ... spec: host: app.example.com tls: termination: edge to: kind: Service name: app-example httpHeaders: actions: response: - name: Content-Location action: type: Set set: value: /lang/en-us
apiVersion: route.openshift.io/v1 kind: Route # ... spec: host: app.example.com tls: termination: edge to: kind: Service name: app-example httpHeaders: actions:
1 response:
2 - name: Content-Location
3 action: type: Set
4 set: value: /lang/en-us
5 Copy to Clipboard Copied! - 1
- HTTP ヘッダーに対して実行するアクションのリスト。
- 2
- 変更するヘッダーのタイプ。この場合は、応答ヘッダーです。
- 3
- 変更するヘッダーの名前。設定または削除できる使用可能なヘッダーのリストは、HTTP ヘッダーの設定 を参照してください。
- 4
- ヘッダーに対して実行されるアクションのタイプ。このフィールドには、
Set
またはDelete
の値を指定できます。 - 5
- HTTP ヘッダーの設定時は、
値
を指定する必要があります。値は、そのヘッダーで使用可能なディレクティブのリストからの文字列 (例:DENY)
にすることも、HAProxy の動的値構文を使用して解釈される動的値にすることもできます。この場合、値はコンテンツの相対位置に設定されます。
新しく作成したルート定義を使用して、既存の Web アプリケーションへのルートを作成します。
oc -n app-example create -f app-example-route.yaml
$ oc -n app-example create -f app-example-route.yaml
Copy to Clipboard Copied!
HTTP リクエストヘッダーの場合、ルート定義で指定されたアクションは、Ingress Controller の HTTP リクエストヘッダーに対して実行されたアクションの後に実行されます。これは、ルート内のこれらのリクエストヘッダーに設定された値が、Ingress Controller に設定された値よりも優先されることを意味します。HTTP ヘッダーの処理順序の詳細は、HTTP ヘッダーの設定 を参照してください。
6.9. Ingress オブジェクトを使用したルートの作成
一部のエコシステムコンポーネントには Ingress リソースとの統合機能がありますが、ルートリソースとは統合しません。このケースに対応するために、Red Hat build of MicroShift は、Ingress オブジェクトが作成されるときに、管理対象ルートオブジェクトを自動的に作成します。これらのルートオブジェクトは、対応する Ingress オブジェクトが削除されると削除されます。
手順
Red Hat build of MicroShift コンソールまたは
oc create
コマンドを実行して Ingress オブジェクトを定義します。Ingress の YAML 定義
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: frontend annotations: route.openshift.io/termination: "reencrypt" route.openshift.io/destination-ca-certificate-secret: secret-ca-cert spec: rules: - host: www.example.com http: paths: - backend: service: name: frontend port: number: 443 path: / pathType: Prefix tls: - hosts: - www.example.com secretName: example-com-tls-certificate
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: frontend annotations: route.openshift.io/termination: "reencrypt"
1 route.openshift.io/destination-ca-certificate-secret: secret-ca-cert
2 spec: rules: - host: www.example.com
3 http: paths: - backend: service: name: frontend port: number: 443 path: / pathType: Prefix tls: - hosts: - www.example.com secretName: example-com-tls-certificate
Copy to Clipboard Copied! - 1
route.openshift.io/termination
アノテーションは、Route
のspec.tls.termination
フィールドを設定するために使用できます。Ingress
にはこのフィールドがありません。許可される値はedge
、passthrough
、およびreencrypt
です。その他のすべての値は警告なしに無視されます。アノテーション値が設定されていない場合は、edge
がデフォルトルートになります。デフォルトのエッジルートを実装するには、TLS 証明書の詳細をテンプレートファイルで定義する必要があります。- 3
Ingress
オブジェクトを操作する場合、ルートを操作する場合とは異なり、明示的なホスト名を指定する必要があります。<host_name>.<cluster_ingress_domain>
構文 (apps.openshiftdemos.com
など) を使用して、*.<cluster_ingress_domain>
ワイルドカード DNS レコードとクラスターのサービング証明書を利用できます。それ以外の場合は、選択したホスト名の DNS レコードがあることを確認する必要があります。route.openshift.io/termination
アノテーションでpassthrough
の値を指定する場合は、仕様でpath
を''
に設定し、pathType
をImplementationSpecific
に設定します。spec: rules: - host: www.example.com http: paths: - path: '' pathType: ImplementationSpecific backend: service: name: frontend port: number: 443
spec: rules: - host: www.example.com http: paths: - path: '' pathType: ImplementationSpecific backend: service: name: frontend port: number: 443
Copy to Clipboard Copied! oc apply -f ingress.yaml
$ oc apply -f ingress.yaml
Copy to Clipboard Copied!
- 2
route.openshift.io/destination-ca-certificate-secret
を Ingress オブジェクトで使用して、カスタム宛先証明書 (CA) でルートを定義できます。アノテーションは、生成されたルートに挿入される kubernetes シークレットsecret-ca-cert
を参照します。-
Ingress オブジェクトから宛先 CA を使用してルートオブジェクトを指定するには、シークレットの
data.tls.crt
指定子に PEM エンコード形式の証明書を使用してkubernetes.io/tls
またはOpaque
タイプのシークレットを作成する必要があります。
-
Ingress オブジェクトから宛先 CA を使用してルートオブジェクトを指定するには、シークレットの
ルートを一覧表示します。
oc get routes
$ oc get routes
Copy to Clipboard Copied! 結果には、
frontend-
で始まる名前の自動生成ルートが含まれます。NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD frontend-gnztq www.example.com frontend 443 reencrypt/Redirect None
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD frontend-gnztq www.example.com frontend 443 reencrypt/Redirect None
Copy to Clipboard Copied! このルートを検査すると、以下のようになります。
自動生成されるルートの YAML 定義
apiVersion: route.openshift.io/v1 kind: Route metadata: name: frontend-gnztq ownerReferences: - apiVersion: networking.k8s.io/v1 controller: true kind: Ingress name: frontend uid: 4e6c59cc-704d-4f44-b390-617d879033b6 spec: host: www.example.com path: / port: targetPort: https tls: certificate: | -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- insecureEdgeTerminationPolicy: Redirect key: | -----BEGIN RSA PRIVATE KEY----- [...] -----END RSA PRIVATE KEY----- termination: reencrypt destinationCACertificate: | -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- to: kind: Service name: frontend
apiVersion: route.openshift.io/v1 kind: Route metadata: name: frontend-gnztq ownerReferences: - apiVersion: networking.k8s.io/v1 controller: true kind: Ingress name: frontend uid: 4e6c59cc-704d-4f44-b390-617d879033b6 spec: host: www.example.com path: / port: targetPort: https tls: certificate: | -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- insecureEdgeTerminationPolicy: Redirect key: | -----BEGIN RSA PRIVATE KEY----- [...] -----END RSA PRIVATE KEY----- termination: reencrypt destinationCACertificate: | -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- to: kind: Service name: frontend
Copy to Clipboard Copied!
6.10. Ingress オブジェクトを介してデフォルトの証明書を使用してルートを作成する
TLS 設定を指定せずに Ingress オブジェクトを作成すると、Red Hat build of MicroShift によって安全でないルートが生成されます。デフォルトの Ingress 証明書を使用してセキュアなエッジ終端ルートを生成する Ingress オブジェクトを作成するには、次のように空の TLS 設定を指定できます。
前提条件
- 公開したいサービスがあります。
-
OpenShift CLI (
oc
) にアクセスできる。
手順
Ingress オブジェクトの YAML ファイルを作成します。この例では、ファイルの名前は
example-ingress.yaml
です。Ingress オブジェクトの YAML 定義
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: frontend ... spec: rules: ... tls: - {}
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: frontend ... spec: rules: ... tls: - {}
1 Copy to Clipboard Copied! - 1
- この正確な構文を使用して、カスタム証明書を指定せずに TLS を指定します。
次のコマンドを実行して、Ingress オブジェクトを作成します。
oc create -f example-ingress.yaml
$ oc create -f example-ingress.yaml
Copy to Clipboard Copied!
検証
次のコマンドを実行して、Red Hat build of MicroShift が Ingress オブジェクトの想定されるルートを作成したことを確認します。
oc get routes -o yaml
$ oc get routes -o yaml
Copy to Clipboard Copied! 出力例
apiVersion: v1 items: - apiVersion: route.openshift.io/v1 kind: Route metadata: name: frontend-j9sdd ... spec: ... tls: insecureEdgeTerminationPolicy: Redirect termination: edge ...
apiVersion: v1 items: - apiVersion: route.openshift.io/v1 kind: Route metadata: name: frontend-j9sdd
1 ... spec: ... tls:
2 insecureEdgeTerminationPolicy: Redirect termination: edge
3 ...
Copy to Clipboard Copied!
6.11. Ingress アノテーションでの宛先 CA 証明書を使用したルート作成
route.openshift.io/destination-ca-certificate-secret
アノテーションを Ingress オブジェクトで使用して、カスタム宛先 CA 証明書でルートを定義できます。
前提条件
- PEM エンコードされたファイルで証明書/キーのペアを持つことができます。ここで、証明書はルートホストに対して有効となっています。
- 証明書チェーンを完了する PEM エンコードされたファイルの別の CA 証明書が必要です。
- PEM エンコードされたファイルの別の宛先 CA 証明書が必要です。
- 公開する必要のあるサービスが必要です。
手順
次のコマンドを入力して、宛先 CA 証明書のシークレットを作成します。
oc create secret generic dest-ca-cert --from-file=tls.crt=<file_path>
$ oc create secret generic dest-ca-cert --from-file=tls.crt=<file_path>
Copy to Clipboard Copied! 以下に例を示します。
oc -n test-ns create secret generic dest-ca-cert --from-file=tls.crt=tls.crt
$ oc -n test-ns create secret generic dest-ca-cert --from-file=tls.crt=tls.crt
Copy to Clipboard Copied! 出力例
secret/dest-ca-cert created
secret/dest-ca-cert created
Copy to Clipboard Copied! route.openshift.io/destination-ca-certificate-secret
を Ingress アノテーションに追加します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: frontend annotations: route.openshift.io/termination: "reencrypt" route.openshift.io/destination-ca-certificate-secret: secret-ca-cert ...
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: frontend annotations: route.openshift.io/termination: "reencrypt" route.openshift.io/destination-ca-certificate-secret: secret-ca-cert
1 ...
Copy to Clipboard Copied! - 1
- アノテーションは kubernetes シークレットを参照します。
このアノテーションで参照されているシークレットは、生成されたルートに挿入されます。
出力例
apiVersion: route.openshift.io/v1 kind: Route metadata: name: frontend annotations: route.openshift.io/termination: reencrypt route.openshift.io/destination-ca-certificate-secret: secret-ca-cert spec: ... tls: insecureEdgeTerminationPolicy: Redirect termination: reencrypt destinationCACertificate: | -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- ...
apiVersion: route.openshift.io/v1 kind: Route metadata: name: frontend annotations: route.openshift.io/termination: reencrypt route.openshift.io/destination-ca-certificate-secret: secret-ca-cert spec: ... tls: insecureEdgeTerminationPolicy: Redirect termination: reencrypt destinationCACertificate: | -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- ...
Copy to Clipboard Copied!
6.12. セキュリティー保護されたルート
セキュアなルートは、複数の TLS 終端タイプを使用してクライアントに証明書を提供できます。OpenShift Container Platform ドキュメントへの次のリンクでは、カスタム証明書を使用して再暗号化、エッジ、およびパススルールートを作成する方法を説明しています。
第7章 ファイアウォールの使用
MicroShift ではファイアウォールは必要ありませんが、ファイアウォールを使用すると、MicroShift API への望ましくないアクセスを防ぐことができます。
7.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 サーバーにアクセスできる必要があります。
7.2. firewalld サービスのインストール
RHEL for Edge を使用している場合は、firewalld をインストールする必要があります。サービスを使用するには、設定を行うだけです。firewalld がない場合で、firewalld を使用したい場合は、次の手順を使用できます。
次の手順を使用して、MicroShift の firewalld
サービスをインストールして実行します。
手順
オプション: 以下のコマンドを実行して、システムで firewalld があるかを確認します。
rpm -q firewalld
$ rpm -q firewalld
Copy to Clipboard Copied! firewalld
サービスがインストールされていない場合は、次のコマンドを実行します。sudo dnf install -y firewalld
$ sudo dnf install -y firewalld
Copy to Clipboard Copied! ファイアウォールを開始するには、次のコマンドを実行します。
sudo systemctl enable firewalld --now
$ sudo systemctl enable firewalld --now
Copy to Clipboard Copied!
7.3. 必要なファイアウォール設定
クラスターネットワークの IP アドレス範囲は、ファイアウォールの設定時に有効にする必要があります。デフォルト値を使用するか、IP アドレス範囲をカスタマイズできます。デフォルトの 10.42.0.0/16
設定からクラスターネットワークの 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
$ sudo firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16
Copy to Clipboard Copied! Red Hat build of MicroShift API などのホストエンドポイントによってバックアップされたサービスへのホストネットワーク Pod アクセスを設定します。
sudo firewall-cmd --permanent --zone=trusted --add-source=169.254.169.1
$ sudo firewall-cmd --permanent --zone=trusted --add-source=169.254.169.1
Copy to Clipboard Copied!
7.4. オプションのポート設定の使用
MicroShift ファイアウォールサービスでは、オプションのポート設定が可能です。
手順
カスタマイズされたポートをファイアウォール設定に追加するには、次のコマンド構文を使用します。
sudo firewall-cmd --permanent --zone=public --add-port=<port number>/<port protocol>
$ sudo firewall-cmd --permanent --zone=public --add-port=<port number>/<port protocol>
Copy to Clipboard Copied! 表7.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
$ sudo firewall-cmd --permanent --zone=public --add-port=6443/tcp
Copy to Clipboard Copied!
MicroShift インスタンスの不要なポートを閉じるには、「ネットワークセキュリティーを強化するために不使用または不要なポートの閉鎖」の手順に従ってください。
7.5. ポートを開くためのサービスの追加
MicroShift インスタンスでは、firewall-cmd
コマンドを使用してポートでサービスを開くことができます。
手順
オプション: 次のコマンドを実行すると、firewalld 内のすべての事前定義サービスを表示できます。
sudo firewall-cmd --get-services
$ sudo firewall-cmd --get-services
Copy to Clipboard Copied! デフォルトのポートで必要なサービスを開くには、次のコマンド例を実行します。
sudo firewall-cmd --add-service=mdns
$ sudo firewall-cmd --add-service=mdns
Copy to Clipboard Copied!
7.6. ファイアウォールを介したネットワークトラフィックの許可
IP アドレス範囲を設定し、Pod からネットワークゲートウェイを通過する内部トラフィックを許可する DNS サーバーを挿入することで、ファイアウォールを通過するネットワークトラフィックを許可できます。
手順
次のコマンドのいずれかを使用して、IP アドレス範囲を設定します。
次のコマンドを実行して、IP アドレス範囲をデフォルト値で設定します。
sudo firewall-offline-cmd --permanent --zone=trusted --add-source=10.42.0.0/16
$ sudo firewall-offline-cmd --permanent --zone=trusted --add-source=10.42.0.0/16
Copy to Clipboard Copied! 次のコマンドを実行して、カスタム値を使用して IP アドレス範囲を設定します。
sudo firewall-offline-cmd --permanent --zone=trusted --add-source=<custom IP range>
$ sudo firewall-offline-cmd --permanent --zone=trusted --add-source=<custom IP range>
Copy to Clipboard Copied!
Pod からの内部トラフィックがネットワークゲートウェイを通過できるようにするには、次のコマンドを実行します。
sudo firewall-offline-cmd --permanent --zone=trusted --add-source=169.254.169.1
$ sudo firewall-offline-cmd --permanent --zone=trusted --add-source=169.254.169.1
Copy to Clipboard Copied!
7.6.1. ファイアウォール設定の適用
ファイアウォール設定を適用するには、手順 1 だけからなる以下の手順を使用します。
手順
- ファイアウォールを介したネットワークアクセスの設定が完了したら、次のコマンドを実行してファイアウォールを再起動し、設定を適用します。
sudo firewall-cmd --reload
$ sudo firewall-cmd --reload
7.7. ファイアウォール設定の確認
ファイアウォールを再起動したら、設定を一覧表示して確認できます。
手順
ポート関連のルールなど、デフォルトのパブリックゾーンに追加されたルールを確認するには、次のコマンドを実行します。
sudo firewall-cmd --list-all
$ sudo firewall-cmd --list-all
Copy to Clipboard Copied! 信頼されたゾーンに追加されたルール (IP 範囲関連のルールなど) を確認するには、次のコマンドを実行します。
sudo firewall-cmd --zone=trusted --list-all
$ sudo firewall-cmd --zone=trusted --list-all
Copy to Clipboard Copied!
7.8. サービスが公開されている場合のファイアウォールポートの概要
MicroShift でサービスを実行すると、firewalld がアクティブになることがよくあります。これにより、ポートへのトラフィックがファイアウォールによってブロックされる可能性があるため、MicroShift 上の特定のサービスが中断される可能性があります。ホストの外部から特定のサービスにアクセスできるようにする場合は、必要なファイアウォールポートが開いていることを確認する必要があります。ポートを開くには、いくつかの方法があります。
NodePort
およびLoadBalancer
タイプのサービスは、OVN-Kubernetes によって自動的に利用可能になります。このような場合、OVN-Kubernetes が iptables ルールを追加して、ノード IP アドレスへのトラフィックが関連するポートに配信されるようにします。これは PREROUTING ルールチェーンを使用して実行されます。トラフィックはローカルホストポートとサービスの firewalld ルールをバイパスするために OVN-K に転送されます。iptables および firewalld は、Red Hat Enterprise Linux (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 サーバーにアクセスできます。
7.10. 既知のファイアウォールの問題
-
ファイアウォールのリロードまたは再起動でトラフィックフローが中断されないようにするには、Red Hat Enterprise Linux (RHEL) を起動する前にファイアウォールコマンドを実行します。MicroShift の CNI ドライバーは、NodePort サービスを使用するトラフィックフローなど、一部のトラフィックフローに対して iptable ルールを使用します。iptable ルールは CNI ドライバーによって生成および挿入されますが、ファイアウォールのリロードまたは再起動時に削除されます。iptable ルールがないと、トラフィックフローが中断されます。MicroShift の実行後にファイアウォールコマンドを実行する必要がある場合は、
openshift-ovn-kubernetes
namespace でovnkube-master
Pod を手動で再起動して、CNI ドライバーによって制御されるルールをリセットします。
第8章 完全に切断されたホストのネットワーク設定
ネットワークのカスタマイズと設定を適用して、完全に切断されたホストで MicroShift を実行する方法を説明します。切断されたホストは、物理か仮想かに関係なく、ネットワーク接続なしで実行される Red Hat Enterprise Linux (RHEL) オペレーティングシステムバージョン 9.0 以降である必要があります。
8.1. 完全に切断されたホスト用のネットワークの準備
完全に切断されたオペレーティングシステムを実行しているデバイス上で MicroShift クラスターを起動して実行するには、次の手順を使用します。MicroShift ホストは、外部ネットワーク接続がない場合、完全に切断されているとみなされます。
通常、これは、サブネットを提供するためのネットワークインターフェイスコントローラー (NIC) がデバイスにアタッチされていないことを意味します。これらの手順は、セットアップ後に NIC が取り外されたホストでも実行できます。キックスタートファイルの %post
フェーズを使用して、NIC を持たないホスト上でこれらの手順を自動化することもできます。
MicroShift ではクラスター通信をサポートするためにネットワークデバイスが必要であるため、切断された環境のネットワークを設定することが必要です。この要件を満たすには、セットアップ中にシステムループバックデバイスに割り当てた "偽" の IP アドレスを使用するように MicroShift ネットワークを設定する必要があります。
8.1.1. 手順の概要
切断されたホストで MicroShift を実行するには、次の手順が必要です。
- ホストの準備
- MicroShift が現在実行中の場合は停止し、サービスがネットワークに加えた変更をクリーンアップします。
- 永続的なホスト名を設定します。
- ループバックインターフェイスに ”偽” の IP アドレスを追加します。
- 偽の IP をローカルネームサーバーとして使用するように DNS を設定します。
-
ホスト名のエントリーを
/etc/hosts
に追加します。
- MicroShift 設定の更新
-
nodeIP
パラメーターを新しいループバック IP アドレスとして定義します。 -
.node.hostnameOverride
パラメーターを永続的なホスト名に設定します。
-
- 変更内容の有効化
- デフォルトの NIC がアタッチされている場合は無効にします。
- ホストまたはデバイスを再起動します。
MicroShift は起動後、クラスター内通信にループバックデバイスを使用して実行されます。
8.2. MicroShift ネットワーク設定をデフォルトに戻す
MicroShift を停止してクリーンアップスクリプトを実行すると、ネットワークのカスタマイズを削除し、ネットワークをデフォルト設定に戻すことができます。
前提条件
- RHEL 9 以降。
- MicroShift 4.14 以降。
- ホスト CLI へのアクセスがある。
手順
次のコマンドを実行して、MicroShift サービスを停止します。
sudo systemctl stop microshift
$ sudo systemctl stop microshift
Copy to Clipboard Copied! 次のコマンドを実行して、
kubepods.slice
systemd ユニットを停止します。sudo systemctl stop kubepods.slice
$ sudo systemctl stop kubepods.slice
Copy to Clipboard Copied! MicroShift は、OVN-K によって加えられたネットワークの変更を元に戻すためのヘルパースクリプトをインストールします。次のコマンドを入力して、クリーンアップスクリプトを実行します。
sudo /usr/bin/microshift-cleanup-data --ovn
$ sudo /usr/bin/microshift-cleanup-data --ovn
Copy to Clipboard Copied!
8.3. 完全に切断されたホストのネットワーク設定
完全に切断されたホスト上で MicroShift を実行するためのネットワークを設定するには、ホストを準備し、ネットワーク設定を更新してから、再起動して新しい設定を適用する必要があります。すべてのコマンドはホスト CLI から実行されます。
前提条件
- RHEL 9 以降。
- MicroShift 4.14 以降。
- ホスト CLI へのアクセスがある。
- MicroShift の実行時に、内部 IP の競合と今後使用される外部 IP の潜在的な競合の両方を回避するために選択された有効な IP アドレス。
- MicroShift ネットワーク設定はデフォルトに設定されています。
次の手順は、デバイスがフィールドにデプロイされた後に MicroShift クラスターへのアクセスが必要ないユースケースを対象としています。ネットワーク接続が削除された後は、リモートクラスターにアクセスできなくなります。
手順
次のコマンドを実行して、偽の IP アドレスをループバックインターフェイスに追加します。
IP="10.44.0.1" sudo nmcli con add type loopback con-name stable-microshift ifname lo ip4 ${IP}/32
$ IP="10.44.0.1"
1 $ sudo nmcli con add type loopback con-name stable-microshift ifname lo ip4 ${IP}/32
Copy to Clipboard Copied! - 1
- この例で使用される偽の IP アドレスは “10.44.0.1” です。
注記MicroShift の内部 IP の競合と今後使用される外部 IP の潜在的な競合の両方を回避できるのであれば、有効な IP はどれでも使用できます。たとえば、MicroShift ノードのサブネットと衝突しない、またはデバイス上の他のサービスによってアクセスされる任意のサブネットを使用することができます。
自動 DNS を無視し、ローカルネームサーバーにリセットするように設定を変更して、ローカルネームサーバーを使用するように DNS インターフェイスを設定します。
次のコマンドを実行して自動 DNS をバイパスします。
sudo nmcli conn modify stable-microshift ipv4.ignore-auto-dns yes
$ sudo nmcli conn modify stable-microshift ipv4.ignore-auto-dns yes
Copy to Clipboard Copied! DNS インターフェイスがローカルネームサーバーを使用するように指示します。
sudo nmcli conn modify stable-microshift ipv4.dns "10.44.1.1"
$ sudo nmcli conn modify stable-microshift ipv4.dns "10.44.1.1"
Copy to Clipboard Copied!
次のコマンドを実行して、デバイスのホスト名を取得します。
NAME="$(hostnamectl hostname)"
$ NAME="$(hostnamectl hostname)"
Copy to Clipboard Copied! 次のコマンドを実行して、
/etc/hosts
ファイルにノードのホスト名のエントリーを追加します。echo "$IP $NAME" | sudo tee -a /etc/hosts >/dev/null
$ echo "$IP $NAME" | sudo tee -a /etc/hosts >/dev/null
Copy to Clipboard Copied! 次の YAML スニペットを
/etc/microshift/config.yaml
に追加して、MicroShift 設定ファイルを更新します。sudo tee /etc/microshift/config.yaml > /dev/null <<EOF node: hostnameOverride: $(echo $NAME) nodeIP: $(echo $IP) EOF
sudo tee /etc/microshift/config.yaml > /dev/null <<EOF node: hostnameOverride: $(echo $NAME) nodeIP: $(echo $IP) EOF
Copy to Clipboard Copied! これで、MicroShift はクラスター通信にループバックデバイスを使用できるようになりました。オフラインで使用するためのデバイスの準備を完了します。
- 現在デバイスに NIC がアタッチされている場合は、デバイスをネットワークから切断します。
- デバイスをシャットダウンし、NIC を切断します。
- オフライン設定を有効にするには、デバイスを再起動します。
次のコマンドを実行して、MicroShift ホストを再起動し、設定の変更を適用します。
sudo systemctl reboot
$ sudo systemctl reboot
1 Copy to Clipboard Copied! - 1
- この手順によりクラスターが再起動されます。検証を実装する前に、greenboot ヘルスチェックによってシステムが正常であると報告されるまで待ちます。
検証
この時点で、MicroShift ホストへのネットワークアクセスは切断されています。ホストターミナルにアクセスできる場合は、ホスト CLI を使用して、クラスターが安定した状態で開始されたことを確認できます。
次のコマンドを入力して、MicroShift クラスターが実行されていることを確認します。
export KUBECONFIG=/var/lib/microshift/resources/kubeadmin/kubeconfig sudo -E oc get pods -A
$ export KUBECONFIG=/var/lib/microshift/resources/kubeadmin/kubeconfig $ sudo -E oc get pods -A
Copy to Clipboard Copied! 出力例
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
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
Copy to Clipboard Copied!