Kubernetes ジョブの状態とログの監視方法

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

はじめに

Kubernetes は、複数のホストにわたってコンテナ化されたアプリケーションを管理するのに役立つ、強力なコンテナオーケストレーションプラットフォームです。Kubernetes の重要な機能の 1 つは、ジョブ管理システムであり、バッチ指向のワークロードを完了まで実行できます。このチュートリアルでは、コンテナ化されたアプリケーションがスムーズに実行されるようにするために不可欠なスキルである、Kubernetes ジョブの状態を監視し、そのログを分析する方法を学びます。

このチュートリアルの終わりには、Kubernetes ジョブを作成し、その状態を確認し、ログを調べて問題を効果的にトラブルシューティングできるようになります。

Kubernetes 環境のセットアップ

Kubernetes ジョブを監視する前に、動作する Kubernetes 環境をセットアップする必要があります。ここでは、ローカルマシン上にシングルノードの Kubernetes クラスタを作成するツールである Minikube を使用します。

Minikube のインストール

Minikube はすでに VM にインストールされています。バージョンを確認して、インストールを確認しましょう。

minikube version

次のような出力が表示されるはずです。

minikube version: v1.29.0
commit: ddac20b4b34a9c8c857fc602203b6ba2679794d3

Minikube の起動

次に、Minikube を起動して、ローカル Kubernetes クラスタを作成しましょう。

minikube start --driver=docker

このコマンドの完了には数分かかります。Minikube が必要なコンポーネントをダウンロードし、クラスタを起動する際に、一連のメッセージが表示されます。

完了すると、次のようなメッセージが表示されるはずです。

🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

Kubernetes インストールの検証

ノードの状態を確認して、Kubernetes クラスタが正しく実行されていることを確認しましょう。

kubectl get nodes

次のような出力が表示されるはずです。

NAME       STATUS   ROLES           AGE     VERSION
minikube   Ready    control-plane   1m      v1.26.3

また、コア Kubernetes コンポーネントが実行されていることを確認します。

kubectl get pods -n kube-system

kube-apiserverkube-controller-manager などのコンポーネントを含む、いくつかの Pod が実行されているのが確認できるはずです。

これで、Kubernetes クラスタが実行されているので、ジョブを作成して監視する準備ができました。

最初の Kubernetes ジョブの作成

このステップでは、コンテナを実行し、タスクを実行し、完了するシンプルな Kubernetes ジョブを作成します。これにより、次のステップで監視する対象ができます。

Kubernetes ジョブの理解

Kubernetes ジョブは、1 つ以上の Pod を作成し、それらが正常に終了することを確認するコントローラーです。ジョブは、バッチプロセス、1 回限りのタスク、または無期限ではなく完了まで実行する必要があるタスクに役立ちます。

ジョブ設定ファイルの作成

シンプルなジョブ設定ファイルを作成しましょう。ターミナルを開き、プロジェクトディレクトリに hello-job.yaml という新しいファイルを作成します。

cd ~/project
nano hello-job.yaml

次の YAML コンテンツをファイルにコピーして貼り付けます。

apiVersion: batch/v1
kind: Job
metadata:
  name: hello-job
spec:
  template:
    spec:
      containers:
        - name: hello
          image: busybox:1.28
          command: ["sh", "-c", 'echo "Hello, Kubernetes!" && sleep 5']
      restartPolicy: Never
  backoffLimit: 4

この設定は、次の内容を持つ hello-job という名前のジョブを定義します。

  • busybox:1.28 コンテナイメージを使用します
  • "Hello, Kubernetes!" を出力し、5 秒間スリープするコマンドを実行します
  • 再起動ポリシーが Never であり、完了後に再起動しません
  • backoffLimit が 4 であり、失敗した場合に最大 4 回再試行します

Ctrl+OEnter の順に押してファイルを保存し、Ctrl+X で nano を終了します。

ジョブの作成

次に、Kubernetes クラスタでジョブを作成しましょう。

kubectl apply -f hello-job.yaml

次のような出力が表示されるはずです。

job.batch/hello-job created

おめでとうございます!最初の Kubernetes ジョブを作成しました。次のステップでは、その状態を監視する方法を学びます。

Kubernetes ジョブの状態の監視

