ポッド間のネットワーク接続のデバッグ
ポッド間の接続の問題をデバッグするためのオプションと戦略を確認します。
クラスター・コンポーネントおよびネットワーキング・ポッドの正常性の確認
コンポーネントの正常性を確認するには、以下の手順を実行します。 ネットワークの問題は、クラスター・コンポーネントが最新でないか、正常な状態でない場合に発生する可能性があります。
-
クラスターのマスター・ノードとワーカー・ノードが、サポートされているバージョンで実行されており、正常な状態であることを確認します。 クラスター・マスターまたはワーカーがサポートされているバージョンを実行していない場合は、サポートされているバージョンを実行するように 必要な更新を行います。 コンポーネントのステータスが
Normal
またはReady
でない場合は、クラスタ・マスターの健康状態、クラスタの状態 を確認してください、ワーカーノードの状態、または トラブルシューティングのステップCritical
またはNotReady
ワーカーノード を参照してください。 続行する前に、関連するすべての問題が解決されていることを確認してください。クラスター・マスターのバージョンと正常性を確認するには、以下のようにします
ibmcloud oc cluster get -c <cluster-id>
ワーカー・ノードのバージョンと正常性を確認するには、以下の手順
ibmcloud oc workers -c <cluster-id>
-
ワーカー・ノードごとに、 Calico ポッドとクラスター DNS ポッドが存在し、正常な状態で実行されていることを確認します。
-
コマンドを実行して、クラスタのポッドの詳細を取得する。
oc get pods -A -o wide | grep -e calico -e dns-default
-
出力で、クラスターに以下のポッドが含まれていることを確認します。 各ポッドの状況が
Running
であること、およびポッドの再始動回数が多すぎないことを確認します。- ワーカー・ノードごとに 1 つの
calico-node
ポッドのみ。 - クラスターごとに少なくとも 1 つの
calico-typha
ポッド。 大規模なクラスターには、複数のクラスターが存在する可能性があります。 - クラスターごとに 1 つの
calico-kube-controllers
ポッドのみ。 - ノードあたり1つの
dns-default
ポッド。 しかし、ノードによっては、ラベルが添付されている場合、dns-default
ポッドを持たないことがあります。 これは正常であり、ネットワークの問題を引き起こすことはありません。
出力例
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED READINESS GATES calico-system calico-kube-controllers-1a1a1a1 1/1 Running 0 37m 172.17.61.195 10.245.0.5 <none> <none> calico-system calico-node-1a1a1a1 1/1 Running 0 37m 10.245.0.5 10.245.0.5 <none> <none> calico-system calico-node-1a1a1a1 1/1 Running 0 37m 10.245.0.4 10.245.0.4 <none> <none> calico-system calico-typha-1a1a1a1 1/1 Running 0 37m 10.245.0.5 10.245.0.5 <none> <none> openshift-dns dns-default-1a1a1a1 2/2 Running 0 33m 172.17.36.144 10.245.0.4 <none> <none> openshift-dns dns-default-1a1a1a1 2/2 Running 0 33m 172.17.61.210 10.245.0.5 <none> <none>
- ワーカー・ノードごとに 1 つの
-
リストされているポッドのいずれかが存在しないか、正常でない状態である場合は、前のステップに含まれているクラスターおよびワーカー・ノードのトラブルシューティングに関する資料を参照してください。 先に進む前に、このステップのポッドに関する問題が解決されていることを確認してください。
-
テスト・ポッドを使用したデバッグ
ポッドでのネットワーキングの問題の原因を判別するために、各ワーカー・ノードにテスト・ポッドを作成できます。 その後、テストを実行し、ポッド内のネットワーキング・アクティビティーを監視することができます。これにより、問題の原因が明らかになる可能性があります。
ポッドのセットアップ
-
テスト・ポッド用の新しい特権名前空間を作成します。 新しい名前空間を作成すると、既存の名前空間内のすべてのカスタム・ポリシーまたは構成がテスト・ポッドに影響を与えなくなります。 この例では、新しい名前空間は
pod-network-test
という名前です。名前空間を作成します。
oc create ns pod-network-test
-
新しい特権ネームスペースにラベルを追加する。
oc label namespace pod-network-test --overwrite=true \ pod-security.kubernetes.io/enforce=privileged \ pod-security.kubernetes.io/enforce-version=latest \ pod-security.kubernetes.io/audit=privileged \ pod-security.kubernetes.io/audit-version=latest \ pod-security.kubernetes.io/warn=privileged \ pod-security.kubernetes.io/warn-version=latest \ security.openshift.io/scc.podSecurityLabelSync="false"
-
特権セキュリティー・コンテキストを使用して名前空間でポッドを実行できるようにするには、このコマンドを実行します。
oc adm policy add-scc-to-group privileged system:serviceaccounts:pod-network-test
-
以下のデーモンセットを作成して適用し、各ノードにテストポッドを作成する。
apiVersion: apps/v1 kind: DaemonSet metadata: labels: name: webserver-test app: webserver-test name: webserver-test spec: selector: matchLabels: name: webserver-test template: metadata: labels: name: webserver-test app: webserver-test spec: tolerations: - operator: "Exists" containers: - name: webserver securityContext: privileged: true image: us.icr.io/armada-master/network-alpine:latest env: - name: ENABLE_ECHO_SERVER value: "true" - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name restartPolicy: Always terminationGracePeriodSeconds: 1 ```
-
デーモン・セットを適用して、ワーカー・ノードにテスト・ポッドをデプロイします。
oc apply --namespace pod-network-test -f <daemonset-file>
- ネームスペース内のすべてのポッドを一覧表示して、ポッドが正常に起動することを確認します。
oc get pods --namespace pod-network-test -o wide
ポッド内でのテストの実行
curl
、 ping
、および nc
コマンドを実行して各ポッドのネットワーク接続をテストし、 dig
コマンドを実行してクラスター DNS をテストします。 各出力を確認してから、 問題の特定 を参照して、結果の意味を確認してください。
-
テスト・ポッドをリストし、各ポッドの名前と IP をメモします。
oc get pods --namespace pod-network-test -o wide
出力例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES webserver-test-1a1a1 1/1 Running 0 68s 172.17.36.169 10.245.0.4 <none> <none> webserver-test-1a1a1 1/1 Running 0 68s 172.17.61.240 10.245.0.5 <none> <none>
-
exec
コマンドを実行して、1つのポッドにログインします。kubectl exec -it --namespace pod-network-test <pod_name> -- sh
-
ポッドで
curl
コマンドを実行し、出力をメモします。 ログインしていないポッドのIPアドレスを指定してください。 これにより、異なるノード上のポッド間のネットワーク接続がテストされます。curl <pod_ip>:8080
成功した出力の例。
Hostname: webserver-test-t546j Pod Information: node name: env var NODE_NAME not set pod name: webserver-test-t546j pod namespace: env var POD_NAMESPACE not set pod IP: env var POD_IP not set Connection Information: remote address: 172.17.36.169 remote port: 56042 local address: 172.17.61.240 local port: 8080
-
ポッドで
ping
コマンドを実行し、出力をメモします。exec
コマンドでログインしなかったポッドのIPを指定してください。 これにより、異なるノード上のポッド間のネットワーク接続がテストされます。ping -c 5 <pod_ip>
成功した出力の例。
PING 172.30.248.201 (172.30.248.201) 56(84) bytes of data. 64 bytes from 172.30.248.201: icmp_seq=1 ttl=62 time=0.473 ms 64 bytes from 172.30.248.201: icmp_seq=2 ttl=62 time=0.449 ms 64 bytes from 172.30.248.201: icmp_seq=3 ttl=62 time=0.381 ms 64 bytes from 172.30.248.201: icmp_seq=4 ttl=62 time=0.438 ms 64 bytes from 172.30.248.201: icmp_seq=5 ttl=62 time=0.348 ms --- 172.30.248.201 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4086ms rtt min/avg/max/mdev = 0.348/0.417/0.473/0.046 ms
-
ポッドで
nc
コマンドを実行し、出力をメモします。exec
コマンドでログインしなかったポッドのIPを指定してください。 これにより、異なるノード上のポッド間のネットワーク接続がテストされます。nc -vzw 5 <pod_ip> 8080
成功した出力の例。
nc -vzw 5 172.17.61.240 8080 172.17.61.240 (172.17.61.240:8080) open
-
dig
コマンドを実行して DNS をテストします。dig +short kubernetes.default.svc.cluster.local
出力例
172.21.0.1
dig +short ibm.com
出力例
23.50.74.64
-
curl
コマンドを実行して、サービスへの完全なTCPまたは HTTPS 接続をテストします。 この例では、クラスターのバージョン情報を取得して、ポッドとクラスター・マスターの間の接続をテストします。 クラスター・バージョンを正常に取得した場合は、接続が正常であることを示しています。curl -k https://kubernetes.default.svc.cluster.local/version
出力例
{ "major": "1", "minor": "25", "gitVersion": "v1.25.14+bcb9a60", "gitCommit": "3bdfba0be09da2bfdef3b63e421e6a023bbb08e6", "gitTreeState": "clean", "buildDate": "2023-10-30T21:33:07Z", "goVersion": "go1.19.13 X:strictfipsruntime", "compiler": "gc", "platform": "linux/amd64" }
-
ポッドからログアウトする。
exit
-
残りのポッドを使用して、上記のステップを繰り返します。
問題の特定
前のセクションの出力を確認して、ポッド・ネットワーキングの問題の原因を見つけることができます。 このセクションでは、前のセクションで特定できる一般的な原因をいくつかリストします。
-
テスト・ポッドでコマンドが正常に機能したにもかかわらず、デフォルトの名前空間内のアプリケーション・ポッドにまだネットワーキングの問題がある場合は、特にアプリケーションに関連する問題が存在する可能性があります。
- ネットワーキング・トラフィックを制限する Calico または Kubernetes ネットワーク・セキュリティー・ポリシーが設定されている場合があります。 ネットワーキング・ポリシーがポッドに適用されている場合、 そのポリシーによって特に許可されていないすべてのトラフィックがドロップされます。 ネットワーキング・ポリシーについて詳しくは、 Kubernetes の資料を参照してください。
- Istio または Red Hat OpenShift サービス・メッシュを使用している場合は、ポッド間のトラフィックをドロップまたはブロックするサービス構成の問題が発生している可能性があります。 詳しくは、 Istio および Red Hat OpenShift Service Meshのトラブルシューティング資料を参照してください。
- この問題は、クラスターではなくアプリケーションのバグに関連している可能性があり、独自のトラブルシューティングが必要になる場合があります。
-
特定のポッドで
curl
、ping
、またはnc
コマンドが失敗した場合は、それらのポッドがどのワーカー・ノード上にあるかを確認します。 一部のワーカー・ノードでのみ問題が発生する場合は、 それらのワーカー・ノードを置き換える か、 ワーカー・ノードのトラブルシューティング に関する追加情報を参照してください。 -
dig
コマンドからの DNS ルックアップが失敗した場合は、 Red Hat DNS トラブルシューティング情報を参照してください。
それでもポッド・ネットワーキングの問題を解決できない場合は、 サポート Case を開き 、問題の詳細な説明、問題を解決しようとした方法、実行したテストの種類、ポッドとワーカー・ノードの 関連ログ を含めてください。 サポート Case のオープンおよび組み込む情報について詳しくは、 一般デバッグ・ガイド を参照してください。