Container Service for Kubernetes (ACK) は、Pod 間の接続失敗、クラスターからパブリックインターネットへの接続失敗、またはパブリックインターネットから LoadBalancer Service への接続失敗など、一般的なネットワーク問題のトラブルシューティングに役立つネットワーク診断機能を提供します。このトピックでは、ネットワーク診断の仕組みと、この機能を使用して一般的な接続問題を解決する方法について説明します。
診断機能を使用すると、システムはクラスターノード上でデータ収集エージェントを実行し、診断結果を収集します。収集される情報には、システムバージョン、負荷、Docker および Kubelet のステータス、システムログからの主要なエラーメッセージが含まれます。データ収集エージェントは、お客様のビジネス情報や機密データを収集しません。
前提条件
ACK マネージドクラスターが作成済みであること。
ネットワーク診断
ACK コンソールは、送信元アドレス、宛先アドレス、宛先ポート、プロトコルを入力することで、一般的なネットワーク問題を迅速に診断できるネットワーク診断機能を提供します。複雑なコンテナネットワークアーキテクチャ、ネットワークプラグインの内部仕様、またはカーネルレベルの操作に関する深い専門知識がなくても、この機能を使用できます。
ネットワーク診断機能は、オープンソースプロジェクトの KubeSkoop に基づいています。KubeSkoop は、さまざまなネットワークプラグインや IaaS プロバイダーにわたる一般的な Kubernetes クラスターのネットワーク問題に対してワンクリック診断を提供し、eBPF を使用して重要なカーネルパスの詳細な監視と分析を行います。このトピックでは、ネットワーク診断機能のみを扱います。詳細な監視と分析については、「KubeSkoop を使用したネットワーク問題のトラブルシューティング」をご参照ください。
仕組み

