7.5. ネットワーク関連の問題のトラブルシューティング
7.5.1. ネットワークインターフェイスの選択方法 リンクのコピーリンクがクリップボードにコピーされました!
ベアメタルでのインストールや、複数のネットワークインターフェイスコントローラー (NIC) でのインストールの場合に、OpenShift Container Platform が Kubernetes API サーバーとの通信に使用する NIC は、ノードの起動時に systemd で実行される nodeip-configuration.service サービスユニットによって決定されます。このサービスは、ノード上のネットワークインターフェイスと、OpenShift Container Platform の通信用に選択された API サーバー向けに IP アドレスをホストできるサブネットで設定された最初のネットワークインターフェイスを使用して反復していきます。
nodeip-configuration.service サービスが正しい NIC を決定すると、このサービスは /etc/systemd/system/kubelet.service.d/20-nodenet.conf ファイルを作成します。20-nodenet.conf ファイルは、KUBELET_NODE_IP 環境変数を、サービスが選択した IP アドレスに設定します。
kubelet サービスの起動時に、20-nodenet.conf ファイルから環境変数の値を読み取り、IP アドレスを --node-ip kubelet コマンドライン引数に設定します。その結果、kubelet サービスは選択した IP アドレスをノード IP アドレスとして使用します。
インストール後にハードウェアまたはネットワークを再設定する場合は、リブート後に nodeip-configuration.service サービスは別の NIC を選択できます。oc get nodes -o wide コマンドの出力の INTERNAL-IP 列を確認して、別の NIC が選択されていることを確認できる場合があります。
別の NIC が選択されているため、ネットワーク通信が中断されたり、誤って設定されていたりする場合は、選択プロセスを上書きする 1 つのストラテジーで、正しい IP アドレスを明示的に設定します。次のリストでは、ハイレベルの手順と考慮事項を特定します。
-
OpenShift Container Platform 通信に使用する IP アドレスを決定するシェルスクリプトを作成します。スクリプトにより、
/etc/systemd/system/kubelet.service.d/98-nodenet-override.confなどのカスタムユニットファイルが作成されます。カスタムユニットファイル98-nodenet-override.confを使用してKUBELET_NODE_IP環境変数を IP アドレスに設定します。 -
/etc/systemd/system/kubelet.service.d/20-nodenet.confファイルは上書きしないでください。同じディレクトリーパス内の98-nodenet-override.confなど、数値の高い値を使用してファイル名を指定します。これは、20-nodenet.confの後にカスタムユニットファイルを実行して、環境変数の値を上書きすることが目的です。 -
シェルスクリプトで base64 でエンコードされた文字列として作成し、Machine Config Operator を使用してスクリプトをファイルシステムパス (
/usr/local/bin/override-node-ip.shなど) にデプロイします。 -
シェルスクリプトの実行後に
systemctl daemon-reloadが実行されることを確認します。最も簡単な方法として、以下の例のように、マシン設定でExecStart=systemctl daemon-reloadを指定します。
kubelet のネットワークインターフェイスを上書きするマシン設定の例
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
labels:
machineconfiguration.openshift.io/role: worker
name: 98-nodenet-override
spec:
config:
ignition:
version: 3.2.0
storage:
files:
- contents:
source: data:text/plain;charset=utf-8;base64,<encoded_script>
mode: 0755
overwrite: true
path: /usr/local/bin/override-node-ip.sh
systemd:
units:
- contents: |
[Unit]
Description=Override node IP detection
Wants=network-online.target
Before=kubelet.service
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/override-node-ip.sh
ExecStart=systemctl daemon-reload
[Install]
WantedBy=multi-user.target
enabled: true
name: nodenet-override.service
7.5.2. Open vSwitch の問題のトラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
Open vSwitch(OVS) の問題をトラブルシューティングするためには、より多くの情報を含むようにログレベルを設定する必要があるかもしれません。
ノードのログレベルを一時的に変更した場合、次の例のようにノード上のマシン設定デーモンからログメッセージを受信することがあるので注意が必要です。
E0514 12:47:17.998892 2281 daemon.go:1350] content mismatch for file /etc/systemd/system/ovs-vswitchd.service: [Unit]
不一致に関連するログメッセージを回避するには、トラブルシューティングが完了した後に、ログレベルの変更を元に戻してください。
7.5.2.1. Open vSwitch のログレベルの一時的な設定 リンクのコピーリンクがクリップボードにコピーされました!
短期間のトラブルシューティングのために、Open vSwitch(OVS) のログレベルを一時的に設定することができます。以下の手順では、ノードを再起動する必要はありません。また、ノードを再起動した場合、設定の変更は保持されません。
この手順を実行してログレベルを変更した後、ovs-vswitchd.service のコンテンツの不一致を示すログメッセージをマシン設定デーモンから受け取ることがあります。ログメッセージが表示されないようにするには、この手順を繰り返し、ログレベルを元の値に設定してください。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
手順
ノードのデバッグ Pod を起動します。
$ oc debug node/<node_name>/hostをデバッグシェル内の root ディレクトリーとして設定します。デバッグ Pod は、Pod 内の/hostにホストからのルートファイルシステムをマウントします。ルートディレクトリーを/hostに変更すると、ホストファイルシステムからのバイナリーを実行できます。# chroot /hostOVS モジュールの現在の syslog レベルを表示します。
# ovs-appctl vlog/list次の出力例では、syslog のログレベルが
infoに設定されています。出力例
console syslog file ------- ------ ------ backtrace OFF INFO INFO bfd OFF INFO INFO bond OFF INFO INFO bridge OFF INFO INFO bundle OFF INFO INFO bundles OFF INFO INFO cfm OFF INFO INFO collectors OFF INFO INFO command_line OFF INFO INFO connmgr OFF INFO INFO conntrack OFF INFO INFO conntrack_tp OFF INFO INFO coverage OFF INFO INFO ct_dpif OFF INFO INFO daemon OFF INFO INFO daemon_unix OFF INFO INFO dns_resolve OFF INFO INFO dpdk OFF INFO INFO ...etc/systemd/system/ovs-vswitchd.service.d/10-ovs-vswitchd-restart.confファイルでログレベルを指定します。Restart=always ExecStartPre=-/bin/sh -c '/usr/bin/chown -R :$${OVS_USER_ID##*:} /var/lib/openvswitch' ExecStartPre=-/bin/sh -c '/usr/bin/chown -R :$${OVS_USER_ID##*:} /etc/openvswitch' ExecStartPre=-/bin/sh -c '/usr/bin/chown -R :$${OVS_USER_ID##*:} /run/openvswitch' ExecStartPost=-/usr/bin/ovs-appctl vlog/set syslog:dbg ExecReload=-/usr/bin/ovs-appctl vlog/set syslog:dbg前述の例では、ログレベルは
dbgに設定されています。syslog:<log_level>をoff、emer、err、warn、info、またはdbgに設定することで、最後の 2 行を変更します。オフのログレベルでは、すべてのログメッセージが除外されます。サービスを再起動します。
# systemctl daemon-reload# systemctl restart ovs-vswitchd
7.5.2.2. Open vSwitch のログレベルの恒久的な設定 リンクのコピーリンクがクリップボードにコピーされました!
Open vSwitch(OVS) のログレベルを長期的に変更する場合は、ログレベルを恒久的に変更することができます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
手順
以下の例のような
MachineConfigオブジェクトで、99-change-ovs-loglevel.yamlのようなファイルを作成します。apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master1 name: 99-change-ovs-loglevel spec: config: ignition: version: 3.2.0 systemd: units: - dropins: - contents: | [Service] ExecStartPost=-/usr/bin/ovs-appctl vlog/set syslog:dbg2 ExecReload=-/usr/bin/ovs-appctl vlog/set syslog:dbg name: 20-ovs-vswitchd-restart.conf name: ovs-vswitchd.serviceマシン設定を適用します。
$ oc apply -f 99-change-ovs-loglevel.yaml
7.5.2.3. Open vSwitch のログの表示 リンクのコピーリンクがクリップボードにコピーされました!
Open vSwitch(OVS) のログを表示するには、以下の手順で行います。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
手順
以下のコマンドのいずれかを実行します。
クラスター外から
ocコマンドを使用してログを表示する。$ oc adm node-logs <node_name> -u ovs-vswitchdクラスター内のノードにログオンした後にログを表示する。
# journalctl -b -f -u ovs-vswitchd.serviceノードにログオンする 1 つの方法は、
oc debug node/<node_name>コマンドを使用することです。