ワーカー・ノードに NetworkUnavailable エラーが表示されるのはなぜですか?

Calico ノードの正常性に関する問題やネットワークの問題のトラブルシューティングを行います。

仮想プライベートクラウド クラシック・インフラストラクチャー Satellite

マスター・ノードまたはワーカー・ノードを更新すると、ワーカー・ノードは Node network unavailable 状態になります。

calico-node ポッドがシャットダウンされるたびに、ワーカー・ノードが NetworkUnavailable 状態または Node network unavailable 状態になる場合があります。 これは、 Calico パッチの更新中に発生する可能性がありますが、アプリケーションの可用性に影響を与えることはありません。

Calico が更新されると、 node.kubernetes.io/network-unavailable:NoSchedule テイントがワーカー・ノードに追加され、 Node network unavailable 条件が True になります。 これらの条件は両方とも、 Calico の再始動時にクリアされます。通常は数秒しかかかりません。

その際、以下の例のようなエラーメッセージが表示されることがあります。

[Kubernetes] Node network unavailable is Triggered on kubernetes.node.name = 10.184.XXX.XXX
[Kubernetes] Node network unavailable is Triggered on kubernetes.node.name = 10.184.XXX.XXX
[Kubernetes] Node network unavailable is Triggered on kubernetes.node.name = 10.184.XXX.XXX

場合によっては、再始動に時間がかかることがあります。 ほとんどすべての場合、ワーカー・ノードのネットワークの問題を回避するには、再始動の速度が十分です。 ただし、 Calico の再始動が遅延し、ネットワークの中断が発生する可能性がある場合があります。 このような場合、ノードのネットワーク使用不可のテイントと条件は、 Calico とノードが修正されるまで新しいアプリが新しいノードにデプロイされないように設計されています。 Calico の更新は、ノード問題が発生した場合のアプリケーション全体への影響を最小限に抑えるために、非常に制御された方法でロールアウトされます。

Node network unavailable の状態をモニターする。 IBM Cloud Monitoring

サービスを使用して IBM Cloud Monitoringなどのアプリケーションをモニターすることにより、ワーカー・ノードが Node network unavailable 状態になったときのアラートを構成し、そのたびにカウントすることができます。 また、しきい値を構成し、アラートをチューニングして、ルーチン Calico パッチの適用中にワーカー・ノードが Node network unavailable 状態になったときに使用できるようにすることもできます。

IBM Cloud Monitoring アラートをセットアップする際には、以下のシナリオを考慮してください。

  • calico-node ポッドが Running 状態を達成できず、そのコンテナー再始動カウントが増え続ける場合、 Node network unavailable アラートが問題になる可能性があります。
  • ワーカー・ノードは、長時間 Node network unavailable 状態のままです。

ワーカーの更新または置換後も、 calico-node ポッドが Red Hat OpenShift VPC クラスター上で始動しないことがあります。 calico_node ポッドが、 Red Hat OpenShift VPC クラスターで開始できない状態でスタックする場合があります。 これは、IKS クラスターまたはクラシック・クラスターでは問題になりません。 これは、 sysdig-admission-controller-webhook がインストールされていて、ワーカーの更新または置換を試行した場合に発生する可能性があります。 これは以下の理由で起こります。

  1. VPN クライアント・ポッドは、開始時に新しいワーカーに移動されます。
  2. 新しいワーカーの calico-node は始動しますが、 apiserver 呼び出しを行うためにスタックし、2 秒後にタイムアウトになります。
  3. その後、 apiserver 呼び出しは、VPN クライアント・ポッドが新規ノードで開始しようとしたために失敗した Webhook の呼び出しを試行します。 calico-node がまだ始動していないため、VPN ノードは正常に始動できません。

要約すると、 calico-node ポッドの始動は Web フックの動作に依存し、Web フックは VPN クライアント・ポッドに依存し、VPN クライアント・ポッドは calico-node の始動に依存します。 システムが循環依存関係でスタックしています。 正常にデプロイされた calico-node ポッドからログを収集できる場合は、以下のようなエラーが表示されることがあります。

2022-09-08 07:13:19.719 [WARNING][9] startup/utils.go 228: Failed to set NetworkUnavailable; will retry error=Patch "https://172.21.0.1:443/api/v1/nodes/10.242.64.17/status?timeout=2s": net/http: request canceled (Client.Timeout exceeded while awaiting headers)

calico-node の回避策

以下のいずれかの方法を使用して、問題を回避し、 calico-node ポッドを再度実行することができます。

  1. システムから sysdig-admission-controller-webhook を取り外します。
  2. sysdig-admission-controller-webhook を変更し、タイムアウトを 2 秒未満に変更します。
  3. sysdig-admission-controller-webhook を変更して適切な名前空間にスコープを設定し、 calico-system などのシステムにとって重要な名前空間を使用しないようにします。
  4. 新規ノードを閉鎖しますが、ドレーンはしません。 VPN ポッドを削除し、別のワーカーで開始するまで待ちます。 ノードの電源を外します。

上記のいずれかの回避策を実行した後、 calico-node ポッドを正常に開始できます。