Kubernetes クラスタでジョブが実行されているので、その状態を監視する方法を学びましょう。ジョブの状態を監視することは、ジョブが正常に完了しているか、エラーが発生しているかを理解するために不可欠です。

kubectl を使用したジョブの状態の確認

Kubernetes リソースを監視するための主要なツールは kubectl です。これを使用して、ジョブの状態を確認しましょう。

kubectl get jobs

次のような出力が表示されるはずです。

NAME        COMPLETIONS   DURATION   AGE
hello-job   1/1           10s        30s

この出力は以下を示しています。

  • NAME: ジョブの名前
  • COMPLETIONS: 完了した Pod の数 / 必要な完了数
  • DURATION: ジョブの実行にかかった時間
  • AGE: ジョブが作成されてからの経過時間

ジョブの COMPLETIONS が 0/1 の場合、まだ実行中であるか、失敗している可能性があります。数秒待って、もう一度コマンドを実行してください。

詳細なジョブ情報の取得

ジョブに関する詳細な情報を取得するには、describe コマンドを使用します。

kubectl describe job hello-job

このコマンドは、次のようなジョブに関する広範な情報を提供します。

  • ラベルとアノテーション
  • セレクターの詳細
  • 並列処理と完了要件
  • Pod のステータス
  • ジョブに関連するイベント

一番下の Events セクションで、Pod の作成や完了などの重要なイベントを確認してください。

ジョブの状態の理解

ジョブには、いくつかの状態があります。

  • Active: ジョブはまだ実行中です
  • Completed: ジョブは正常に完了しました
  • Failed: ジョブはバックオフ制限に達した後、失敗しました

ジョブの Pod が完了したかどうかを確認しましょう。

kubectl get pods

次のようなものが表示されるはずです。

NAME              READY   STATUS      RESTARTS   AGE
hello-job-abcd1   0/1     Completed   0          1m

STATUS 列は Completed を示しており、ジョブが正常に実行されたことを示しています。

より長い時間を要するジョブの作成

Active 状態で観察できるように、完了に時間がかかる別のジョブを作成しましょう。

cd ~/project
nano long-job.yaml

次の YAML コンテンツをコピーして貼り付けます。

apiVersion: batch/v1
kind: Job
metadata:
  name: long-job
spec:
  template:
    spec:
      containers:
        - name: long
          image: busybox:1.28
          command:
            [
              "sh",
              "-c",
              'echo "Starting long job..." && sleep 30 && echo "Long job completed!"'
            ]
      restartPolicy: Never
  backoffLimit: 4

ファイルを保存して nano を終了します。次に、ジョブを作成します。

kubectl apply -f long-job.yaml

次に、すぐにその状態を確認しましょう。

kubectl get jobs

long-job がまだ実行中のため、0/1 の完了が表示されるはずです。数秒ごとに確認を続けると、約 30 秒後に 1/1 に変わるのが確認できます。

これは、kubectl を使用してジョブの進行状況をリアルタイムで監視する方法を示しています。

Kubernetes ジョブのログの分析

Kubernetes ジョブからのログを表示および分析できることは、デバッグとジョブの動作を理解するために不可欠です。このステップでは、作成したジョブからログにアクセスして分析する方法を説明します。

ジョブの Pod 名の取得

ログを表示する前に、ジョブによって作成された Pod の名前を知る必要があります。各ジョブは、ジョブ名とランダムなサフィックスを含む名前を持つ 1 つ以上の Pod を作成します。

ジョブに関連するすべての Pod を一覧表示しましょう。

kubectl get pods --show-labels

これにより、すべての Pod とそのラベルが表示されます。 job-name=hello-jobjob-name=long-job などのラベルを持つ Pod を探してください。

または、ジョブ名で Pod をフィルタリングすることもできます。

kubectl get pods -l job-name=hello-job

これにより、hello-job ジョブに属する Pod のみが表示されます。

ジョブ ログの表示

Pod の名前がわかったので、ジョブのログを表示できます。次のコマンドを使用し、<pod-name> を実際の Pod の名前に置き換えます。

kubectl logs <pod-name>

たとえば、Pod の名前が hello-job-abcd1 の場合、次のように実行します。

kubectl logs hello-job-abcd1

次のような出力が表示されるはずです。

Hello, Kubernetes!

