はじめに
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-apiserver、kube-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+O、Enter の順に押してファイルを保存し、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-job や job-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 などの外部監視ソリューションとの統合など、より高度なトピックを検討してください。


