特定のノードのポッドはインターネットにアクセスできません

特定のノードのポッドはインターネットにアクセスできません

特定のノード (mynode と呼びます) 内のポッドはインターネットにアクセスできませんが、他のノードでスケジュールされている残りのポッドはインターネットにアクセスできます。

mynode はインターネットにアクセスでき、SSH で接続できます。スタンドアロンの Docker コンテナーを起動することもできます。それらはインターネットにアクセスできますが、ノードでスケジュールされたポッドはアクセスできません。

問題はイングレスおよびエグレスに影響します。kubelet はポート 10250 で実行されており、次を介してアクセスできます: curl https://localhost:10250 -kを返します404 page not found

コンテキスト: 私のクラスターには同じ仕様のノードがいくつかあります。昨日、OS(20.04 から 22.04) をアップグレードすることにしたので、正常に動作していた以前の K8S クラスターを削除し、すべてのノードで OS をアップグレードし、K8S を再インストールして、クラスターを再作成しました。mynode を除くすべてのノードでスムーズに動作し、ReadyState で、問題ないように見えますが、そうではありません。

私の CNI は calico です。ノード上の Calico ポッド (csi-node-driver と calico-node) は実行状態にあり、再起動されていません。

k8sウェブサイトのデバッグページに従いましたが、ポッドにスケジュールされたHTTPサーバーにアクセスできないため、この問題は両方に影響します。出入り

答え1

この問題は OS のアップグレード後に発生したようですので、CNI プラグイン、CRI、およびポッドのコンテナー イメージが最新であり、新しい OS バージョン 22.04 と互換性があることを確認してください。

この問題が発生する原因としては、以下のようなものが考えられます。ネットワークポリシーアクセスのブロック、ポッド ネットワーク構成、Calico CNI の問題。以下の手順に従ってください。問題の解決に役立つ場合があります。

  1. 問題を理解するには、coreDNS ログと pod ログを調べてください。次のコマンドを実行すると、詳細情報が得られます。

    kubectl ログ --namespace=kube-system -l k8s-app=kube-dns

    kubectl ログ ポッド名

  2. ポッドへのトラフィックをブロックしているネットワーク ポリシーを確認します。次のコマンドを実行すると、詳細情報が表示されます。kubectl get networkpolicy

  3. 必要なポートを確認する開いているかどうか。

  4. ポッド内のファイアウォール ルールがトラフィックをブロックするかどうかを確認します。

  5. ポッドのCIDRを一致させ、Calicoのデフォルトは192.168.0.0/16です。githubコメント詳細については。

  6. HTTPサーバーがDNS名に依存している場合は、DNS解決クラスター内で正しく構成されています。

編集1

  1. CoreDNS に問題がない場合もありますが、k8s ネットワークの問題により ClusterIP へのトラフィックが Pod に正しく送信されないことがあります。Kube-proxy が原因の可能性があります。k8s を参照してください。デバッグサービストラブルシューティング ガイド。

  2. また、ポッドネットワークがホストネットワークと重複していないか確認してください。Podネットワークアドオンのインストール詳細については。

  3. アップグレード中にネットワーク関連の機能が読み込まれないことがあり、そのようなポッドに入ると、ルートユーザーとして作業することになります。そのため、試してみてapt-get update、後で実行できます。apt-get install curl.

答え2

解決策はサーバーを再起動することでした...

答え3

その URL は存在しないため、 Kubelet が表示されること404が予想されます。以下を試してください。

curl -k https://localhost:10250/healthz

まずip_forward障害のあるノードをチェックします

cat /proc/sys/net/ipv4/ip_forward

そうでない場合は、Calicoが施行しているポリシーを確認します

kubectl get networkpolicy -A
kubectl get gnp
kubectl get cnp -A

nat次にIPPoolが有効になっていることを確認します

kubetl get ippool -o yaml

ゲートウェイを確認してください。

注意: iptables をフラッシュすると接続が一時的に切断される可能性がありますので、コンソール接続が手元にあることを確認してください。

IPtables をフラッシュするのも悪い考えではないかもしれませんが、歓迎されなくなったある種のルールである可能性があります。

iptables -F

関連情報