-
トポロジーの構築:診断情報を提供すると、ネットワーク診断は、提供された詳細と、Pod、ノード、Service、NetworkPolicy などのクラスターから収集されたリソース情報に基づいて、診断のためのアクセストポロジーを構築します。
-
情報収集:ネットワーク診断は、ランタイム情報、ネットワークスタックデータ、およびネットワークインフラストラクチャに関する詳細を収集します。このデータは、トラブルシューティングとネットワーク分析に使用されます。
-
パスシミュレーション:ネットワーク診断は、Elastic Compute Service (ECS) インスタンス上でコマンドを実行するか、クラスター内にコレクター Pod をデプロイすることで、関連するノードまたはコンテナからネットワークスタック情報を収集します。この情報には、ネットワークデバイス、sysctl パラメーター、iptables、IPVS に関する詳細が含まれます。このツールは、ルートテーブル、セキュリティグループ、NAT ゲートウェイなどのクラウドリソース情報も収集します。その後、システムは収集した情報を期待される設定と比較し、設定ミスを特定します。このプロセスには、iptables とルーティングルールのシミュレーション、デバイスステータスの確認、クラウドルートテーブルとセキュリティグループルールの検証が含まれます。
-
診断結果:実際の設定と期待される状態を比較した後、ツールはネットワークトポロジーを出力し、異常なノードと問題を強調表示します。
ネットワーク診断の使用
制限事項
-
診断対象の Pod は Running 状態である必要があります。
-
パブリックインターネットから LoadBalancer Service への接続は、バックエンド Pod の数が 10 以下のレイヤー 4 クラシックロードバランサー (CLB) インスタンスでのみサポートされます。
-
現在、サーバーレス Kubernetes クラスターまたは仮想ノードの診断はサポートされていません。
操作手順
-
ACK コンソールにログインします。左側のナビゲーションペインで、クラスターリスト をクリックします。
-
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションペインで、 を選択します。
-
診断 ページで、ネットワーク診断 タブをクリックし、左上隅にある 診断 をクリックします。
-
[アクセス情報] パネルで、ソース IP:、ターゲットアドレス、ポート を入力し、プロトコル を選択します。注意事項を読み、私はそれを理解し、同意します を選択し、診断 をクリックします。
診断パラメーターについては、「診断パラメーター」をご参照ください。
-
[診断結果] ページで、結果を確認できます。[完全なアクセスパス] セクションには、診断した接続パスのエンドツーエンドのビューが表示されます。
異常なノードは異なる色で強調表示されます。一般的な診断結果については、「一般的な診断結果と解決策」をご参照ください。
診断結果は、[レベル] (FATAL など)、[ノード]、[診断結果] の 3 つの列を持つテーブルに表示されます。これにより、異常なノードと特定のルーティングエラーを迅速に特定できます。結果で問題が解決しない場合は、ページ上の [チケットを送信] または [フィードバック] リンクをクリックして、さらにサポートを依頼してください。
診断パラメーター
シナリオ 1:Pod 間および Pod からノードへ
Pod 間、または Pod とノード間の接続に問題が発生した場合は、ネットワーク診断を使用して接続のトラブルシューティングを行うことができます。次の表にパラメーターを示します。
|
パラメーター |
説明 |
|
送信元アドレス |
Pod またはノードの IP アドレス。 |
|
宛先アドレス |
Pod またはノードの IP アドレス。 |
|
ポート |
診断対象のポート。 |
|
プロトコル |
診断対象のプロトコル。 |
シナリオ 2:Pod およびノードから Service へ
Service への接続は、そのクラスター IP を宛先として使用することで診断できます。このツールは、Pod またはノードから Service の各エンドポイントへのネットワークパスをチェックし、関連するネットワーク設定を検証します。次の表にパラメーターを示します。
|
パラメーター |
説明 |
|
送信元アドレス |
Pod またはノードの IP アドレス。 |
|
宛先アドレス |
Service のクラスター IP。 |
|
ポート |
診断対象のポート。 |
|
プロトコル |
診断対象のプロトコル。 |
シナリオ 3:DNS パス
宛先がドメイン名の場合、送信元から宛先 IP へのパスを確認することに加えて、クラスター内 DNS が正しく機能しているかどうかも確認する必要があります。ネットワーク診断を使用して、Pod からクラスターの DNS サービス (kube-system 名前空間の kube-dns Service) への接続を確認し、潜在的な DNS 解決の問題を特定します。
次のコマンドを実行して、kube-system 名前空間の kube-dns Service のクラスター IP を取得します。
kubectl get svc -n kube-system kube-dns
出力例:
NAME TYPE CLUSTER-IP EXTERNAL-IP <none> 53/UDP,53/TCP,9153/TCP 6d
出力の CLUSTER-IP は、kube-dns Service のクラスター IP です。この IP を宛先アドレスとして使用します。次の表にパラメーターを示します。
|
パラメーター |
説明 |
|
送信元アドレス |
Pod またはノードの IP アドレス。 |
|
宛先アドレス |
kube-dns Service のクラスター IP。 |
|
ポート |
53 |
|
プロトコル |
udp |
シナリオ 4:Pod およびノードからインターネットへ
ネットワーク診断を使用して、Pod またはノードからパブリック IP アドレスへの接続を確認できます。宛先がドメイン名の場合は、まず手動でそのパブリック IP アドレスに解決する必要があります。次の表にパラメーターを示します。
|
パラメーター |
説明 |
|
送信元アドレス |
Pod またはノードの IP アドレス。 |
|
宛先アドレス |
パブリック IP アドレス。 |
|
ポート |
診断対象のポート。 |
|
プロトコル |
診断対象のプロトコル。 |
シナリオ 5:インターネットから LoadBalancer Service へ
パブリックインターネットから LoadBalancer Service にアクセスできない場合は、パブリック IP を送信元、LoadBalancer Service の外部 IP を宛先として使用して接続を診断できます。次の表にパラメーターを示します。
|
パラメーター |
説明 |
|
送信元アドレス |
パブリック IP アドレス。 |
|
宛先アドレス |
LoadBalancer Service の外部 IP アドレス。 |
|
ポート |
診断対象のポート。 |
|
プロトコル |
診断対象のプロトコル。 |
一般的な診断結果と解決策
|
診断結果 |
説明 |
解決策 |
|
pod container ... is not ready |
Pod 内のコンテナが準備完了状態ではありません。 |
Pod のヘルスステータスを確認し、問題を修正してください。 |
|
NetworkPolicy ... deny the packet from ... |
NetworkPolicy がパケットをブロックしています。 |
対応する NetworkPolicy ルールを修正してください。 |
|
no process listening on ... |
コンテナまたはノード上のプロセスが、指定されたプロトコルで指定されたポートをリッスンしていません。 |
ターゲットプロセスが正しく実行されていることを確認してください。ポートやプロトコルを含む診断パラメーターを確認してください。 |
|
no route to host .../invalid route ... for packet ... |
ホストへのルートが見つからないか、既存のルートが不正な宛先を指しています。 |
ネットワークプラグインが正しく動作しているか確認してください。 |
|
... do not have same security group |
2 つの ECS インスタンスのセキュリティグループに、相互通信を許可するルールがないため、パケットロスが発生する可能性があります。 |
ECS インスタンスが同じセキュリティグループを使用するように設定してください。 |
|
security group ... not allow packet ... |
ECS インスタンス上のセキュリティグループがパケットをブロックしています。 |
セキュリティグループのルールを確認し、必要なアドレスからのトラフィックを許可してください。 |
|
クラウドルートテーブルに、宛先 IP アドレスへのルートが含まれていません。 |
クラウドルートテーブルの設定を確認してください。宛先がパブリック IP アドレスの場合は、パブリック NAT ゲートウェイの設定を確認してください。 |
|
クラウドルートテーブルのルートが、期待されるネクストホップを指していません。 |
クラウドルートテーブルの設定を確認してください。宛先がパブリック IP アドレスの場合は、パブリック NAT ゲートウェイの設定を確認してください。 |
|
no snat entry on NAT Gateway ... |
指定された SNAT エントリがパブリック NAT ゲートウェイに見つかりません。 |
パブリック NAT ゲートウェイの SNAT ルール設定を確認してください。 |
|
backend ... health status for port ..., not "normal" |
CLB インスタンスのバックエンドサーバーがヘルスチェックに失敗しました。 |
CLB インスタンスに正しいエンドポイントがアタッチされていること、およびそれらのエンドポイント上のバックエンドサービスが正常であることを確認してください。 |
|
cannot find listener port ... for CLB ... |
指定されたリスナーポートが CLB インスタンスに見つかりません。 |
LoadBalancer Service の設定を確認し、ポートやプロトコルを含む診断パラメーターが正しいことを確認してください。 |
|
status of CLB for ... port ... not "running" |
CLB インスタンスのリスナーが実行中状態ではありません。 |
CLB インスタンスのリスナーのステータスを確認してください。 |
|
Service ... has no valid endpoint |
Service に有効なエンドポイントがありません。 |
Service のラベルセレクターが期待どおりに設定されているか確認し、対応するエンドポイントが存在し、正常であることを確認してください。 クラスター内から LoadBalancer Service IP へのアクセスに関する問題については、「クラスター内から CLB インスタンスへのアクセスが失敗する」をご参照ください。 |