Chuyển đến nội dung chính

レッスン12: ネットワークトラブルシューティング & 試験戦略

ネットワーク接続性のデバッグ。DNS問題、Serviceへの到達不能。クラスタネットワーキングフロー。 CKA試験のコツ、時間管理とコマンドショートカット。

ネットワークトラブルシューティングレイヤー — レイヤーごとのデバッグアプローチ

1. ネットワークトラブルシューティングワークフロー

ネットワーク接続性の問題:
  Pod AがPod B(またはService)に到達できない
  
  レイヤーごとのデバッグ:
  
  1. 同じノード、同じNamespace?
     kubectl exec pod-a -- ping POD_B_IP

  2. 異なるノード?
     kubectl get pod pod-a pod-b -o wide  # ノード配置を確認

  3. Service名(DNS)経由?
     kubectl exec pod-a -- nslookup my-service
     kubectl exec pod-a -- wget -qO- http://my-service:8080

  4. NetworkPolicyがブロック?
     kubectl get networkpolicy -n NAMESPACE

  5. kube-proxyが動作中?
     kubectl get pods -n kube-system -l k8s-app=kube-proxy

2. フルネットワークフロー図

クライアントPod ──(ルーティング)──► Service ClusterIP (iptables/ipvs)
                                │
                            kube-proxyが以下のいずれかにルーティング:
                           Pod IP 1 | Pod IP 2 | Pod IP 3
                                │
                          CNI (Calico/Flannel)がクロスノードの場合
                          正しいノードにルーティング
                                │
                          コンテナがcontainerPortで受信
障害コンポーネント症状対処法
CoreDNSDNS解決失敗CoreDNS Podを再起動
kube-proxyService IPに到達不能kube-proxy DaemonSetを再起動
CNIプラグインクロスノードPod通信失敗CNIの再インストールまたはCNI Podを確認
NetworkPolicy特定のトラフィックがブロックブロックしているポリシーを確認/削除

試験のポイント:ネットワーキングをデバッグする際は、Pod内部から開始(IPで到達可能か?)→ Service(DNS + Endpoints?)→ ノード(CNIルーティング?)→ NetworkPolicy。DNSをテストせずにいきなりkube-proxyを確認しないでください。

3. CKA試験戦略

ヒント詳細
すぐにコンテキストを切り替え各問題はクラスタを指定 → kubectl config use-context CLUSTER
--dry-runを使用kubectl create deploy --dry-run=client -o yaml > file.yamlでYAMLを生成
explainを使用kubectl explain pod.spec.containers.resourcesでフィールドヘルプ
素早くブックマークYAMLテンプレートが必要な時はKubernetes docs検索を使用
難問はスキップマークして後で戻る;簡単な問題から先に(30%のトラブルシューティング = 最多配点)
完了後に検証kubectl get/describeで変更が反映されたか確認

4. 必須kubectlショートカット

# 時間節約のためのエイリアス
alias k=kubectl
alias kgp='kubectl get pods'
alias kgs='kubectl get svc'
alias kns='kubectl config set-context --current --namespace'

# リソース短縮名
po  = pods
svc = services
deploy = deployments
ns  = namespaces
cm  = configmaps
pvc = persistentvolumeclaims
pv  = persistentvolumes
rs  = replicasets
sa  = serviceaccounts
no  = nodes

# よく使うフラグ
-n NAMESPACE    --namespace
-o wide         詳細出力(IP、Node)
-o yaml         完全YAML出力
-o jsonpath     特定フィールドの抽出
--all-namespaces / -A   全Namespaceで検索

5. CKA必須コマンド

# dry-runでYAML生成
kubectl run nginx --image=nginx --dry-run=client -o yaml > pod.yaml
kubectl create deployment myapp --image=myapp --replicas=3 --dry-run=client -o yaml

# フィールドの抽出
kubectl get node NODENAME -o jsonpath='{.status.capacity.cpu}'
kubectl get pod PODNAME -o jsonpath='{.status.podIP}'

# フィールドでソート
kubectl get events --sort-by='.lastTimestamp'
kubectl get pods --sort-by='.status.startTime'

# リソースのウォッチ
kubectl get pods -w

# 全Namespace
kubectl get pods -A
kubectl get pods -A | grep CrashLoop

6. CKAクイックリファレンス

ドメイン(配点)主要トピック
Cluster Architecture (25%)kubeadm、静的Pod、kubeconfig、RBAC
Workloads (15%)Deployments、rollout、DaemonSet、StatefulSet、スケジューリング
Services & Networking (20%)Services、Ingress、NetworkPolicy、DNS
Storage (10%)PV、PVC、StorageClass、ボリュームマウント
Troubleshooting (30%)ノード、ワークロード、ネットワークデバッグ — 最高配点

7. 練習問題

Q1:PodがService名で到達できませんがIP直接では成功します。DNS解決が失敗しています。CoreDNS Podは実行中です。何を確認すべきですか?

  • A) kube-proxyの設定
  • B) Podの/etc/resolv.confのnameserverエントリ ✓
  • C) ノードのiptablesルール
  • D) ServiceのtargetPort

解説:IPでは到達可能だがDNSが失敗する場合、PodがCoreDNSサーバーを使用していません。Pod内の/etc/resolv.confを確認 — kube-dns ClusterIPがnameserverとして表示されるべきです。表示されない場合、PodのdnsPolicyまたはdnsConfigがデフォルトをオーバーライドしている可能性があります。

Q2:CKA試験で新しい問題に取り組む際、最初に必ず行うことは?

  • A) そのトピックのKubernetesドキュメントを読む
  • B) kubectl config use-contextで正しいクラスタコンテキストに切り替える ✓
  • C) 現在のクラスタ状態のバックアップを作成する
  • D) クラスタの既存リソースを確認する

解説:CKAは複数のクラスタを使用します。各問題はクラスタを指定します。まずコンテキストを切り替えてください — 間違ったクラスタで作業すると、完璧に実行しても不合格になります。これが試験での#1のミスです。

Q3:Deployment「webapp」をポート80でNodePort Serviceとして外部に公開する最速の方法は?

  • A) Service YAMLを記述してkubectl applyする
  • B) kubectl expose deployment webapp --type=NodePort --port=80 ✓
  • C) kubectl create service nodeport webapp --tcp=80:80
  • D) Deployment YAMLを編集してhostPortを追加する

解説:kubectl exposeが最速です — Deploymentの既存セレクタを使用してPodをターゲットにするServiceを作成します。YAML編集が不要です。選択肢Cも動作しますが、Deploymentの既存セレクタを使用しません。