ワークロードのトラブルシューティング

KubernetesBeginner
オンラインで実践に進む

はじめに

デプロイは、いつも計画どおりに進むとは限りません。問題が発生したときは、再現性のあるトラブルシューティング手順が必要です。

この実験では、「見つからないイメージ事件」を解決します。

Kubernetes のトラブルシューティングは、多くの場合、オブジェクトのステータス確認から始まり、次にイベントを確認し、さらに詳しく調査します。この実験では、証拠に基づいて問題を切り分けるワークフローに取り組みます。

この実験では、次の操作を行います。

  • 現場を作る:意図的に壊れた Pod をデプロイします。
  • 調査する:「双眼鏡」に相当する get を使って、問題があることを確認します。
  • 証拠を集める:「虫眼鏡」に相当する describe を使って、根本原因を特定します。
  • 事件を解決する:設定を修正し、アプリケーションが復旧する様子を確認します。

壊れた Pod を作成する

まず、意図的なタイプミスを含む Pod をデプロイします。これは、存在しないイメージを指定するという、よくあるエラーを再現したものです。

この操作は、問題が後になって初めて発見されるマニフェストを Kubernetes が数多く受け付けることを理解するのにも役立ちます。YAML ファイルは構文的に正しくても、実際の動作としては誤っている場合があります。そのため、トラブルシューティングでは「オブジェクトが受け付けられたか」と「ワークロードが正しく起動したか」を分けて確認する必要があります。

broken-pod.yaml という名前のファイルを作成します。

nano broken-pod.yaml

次の内容を貼り付けます。wrongtag123 という不審なイメージタグに注目してください。

apiVersion: v1
kind: Pod
metadata:
  name: broken-pod
spec:
  containers:
    - name: nginx
      image: nginx:wrongtag123

Ctrl+X、Y、Enter の順に押して保存して終了します。

Pod をデプロイします。

kubectl apply -f broken-pod.yaml

YAML の形式が正しいため、Kubernetes はこのファイルを受け付けます。この時点では、まだ「事件」は検出されていません。

失敗を確認する

次に、デプロイした Pod のステータスを確認します。現場を双眼鏡で見渡すような操作です。

ErrImagePull や ImagePullBackOff などのステータスは、最終的な説明ではなく症状です。次にどこを調査すべきかを示しています。適切なトラブルシューティングでは、ステータス出力を診断の手がかりとして使い、ステータスだけで原因を断定しません。

default namespace にある Pod を確認します。

kubectl get pods

最初は ContainerCreating と表示されることがあります。しかし数秒後には、通常 ImagePullBackOff または ErrImagePull に変わります。

ImagePullBackOff とは、Kubernetes の表現で「このイメージを取得しようとしたが失敗した。しばらく待ってから、もう一度試す」という意味です。

これで、被害者である Pod が正常な状態ではないことを確認できます。

イベントを調査する

失敗したことは分かりましたが、原因はまだ分かりません。原因を特定するには、さらに詳しく調査する必要があります。

kubectl describe コマンドは虫眼鏡のような役割を果たします。指定したリソースの内部イベントやログを表示できます。

特に重要なのが Events セクションです。このセクションには、scheduler や kubelet などの Kubernetes コンポーネントが残した短い経緯が記録されています。初心者がイベントを読まずに思いつきで修正すると、間違った問題を解決しようとして時間を無駄にしがちです。

壊れた Pod を調査します。

kubectl describe pod broken-pod

このコマンドは大量の情報を出力します。画面の一番下までスクロールして、Events セクションを探してください。

次のような内容が表示されます。

Type     Reason     Message
----     ------     -------
Normal   Pulling    Pulling image "nginx:wrongtag123"
Warning  Failed     Failed to pull image "nginx:wrongtag123": manifest unknown
Warning  Failed     Error: ErrImagePull

manifest unknown というメッセージが決定的な手がかりです。イメージが保存されている Docker registry に、nginx:wrongtag123 の記録がないことを意味します。

事件は解決しました。原因は、無効なイメージタグです。

Pod を修正する

根本原因が分かったので、問題を修正します。

この最後のステップでは、より一般的なトラブルシューティングのパターンも確認します。まず状況を観察し、証拠から仮説を立て、対象を絞った変更を 1 つ行い、その後に復旧を確認します。この手順を守るほうが、複数の変更を一度に推測で加えるよりも信頼性が高くなります。

broken-pod.yaml ファイルをもう一度開きます。

nano broken-pod.yaml

「タイプミス」を修正します。nginx:wrongtag123 を nginx に変更してください。nginx はデフォルトで nginx:latest として扱われるため、有効なイメージです。

apiVersion: v1
kind: Pod
metadata:
  name: broken-pod
spec:
  containers:
    - name: nginx
      image: nginx

保存して終了します。

修正を適用します。Kubernetes は、新しい情報を使って既存の Pod を更新できます。

kubectl apply -f broken-pod.yaml

次に、復旧の様子を監視します。

kubectl get pods -w

ステータスが ImagePullBackOff から Running に変わることを確認してください。

監視を停止するには、Ctrl+C を押します。

よくできました、探偵さん!エラーを特定し、サービスを正常に復旧できました。

まとめ

この実験では、Kubernetes のトラブルシューティングにおける基本的なワークフローを学びました。

  1. 観察:kubectl get pods を実行して、失敗しているワークロードを特定します。
  2. 調査:kubectl describe pod を使って Event ログを確認し、エラーメッセージを探します。
  3. 修正:YAML マニフェストを更新し、修正内容を適用します。

この「Get、Describe、Fix」という手順によって、Kubernetes の運用で遭遇するデプロイの問題の 90% に対処できます。