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