これは、ジョブが出力するようにプログラムされたメッセージです。

長いジョブのログも確認しましょう。まず、Pod の名前を見つけます。

kubectl get pods -l job-name=long-job

次に、そのログを表示します。

kubectl logs <long-job-pod-name>

次のような出力が表示されるはずです。

Starting long job...
Long job completed!

完了したジョブのログの表示

Kubernetes ジョブの利点の 1 つは、ジョブが完了した後でもログを表示できることです。これは、デバッグや監査の目的で非常に役立ちます。

失敗するジョブを作成して、デバッグ方法を確認しましょう。

cd ~/project
nano failed-job.yaml

次の YAML コンテンツをコピーして貼り付けます。

apiVersion: batch/v1
kind: Job
metadata:
  name: failed-job
spec:
  template:
    spec:
      containers:
        - name: failed
          image: busybox:1.28
          command: ["sh", "-c", 'echo "Attempting task..." && exit 1']
      restartPolicy: Never
  backoffLimit: 2

このジョブは、常にステータスコード 1 で終了し、これは失敗を示します。ファイルを保存して nano を終了し、ジョブを作成します。

kubectl apply -f failed-job.yaml

ジョブが数回試行して失敗するまで(バックオフ制限まで)しばらく待ちます。次に、その状態を確認します。

kubectl get jobs failed-job

0/1 の完了が表示され、完了期限に達していることがわかります。

次に、失敗した Pod のログを確認して、何が問題だったのかを調べましょう。

kubectl get pods -l job-name=failed-job

いくつかの Pod が表示され、すべて Error 状態になっています。1 つを選択して、そのログを表示します。

kubectl logs <failed-pod-name>

次のような出力が表示されるはずです。

Attempting task...

Pod のログは、タスクが開始されたが、エラーコードで終了したことを示しています。この情報は、ジョブの失敗をデバッグするために不可欠です。

リアルタイムでのログの追跡

実行中のジョブのログをリアルタイムで追跡する場合は、-f フラグを使用できます。

kubectl logs -f <pod-name>

これは、出力が進行状況に合わせて表示されるようにしたい、より長い実行時間のジョブに特に役立ちます。

デモンストレーションのために、別の長時間実行ジョブを作成しましょう。

cd ~/project
nano counter-job.yaml

次の YAML コンテンツをコピーして貼り付けます。

apiVersion: batch/v1
kind: Job
metadata:
  name: counter-job
spec:
  template:
    spec:
      containers:
        - name: counter
          image: busybox:1.28
          command:
            [
              "sh",
              "-c",
              'for i in $(seq 1 5); do echo "Count: $i"; sleep 5; done'
            ]
      restartPolicy: Never

ファイルを保存して nano を終了し、ジョブを作成します。

kubectl apply -f counter-job.yaml

次に、そのログを追跡しましょう。まず、Pod の名前を見つけます。

kubectl get pods -l job-name=counter-job

次に、そのログを追跡します。

kubectl logs -f <counter-job-pod-name>

5 秒ごとにカウントが増加するのがわかります。

Count: 1
Count: 2
Count: 3
Count: 4
Count: 5

ログの追跡を停止するには、Ctrl+C を押します。

ログへのアクセスと分析の方法を理解することで、Kubernetes ジョブを効果的にトラブルシューティングし、デバッグできます。

高度なジョブ監視テクニック

Kubernetes ジョブの監視の基本を理解したところで、特に本番環境でジョブをより効果的に監視するのに役立つ、より高度なテクニックをいくつか見ていきましょう。

ラベルを使用したジョブの整理

ラベルは、Kubernetes リソースに付加できるキーと値のペアです。リソースのサブセットを整理および選択するのに役立ちます。カスタムラベルを使用してジョブを作成しましょう。

cd ~/project
nano labeled-job.yaml

次の YAML コンテンツをコピーして貼り付けます。

apiVersion: batch/v1
kind: Job
metadata:
  name: labeled-job
  labels:
    department: engineering
    app: demo
    environment: training
spec:
  template:
    spec:
      containers:
        - name: labeled
          image: busybox:1.28
          command: ["sh", "-c", 'echo "This is a labeled job" && sleep 10']
      restartPolicy: Never

ファイルを保存して nano を終了し、ジョブを作成します。

