7.5. ネットワーク関連の問題のトラブルシューティング

7.5.1. ネットワークインターフェイスの選択方法

ベアメタルでのインストールや、複数のネットワークインターフェイスコントローラー (NIC) でのインストールの場合に、OpenShift Container Platform が Kubernetes API サーバーとの通信に使用する NIC は、ノードの起動時に systemd で実行される nodeip-configuration.service サービスユニットによって決定されます。nodeip-configuration.service は、デフォルトルートに関連付けられたインターフェイスから 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 アドレスとして使用します。

インストール後にハードウェアまたはネットワークが再設定された場合、またはノード IP がデフォルトルートインターフェイスから取得されないネットワークレイアウトがある場合、再起動後に nodeip-configuration.service サービスが別の NIC を選択する可能性があります。oc get nodes -o wide コマンドの出力の INTERNAL-IP 列を確認して、別の NIC が選択されていることを確認できる場合があります。

別の NIC が選択されているためにネットワーク通信が中断または誤って設定されている場合、次のエラーが表示されることがあります: EtcdCertSignerControllerDegradedNODEIP_HINT 変数を含むヒントファイルを作成して、デフォルトの IP 選択ロジックをオーバーライドできます。詳しくは、オプション: デフォルトのノード IP 選択ロジックのオーバーライドを参照してください。

7.5.1.1. オプション: デフォルトのノード IP 選択ロジックのオーバーライド

デフォルトの IP 選択ロジックをオーバーライドするには、NODEIP_HINT 変数を含むヒントファイルを作成して、デフォルトの IP 選択ロジックをオーバーライドします。ヒントファイルを作成すると、NODEIP_HINT 変数で指定された IP アドレスのサブネット内のインターフェイスから特定のノード IP アドレスを選択できます。

たとえば、ノードに 10.0.0.10/24 のアドレスを持つ eth0192.0.2.5/24 のアドレスを持つ eth1 の 2 つのインターフェイスがあり、デフォルトルートが eth0 (10.0.0.10) を指している場合、ノードの IP アドレスは通常、10.0.0.10 IP アドレスを使用します。

ユーザーは、別のサブネット 192.0.2.0/24 が選択されるように、サブネット内の既知の IP (たとえば、192.0.2.1 などのサブネットゲートウェイ) を指すように NODEIP_HINT 変数を設定できます。その結果、eth1192.0.2.5 IP アドレスがノードに使用されます。

次の手順は、デフォルトのノード IP 選択ロジックをオーバーライドする方法を示しています。

手順

  1. /etc/default/nodeip-configuration ファイルにヒントファイルを追加します。たとえば、以下のようになります。

    NODEIP_HINT=192.0.2.1
    重要
    • 192.0.2.5 など、ノードの正確な IP アドレスをヒントとして使用しないでください。ノードの正確な IP アドレスを使用すると、ヒント IP アドレスを使用するノードが正しく設定できなくなります。
    • ヒントファイル内の IP アドレスは、正しいサブネットを決定するためにのみ使用されます。ヒントファイルに表示されるため、トラフィックを受信しません。
  2. 次のコマンドを実行して、base-64 でエンコードされたコンテンツを生成します。

    $ echo -n 'NODEIP_HINT=192.0.2.1' | base64 -w0

    出力例

    Tk9ERUlQX0hJTlQ9MTkyLjAuMCxxxx==

  3. クラスターをデプロイする前に、master ロールと worker ロールの両方のマシン設定マニフェストを作成して、ヒントを有効にします。

    99-nodeip-hint-master.yaml

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: master
      name: 99-nodeip-hint-master
    spec:
      config:
        ignition:
          version: 3.2.0
        storage:
          files:
          - contents:
              source: data:text/plain;charset=utf-8;base64,<encoded_content> 1
            mode: 0644
            overwrite: true
            path: /etc/default/nodeip-configuration

    1
    <encoded_contents>/etc/default/nodeip-configuration ファイルの base64 でエンコードされたコンテンツに置き換えます (例: Tk9ERUlQX0hJTlQ9MTkyLjAuMCxxxx==)。コンマの後およびエンコードされたコンテンツの前にスペースを入れることはできないことに注意してください。

    99-nodeip-hint-worker.yaml

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
     labels:
       machineconfiguration.openshift.io/role: worker
       name: 99-nodeip-hint-worker
    spec:
     config:
       ignition:
         version: 3.2.0
       storage:
         files:
         - contents:
             source: data:text/plain;charset=utf-8;base64,<encoded_content> 1
           mode: 0644
           overwrite: true
           path: /etc/default/nodeip-configuration

    1
    <encoded_contents>/etc/default/nodeip-configuration ファイルの base64 でエンコードされたコンテンツに置き換えます (例: Tk9ERUlQX0hJTlQ9MTkyLjAuMCxxxx==)。コンマの後およびエンコードされたコンテンツの前にスペースを入れることはできないことに注意してください。
  4. ~/clusterconfigs など、クラスター設定を保存するディレクトリーにマニフェストを保存します。
  5. クラスターのデプロイ

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) がインストールされている。

手順

  1. ノードのデバッグ Pod を起動します。

    $ oc debug node/<node_name>
  2. /host をデバッグシェル内の root ディレクトリーとして設定します。デバッグ Pod は、Pod 内の /host にホストからのルートファイルシステムをマウントします。ルートディレクトリーを /host に変更すると、ホストファイルシステムからのバイナリーを実行できます。

    # chroot /host
  3. OVS モジュールの現在の 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
    ...

  4. 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>offemererrwarninfo、または dbg に設定することで、最後の 2 行を変更します。オフの ログレベルでは、すべてのログメッセージが除外されます。

  5. サービスを再起動します。

    # systemctl daemon-reload
    # systemctl restart ovs-vswitchd

7.5.2.2. Open vSwitch のログレベルの恒久的な設定

Open vSwitch(OVS) のログレベルを長期的に変更する場合は、ログレベルを恒久的に変更することができます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • OpenShift CLI (oc) がインストールされている。

手順

  1. 以下の例のような MachineConfig オブジェクトで、99-change-ovs-loglevel.yaml のようなファイルを作成します。

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: master  1
      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:dbg  2
                  ExecReload=-/usr/bin/ovs-appctl vlog/set syslog:dbg
              name: 20-ovs-vswitchd-restart.conf
            name: ovs-vswitchd.service
    1
    この手順を実行してコントロールプレーンノードを設定した後、手順を繰り返し、ロールを worker に設定してワーカーノードを設定します。
    2
    syslog:<log_level> の値を設定します。ログレベルは offemererrwarninfo、または dbg です。値を off に設定すると、すべてのログメッセージが除外されます。
  2. マシン設定を適用します。

    $ 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> コマンドを使用することです。