24.8. Kuryr ネットワークプラグインから OVN-Kubernetes ネットワークプラグインへの移行
Red Hat OpenStack Platform (RHOSP) 上で実行されるクラスターの管理者は、Kuryr SDN ネットワークプラグインから OVN-Kubernetes ネットワークプラグインに移行できます。
OVN-Kubernetes の詳細は、OVN-Kubernetes ネットワークプラグインについて を参照してください。
24.8.1. OVN-Kubernetes ネットワークプロバイダーへの移行
Red Hat OpenStack Platform (RHOSP) 上で実行されるクラスターを OVN-Kubernetes ネットワークプロバイダーに手動で移行できます。
OVN-Kubernetes への移行は一方向のプロセスです。移行中、クラスターは短時間アクセスできなくなります。
24.8.1.1. OVN-Kubernetes ネットワークプロバイダーへの移行についての考慮点
Kubernetes namespace は、Kuryr によって別の RHOSP ネットワーキングサービス (Neutron) サブネットに保持されます。個々の Pod に割り当てられているサブネットと IP アドレスは、移行中には保持されません。
24.8.1.2. 移行プロセスの仕組み
次の表は、ユーザーが実行する手順とクラスターおよび Operator が実行するアクションを関連付けて、移行プロセスをまとめたものです。
ユーザーが開始する手順 | 移行アクティビティー |
---|---|
|
|
|
|
クラスターの各ノードを再起動します。 |
|
Kuryr が管理する残りのリソースをクリーンアップします。 |
|
24.8.2. OVN-Kubernetes ネットワークプラグインへの移行
クラスター管理者は、クラスターのネットワークプラグインを OVN-Kubernetes に変更できます。
移行時に、クラスター内のすべてのノードを再起動する必要があります。クラスターが利用できないため、ワークロードが中断される可能性があります。サービスの中断が許容される場合にのみ移行を実行してください。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。 - etcd データベースの最新のバックアップが利用可能です。
- 各ノードを手動で再起動できます。
- 移行を計画しているクラスターは、エラーがなく、既知の良好な状態にあります。
- Python インタープリターがインストールされている。
-
openstacksdk
Python パッケージがインストールされている。 -
openstack
CLI ツールがインストールされています。 - 基盤となる RHOSP クラウドにアクセスできます。
手順
次のコマンドを実行して、クラスターネットワークの設定をバックアップします。
$ oc get Network.config.openshift.io cluster -o yaml > cluster-kuryr.yaml
CLUSTERID
変数を設定するには、次のコマンドを実行します。$ CLUSTERID=$(oc get infrastructure.config.openshift.io cluster -o=jsonpath='{.status.infrastructureName}')
すべてのノードの移行を準備するには、次のコマンドを実行して、Cluster Network Operator 設定オブジェクトの
migration
フィールドを設定します。$ oc patch Network.operator.openshift.io cluster --type=merge \ --patch '{"spec": {"migration": {"networkType": "OVNKubernetes"}}}'
注記この手順では、OVN-Kubernetes はすぐにデプロイしません。
migration
フィールドを指定すると、新規マシン設定がクラスター内のすべてのノードに適用されるように Machine Config Operator (MCO) がトリガーされます。これにより、OVN-Kubernetes デプロイメント用にクラスターが準備されます。オプション: ネットワークインフラストラクチャー要件に合わせて、OVN-Kubernetes の次の設定をカスタマイズします。
- 最大伝送単位 (MTU)
- Geneve (Generic Network Virtualization Encapsulation) オーバーレイネットワークポート
- OVN-Kubernetes IPv4 内部サブネット
- OVN-Kubernetes IPv6 内部サブネット
これらの設定をカスタマイズするには、次のコマンドを入力してカスタマイズします。
$ oc patch Network.operator.openshift.io cluster --type=merge \ --patch '{ "spec":{ "defaultNetwork":{ "ovnKubernetesConfig":{ "mtu":<mtu>, "genevePort":<port>, "v4InternalSubnet":"<ipv4_subnet>", "v6InternalSubnet":"<ipv6_subnet>" }}}}'
ここでは、以下のようになります。
mtu
-
Geneve オーバーレイネットワークの MTU を指定します。この値は通常は自動的に設定されますが、クラスターにあるノードすべてが同じ MTU を使用しない場合、これを最小のノード MTU 値よりも
100
小さく設定する必要があります。 port
-
Geneve オーバーレイネットワークの UDP ポートを指定します。値が指定されない場合、デフォルトは
6081
になります。このポートは、Kuryr が使用する VXLAN ポートと同じにすることはできません。VXLAN ポートのデフォルト値は4789
です。 ipv4_subnet
-
OVN-Kubernetes による内部使用のための IPv4 アドレス範囲を指定します。IP アドレス範囲が、OpenShift Container Platform インストールで使用される他のサブネットと重複しないようにする必要があります。IP アドレス範囲は、クラスターに追加できるノードの最大数より大きくする必要があります。デフォルト値は
100.64.0.0/16
です。 ipv6_subnet
-
OVN-Kubernetes による内部使用のための IPv6 アドレス範囲を指定します。IP アドレス範囲が、OpenShift Container Platform インストールで使用される他のサブネットと重複しないようにする必要があります。IP アドレス範囲は、クラスターに追加できるノードの最大数より大きくする必要があります。デフォルト値は
fd98::/48
です。
デフォルト値を変更する必要がない場合は、パッチのキーを省略します。
mtu
フィールドを更新するパッチコマンドの例$ oc patch Network.operator.openshift.io cluster --type=merge \ --patch '{ "spec":{ "defaultNetwork":{ "ovnKubernetesConfig":{ "mtu":1200 }}}}'
以下のコマンドを実行してマシン設定プールのステータスを確認します。
$ oc get mcp
MCO は各マシン設定プール内のマシンを更新する際に、各ノードを 1 つずつ再起動します。続行する前に、すべてのノードが更新されるまで待つ必要があります。
正常に更新されたノードには、
UPDATED=true
、UPDATING=false
、DEGRADED=false
のステータスがあります。注記デフォルトでは、MCO は一度にプールごとに 1 台のマシンを更新します。大規模なクラスターは、小規模なクラスターよりも移行に時間がかかります。
ホスト上の新規マシン設定のステータスを確認します。
マシン設定の状態と適用されたマシン設定の名前をリスト表示するには、以下のコマンドを入力します。
$ oc describe node | egrep "hostname|machineconfig"
出力例
kubernetes.io/hostname=master-0 machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b 1 machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b 2 machineconfiguration.openshift.io/reason: machineconfiguration.openshift.io/state: Done
前のステップの出力を確認します。次のステートメントが真である必要があります。
-
machineconfiguration.openshift.io/state
フィールドの値はDone
です。 -
machineconfiguration.openshift.io/currentConfig
フィールドの値は、machineconfiguration.openshift.io/desiredConfig
フィールドの値と等しくなります。
-
マシン設定が正しいことを確認するには、以下のコマンドを入力します。
$ oc get machineconfig <config_name> -o yaml | grep ExecStart
ここでは、以下のようになります。
- <config_name>
machineconfiguration.openshift.io/currentConfig
フィールドからマシン設定の名前を指定します。マシン設定には、systemd 設定に以下の更新を含める必要があります。
出力例
ExecStart=/usr/local/bin/configure-ovs.sh OVNKubernetes
ノードが
NotReady
状態でスタックしている場合は、マシン設定デーモン Pod のログを調査し、エラーがあれば解決します。Pod をリスト表示するには、以下のコマンドを入力します。
$ oc get pod -n openshift-machine-config-operator
出力例
NAME READY STATUS RESTARTS AGE machine-config-controller-75f756f89d-sjp8b 1/1 Running 0 37m machine-config-daemon-5cf4b 2/2 Running 0 43h machine-config-daemon-7wzcd 2/2 Running 0 43h machine-config-daemon-fc946 2/2 Running 0 43h machine-config-daemon-g2v28 2/2 Running 0 43h machine-config-daemon-gcl4f 2/2 Running 0 43h machine-config-daemon-l5tnv 2/2 Running 0 43h machine-config-operator-79d9c55d5-hth92 1/1 Running 0 37m machine-config-server-bsc8h 1/1 Running 0 43h machine-config-server-hklrm 1/1 Running 0 43h machine-config-server-k9rtx 1/1 Running 0 43h
設定デーモン Pod の名前は以下の形式になります。
machine-config-daemon-<seq>
<seq>
値は、ランダムな 5 文字の英数字シーケンスになります。以下のコマンドを入力して、直前の出力に表示される最初のマシン設定デーモン Pod の Pod ログを表示します。
$ oc logs <pod> -n openshift-machine-config-operator
ここでは、以下のようになります。
- <pod>
- マシン設定デーモン Pod の名前を指定します。
- 直前のコマンドの出力で示されるログ内のエラーを解決します。
移行を開始するには、次のいずれかのコマンドを使用して OVN-Kubernetes ネットワークプラグインを設定します。
クラスターネットワークの IP アドレスブロックを変更せずにネットワークプロバイダーを指定するには、以下のコマンドを入力します。
$ oc patch Network.config.openshift.io cluster --type=merge \ --patch '{"spec": {"networkType": "OVNKubernetes"}}'
別のクラスターネットワーク IP アドレスブロックを指定するには、以下のコマンドを入力します。
$ oc patch Network.config.openshift.io cluster \ --type='merge' --patch '{ "spec": { "clusterNetwork": [ { "cidr": "<cidr>", "hostPrefix": "<prefix>" } ] "networkType": "OVNKubernetes" } }'
ここでは、以下のようになります。
- <cidr>
- CIDR ブロックを指定します。
- <prefix>
クラスター内の各ノードに割り当てられる CIDR ブロックのスライスを指定します。
重要移行時に、サービスネットワークのアドレスブロックを変更することはできません。
OVN-Kubernetes ネットワークプロバイダーはこのブロックを内部で使用するため、
100.64.0.0/16
CIDR ブロックと重複する CIDR ブロックは使用できません。
移行を完了するには、クラスター内の各ノードを再起動します。たとえば、以下のような bash スクリプトを使用できます。このスクリプトは、
ssh
を使用して各ホストに接続でき、sudo
がパスワードを要求しないように設定されていることを前提としています。#!/bin/bash for ip in $(oc get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}') do echo "reboot node $ip" ssh -o StrictHostKeyChecking=no core@$ip sudo shutdown -r -t 3 done
注記SSH アクセスが利用できない場合は、
openstack
コマンドを使用できます。$ for name in $(openstack server list --name "${CLUSTERID}*" -f value -c Name); do openstack server reboot "${name}"; done
あるいは、インフラストラクチャープロバイダーの管理ポータルを通じて各ノードを再起動できる場合もあります。それ以外の場合は、適切な機関に問い合わせて、SSH または管理ポータルと OpenStack クライアントを介して仮想マシンにアクセスしてください。
検証
移行が成功したことを確認し、移行リソースを削除します。
ネットワークプラグインが OVN-Kubernetes であることを確認するには、次のコマンドを入力します。
$ oc get network.config/cluster -o jsonpath='{.status.networkType}{"\n"}'
status.networkType
の値はOVNKubernetes
である必要があります。クラスターノードが
Ready
状態にあることを確認するには、以下のコマンドを実行します。$ oc get nodes
Pod がエラー状態ではないことを確認するには、以下のコマンドを入力します。
$ oc get pods --all-namespaces -o wide --sort-by='{.spec.nodeName}'
ノードの Pod がエラー状態にある場合は、そのノードを再起動します。
すべてのクラスター Operator が異常な状態にないことを確認するには、以下のコマンドを入力します。
$ oc get co
すべてのクラスター Operator のステータスは、
AVAILABLE="True"
、PROGRESSING="False"
、DEGRADED="False"
になります。クラスター Operator が利用できないか、そのパフォーマンスが低下する場合には、クラスター Operator のログで詳細を確認します。重要これまでの検証手順のいずれかでエラーが示された場合は、続行しないでください。クリーンアップ中に削除されたファイナライザーが原因で、
Terminating
状態の Pod が発生する場合があります。これらはエラーを示すものではありません。
移行が完了し、クラスターが良好な状態にある場合は、次のコマンドを入力して、CNO 設定オブジェクトから移行設定を削除します。
$ oc patch Network.operator.openshift.io cluster --type=merge \ --patch '{"spec": {"migration": null}}'
24.8.3. 移行後のリソースのクリーンアップ
Kuryr ネットワークプラグインから OVN-Kubernetes ネットワークプラグインに移行した後、Kuryr が以前に作成したリソースをクリーンアップする必要があります。
クリーンアッププロセスは、Python 仮想環境に依存して、使用するパッケージバージョンが Octavia オブジェクトのタグをサポートしていることを確認します。お使いの環境で次が使用されている場合には、仮想環境は必要ありません。
-
openstacksdk
Python パッケージバージョン 0.54.0 -
python-openstackclient
Python パッケージバージョン 5.5.0 -
python-octaviaclient
Python パッケージバージョン 2.3.0
これらの特定のバージョンを使用する場合は、トランクにアクセスできなくなるため、必ずバージョン 9.0.0 より前の python-neutronclient
をプルしてください。
前提条件
-
OpenShift Container Platform CLI (
oc
) をインストールしている。 - Python インタープリターをインストールしている。
-
openstacksdk
Python パッケージがインストールされている。 -
openstack
CLI がインストールされている。 - 基盤となる RHOSP クラウドにアクセスできます。
-
クラスター管理者
ロールを持つユーザーとしてクラスターにアクセスできます。
手順
クリーンアップ Python 仮想環境を作成します。
環境用の一時ディレクトリーを作成します。以下に例を示します。
$ python3 -m venv /tmp/venv
/tmp/venv
ディレクトリーにある仮想環境は、すべてのクリーンアップ例で使用されます。仮想環境に入ります。以下に例を示します。
$ source /tmp/venv/bin/activate
次のコマンドを実行して、仮想環境で
pip
コマンドをアップグレードします。(venv) $ pip install --upgrade pip
次のコマンドを実行して、必要な Python パッケージをインストールします。
(venv) $ pip install openstacksdk==0.54.0 python-openstackclient==5.5.0 python-octaviaclient==2.3.0 'python-neutronclient<9.0.0'
ターミナルで、次のコマンドを実行して、クラスター識別子と Kuryr 識別子に変数を設定します。
cluster ID を設定します。
(venv) $ CLUSTERID=$(oc get infrastructure.config.openshift.io cluster -o=jsonpath='{.status.infrastructureName}')
cluster タグを設定します。
(venv) $ CLUSTERTAG="openshiftClusterID=${CLUSTERID}"
router ID を設定します。
(venv) $ ROUTERID=$(oc get kuryrnetwork -A --no-headers -o custom-columns=":status.routerId"|uniq)
次のコマンドを実行して、指定されたリソースからファイナライザーを削除する Bash 関数を作成します。
(venv) $ function REMFIN { local resource=$1 local finalizer=$2 for res in $(oc get "${resource}" -A --template='{{range $i,$p := .items}}{{ $p.metadata.name }}|{{ $p.metadata.namespace }}{{"\n"}}{{end}}'); do name=${res%%|*} ns=${res##*|} yaml=$(oc get -n "${ns}" "${resource}" "${name}" -o yaml) if echo "${yaml}" | grep -q "${finalizer}"; then echo "${yaml}" | grep -v "${finalizer}" | oc replace -n "${ns}" "${resource}" "${name}" -f - fi done }
この関数は 2 つのパラメーターを受け取ります。最初のパラメーターはリソースの名前で、2 番目のパラメーターは削除するファイナライザーです。指定されたリソースがクラスターから削除され、その定義は、指定されたファイナライザーを除いて、コピーされたデータに置き換えられます。
Kuryr ファイナライザーをサービスから削除するには、次のコマンドを入力します。
(venv) $ REMFIN services kuryr.openstack.org/service-finalizer
Kuryr
service-subnet-gateway-ip
サービスを削除するには、次のコマンドを入力します。(venv) $ if oc get -n openshift-kuryr service service-subnet-gateway-ip &>/dev/null; then oc -n openshift-kuryr delete service service-subnet-gateway-ip fi
タグ付けされたすべての RHOSP ロードバランサーを Octavia から削除するには、次のコマンドを入力します。
(venv) $ for lb in $(openstack loadbalancer list --tags "${CLUSTERTAG}" -f value -c id); do openstack loadbalancer delete --cascade "${lb}" done
すべての
KuryrLoadBalancer
CR から Kuryr ファイナライザーを削除するには、次のコマンドを入力します。(venv) $ REMFIN kuryrloadbalancers.openstack.org kuryr.openstack.org/kuryrloadbalancer-finalizers
openshift-kuryr
namespace を削除するには、次のコマンドを入力します。(venv) $ oc delete namespace openshift-kuryr
Kuryr サービスのサブネットをルーターから削除するには、次のコマンドを入力します。
(venv) $ openstack router remove subnet "${ROUTERID}" "${CLUSTERID}-kuryr-service-subnet"
Kuryr サービスネットワークを削除するには、次のコマンドを入力します。
(venv) $ openstack network delete "${CLUSTERID}-kuryr-service-network"
すべての Pod から Kuryr ファイナライザーを削除するには、次のコマンドを入力します。
(venv) $ REMFIN pods kuryr.openstack.org/pod-finalizer
すべての
KuryrPort
CR から Kuryr ファイナライザーを削除するには、次のコマンドを入力します。(venv) $ REMFIN kuryrports.openstack.org kuryr.openstack.org/kuryrport-finalizer
このコマンドは
KuryrPort
CR を削除します。Kuryr ファイナライザーをネットワークポリシーから削除するには、次のコマンドを入力します。
(venv) $ REMFIN networkpolicy kuryr.openstack.org/networkpolicy-finalizer
残りのネットワークポリシーから Kuryr ファイナライザーを削除するには、次のコマンドを入力します。
(venv) $ REMFIN kuryrnetworkpolicies.openstack.org kuryr.openstack.org/networkpolicy-finalizer
Kuryr が作成したサブポートをトランクから削除するには、次のコマンドを入力します。
(venv) $ mapfile trunks < <(python -c "import openstack; n = openstack.connect().network; print('\n'.join([x.id for x in n.trunks(any_tags='$CLUSTERTAG')]))") && \ i=0 && \ for trunk in "${trunks[@]}"; do trunk=$(echo "$trunk"|tr -d '\n') i=$((i+1)) echo "Processing trunk $trunk, ${i}/${#trunks[@]}." subports=() for subport in $(python -c "import openstack; n = openstack.connect().network; print(' '.join([x['port_id'] for x in n.get_trunk('$trunk').sub_ports if '$CLUSTERTAG' in n.get_port(x['port_id']).tags]))"); do subports+=("$subport"); done args=() for sub in "${subports[@]}" ; do args+=("--subport $sub") done if [ ${#args[@]} -gt 0 ]; then openstack network trunk unset ${args[*]} "${trunk}" fi done
KuryrNetwork
CR からすべてのネットワークとサブネットを取得し、ポート、ルーターインターフェイス、およびネットワーク自体を削除するには、次のコマンドを入力します。(venv) $ mapfile -t kuryrnetworks < <(oc get kuryrnetwork -A --template='{{range $i,$p := .items}}{{ $p.status.netId }}|{{ $p.status.subnetId }}{{"\n"}}{{end}}') && \ i=0 && \ for kn in "${kuryrnetworks[@]}"; do i=$((i+1)) netID=${kn%%|*} subnetID=${kn##*|} echo "Processing network $netID, ${i}/${#kuryrnetworks[@]}" # Remove all ports from the network. for port in $(python -c "import openstack; n = openstack.connect().network; print(' '.join([x.id for x in n.ports(network_id='$netID') if x.device_owner != 'network:router_interface']))"); do ( openstack port delete "${port}" ) & # Only allow 20 jobs in parallel. if [[ $(jobs -r -p | wc -l) -ge 20 ]]; then wait -n fi done wait # Remove the subnet from the router. openstack router remove subnet "${ROUTERID}" "${subnetID}" # Remove the network. openstack network delete "${netID}" done
Kuryr セキュリティーグループを削除するには、次のコマンドを入力します。
(venv) $ openstack security group delete "${CLUSTERID}-kuryr-pods-security-group"
すべてのタグ付きサブネットプールを削除するには、次のコマンドを入力します。
(venv) $ for subnetpool in $(openstack subnet pool list --tags "${CLUSTERTAG}" -f value -c ID); do openstack subnet pool delete "${subnetpool}" done
KuryrNetwork
CR に基づくすべてのネットワークが削除されたことを確認するには、次のコマンドを入力します。(venv) $ networks=$(oc get kuryrnetwork -A --no-headers -o custom-columns=":status.netId") && \ for existingNet in $(openstack network list --tags "${CLUSTERTAG}" -f value -c ID); do if [[ $networks =~ $existingNet ]]; then echo "Network still exists: $existingNet" fi done
コマンドによって既存のネットワークが返された場合は、続行する前にそれらを調査して削除してください。
ネットワークポリシーに関連するセキュリティーグループを削除するには、次のコマンドを入力します。
(venv) $ for sgid in $(openstack security group list -f value -c ID -c Description | grep 'Kuryr-Kubernetes Network Policy' | cut -f 1 -d ' '); do openstack security group delete "${sgid}" done
KuryrNetwork
CR からファイナライザーを削除するには、次のコマンドを入力します。(venv) $ REMFIN kuryrnetworks.openstack.org kuryrnetwork.finalizers.kuryr.openstack.org
Kuryr ルーターを削除するには、次のコマンドを入力します。
(venv) $ if python3 -c "import sys; import openstack; n = openstack.connect().network; r = n.get_router('$ROUTERID'); sys.exit(0) if r.description != 'Created By OpenShift Installer' else sys.exit(1)"; then openstack router delete "${ROUTERID}" fi
24.8.4. 関連情報
- OVN-Kubernetes ネットワークプラグインの設定パラメーター
- etcd のバックアップ
- ネットワークポリシーについて
OVN-Kubernetes 機能の詳細は、以下を参照してください。