kubectl apply -f labeled-job.yaml

これで、ラベルでジョブをフィルタリングできます。

kubectl get jobs -l department=engineering

これにより、department=engineering ラベルを持つジョブのみが表示されます。

より具体的なフィルタリングには、複数のラベルを使用できます。

kubectl get jobs -l department=engineering,environment=training

ジョブイベントの監視

Kubernetes は、ジョブのさまざまな状態変化に対してイベントを生成します。これらのイベントは、ジョブのライフサイクルに関する貴重な情報を提供できます。

ジョブに関連するイベントを表示しましょう。

kubectl get events --sort-by=.metadata.creationTimestamp

このコマンドは、名前空間内のすべてのイベントを時間順に表示します。特定のジョブに関連するイベントをフィルタリングできます。

kubectl get events --field-selector involvedObject.name=labeled-job

これらのイベントは、ジョブがいつ、なぜ作成、開始、または問題が発生したかを理解するのに役立ちます。

JSONPath を使用したカスタム出力

Kubernetes では、kubectl コマンドの出力から特定のフィールドを抽出するために JSONPath を使用できます。これは、ジョブの特定の側面に焦点を当てるのに役立ちます。

kubectl get job labeled-job -o jsonpath='{.status.succeeded}'

このコマンドは、labeled-job の成功した Pod の数を出力します。

ジョブの作成時間を取得するには、次のようにします。

kubectl get job labeled-job -o jsonpath='{.metadata.creationTimestamp}'

スケジュールされた実行のための CronJob の作成

スケジュールに従って実行する必要があるタスクの場合、Kubernetes は CronJob を提供します。簡単な CronJob を作成しましょう。

cd ~/project
nano simple-cronjob.yaml

次の YAML コンテンツをコピーして貼り付けます。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: simple-cronjob
spec:
  schedule: "*/1 * * * *" ## Run every minute
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: hello
              image: busybox:1.28
              command: ["sh", "-c", 'date; echo "Hello from CronJob"']
          restartPolicy: Never

ファイルを保存して nano を終了し、CronJob を作成します。

kubectl apply -f simple-cronjob.yaml

CronJob が作成されたことを確認します。

kubectl get cronjobs

次のような出力が表示されるはずです。

NAME             SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
simple-cronjob   */1 * * * *   False     0        <none>          10s

1、2 分ほど待ってから、CronJob によって作成されたジョブを確認します。

kubectl get jobs

simple-cronjob-<timestamp> のような名前のジョブが表示されるはずです。

最新の CronJob 実行のログを表示するには、まず Pod を見つけます。

kubectl get pods --sort-by=.metadata.creationTimestamp

次に、そのログを表示します。

kubectl logs <latest-cronjob-pod>

CronJob は、Kubernetes クラスタで定期的なタスクをスケジュールするのに強力であり、これまで学習した同じ監視テクニックをそれらにも適用できます。

クリーンアップ

終了する前に、作成したリソースをクリーンアップしましょう。

kubectl delete job hello-job long-job failed-job counter-job labeled-job
kubectl delete cronjob simple-cronjob

これにより、すべてのジョブと CronJob がクラスタから削除されます。

まとめ

このチュートリアルでは、Kubernetes ジョブを効果的に監視し、そのログを分析する方法を学びました。これで、次のことができるようになりました。

  • Minikube を使用して Kubernetes 環境をセットアップする
  • さまざまな設定で Kubernetes ジョブを作成する
  • kubectl get および kubectl describe を使用してジョブの状態を監視する
  • kubectl logs を使用してジョブログにアクセスし、分析する
  • より効果的な監視のために、ラベル、イベント、JSONPath などの高度なテクニックを使用する
  • CronJob を使用してスケジュールされたジョブを作成する

これらのスキルは、Kubernetes 環境でコンテナ化されたアプリケーションを管理するために不可欠であり、バッチプロセスの信頼性とパフォーマンスを確保できます。ジョブの進捗状況を追跡し、ログを通じて問題をトラブルシューティングする方法を理解することで、効率的でエラーのない Kubernetes ワークロードを維持できます。

Kubernetes の旅を続ける中で、リソース管理、ジョブの並列処理、Prometheus や Grafana などの外部監視ソリューションとの統合など、より高度なトピックを検討してください。