はじめに
Kubernetes では、長時間稼働するアプリケーションやサービスの一部ではないタスクを実行するために、ジョブとクロンジョブが使用されます。ジョブは一度限りのタスクに使用され、クロンジョブは定期的に実行する必要のあるタスクに使用されます。
この実験では、Kubernetes でジョブとクロンジョブを使ってポッドを実行する方法を学びます。簡単な例から始めて、徐々に複雑な例に至ります。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
Kubernetes では、長時間稼働するアプリケーションやサービスの一部ではないタスクを実行するために、ジョブとクロンジョブが使用されます。ジョブは一度限りのタスクに使用され、クロンジョブは定期的に実行する必要のあるタスクに使用されます。
この実験では、Kubernetes でジョブとクロンジョブを使ってポッドを実行する方法を学びます。簡単な例から始めて、徐々に複雑な例に至ります。
リソースを作成する前に、稼働している Kubernetes クラスタが必要です。Minikube は、ローカル マシン上で動作する軽量な Kubernetes 環境です。
作業ディレクトリに移動する:
ターミナルを開き、デフォルトのプロジェクト フォルダに移動します。
cd /home/labex/project
Minikube を起動する:
Minikube を起動して Kubernetes クラスタを初期化します。
minikube start
Minikube が稼働していることを確認する:
Minikube クラスタの状態を確認します。
minikube status
kubelet
や apiserver
などのコンポーネントが Running
と表示されていることを確認します。minikube start
を再度実行します。Minikube の起動に問題がある場合は、必要に応じて minikube delete
を使用して環境をリセットします。
最初のステップは、ジョブを実行するポッドを作成することです。この例では、コンソールに "Hello, World!" と表示するコマンドを実行するポッドを作成します。
/home/labex/project/
以下に job.yaml
という名前のファイルを作成し、以下の内容を記述します。
apiVersion: batch/v1
kind: Job
metadata:
name: hello-job
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["sh", "-c", 'echo "Hello, World!"']
restartPolicy: Never
backoffLimit: 4
このファイルでは、hello-job
という名前のジョブを定義しており、このジョブは hello
という名前の単一のコンテナを実行します。コンテナは busybox
イメージを実行し、コンソールに "Hello, World!" と表示するコマンドを実行します。
ジョブを作成するには、次のコマンドを実行します。
kubectl apply -f job.yaml
ジョブの状態を確認するには、次のコマンドを実行します。
kubectl get jobs
ジョブが完了したら、次のコマンドを実行してポッドのログを表示できます。
kubectl logs <POD_NAME>
<POD_NAME>
を、ジョブを実行したポッドの名前に置き換えてください。kubectl get pods |grep hello-job
コマンドで POD_NAME
を取得できます。
おめでとうございます。Kubernetes でジョブでポッドを成功裏に実行しました!
場合によっては、より良いパフォーマンスのために複数のポッドでジョブを実行する必要があります。この例では、リモート サーバーからファイルをダウンロードするために複数のポッドを実行するジョブを作成します。
/home/labex/project/
以下に multi-pod-job.yaml
という名前のファイルを作成し、以下の内容を記述します。
apiVersion: batch/v1
kind: Job
metadata:
name: download-job
spec:
completions: 3
parallelism: 2
template:
spec:
containers:
- name: downloader
image: curlimages/curl
command: ["curl", "-o", "/data/file", "http://example.com/file"]
volumeMounts:
- name: data-volume
mountPath: /data
restartPolicy: Never
volumes:
- name: data-volume
emptyDir: {}
backoffLimit: 4
このファイルでは、curlimages/curl
イメージを使って複数のポッドを実行する download-job
という名前のジョブを定義しています。各ポッドは http://example.com/file
からファイルをダウンロードし、data-volume
という名前の共有ボリュームに保存します。
ジョブを作成するには、次のコマンドを実行します。
kubectl apply -f multi-pod-job.yaml
ジョブの状態を確認するには、次のコマンドを実行します。
kubectl get jobs
ジョブが完了したら、次のコマンドを実行してポッドのログを表示できます。
kubectl logs <POD_NAME>
<POD_NAME>
を、ジョブを実行した任意のポッドの名前に置き換えてください。ファイルのダウンロード ログを確認でき、kubectl get pod |grep download-job
コマンドで POD_NAME
を取得できます。
おめでとうございます。Kubernetes で複数のポッドでジョブを成功裏に実行しました!
一度限りのジョブに加えて、Kubernetes は定期的にタスクを実行するためのクロンジョブもサポートしています。この例では、毎分コマンドを実行するクロンジョブを作成します。
/home/labex/project/
以下に cronjob.yaml
という名前のファイルを作成し、以下の内容を記述します。
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello-cronjob
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["sh", "-c", 'echo "Hello, World!"']
restartPolicy: Never
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3
このファイルでは、毎分コマンドを実行する hello-cronjob
という名前のクロンジョブを定義しています。コマンドは、最初の例でコンソールに "Hello, World!" と表示するために使用したものと同じです。
クロンジョブを作成するには、次のコマンドを実行します。
kubectl apply -f cronjob.yaml
クロンジョブの状態を確認するには、次のコマンドを実行します。
kubectl get cronjobs
クロンジョブが実行されているときは、次のコマンドを実行してポッドのログを表示できます。
kubectl logs -f <POD_NAME>
<POD_NAME>
を、クロンジョブによって作成された任意のポッドの名前に置き換えてください。kubectl get pod |grep hello-cronjob
コマンドで POD_NAME
を取得できます。
おめでとうございます。Kubernetes でクロンジョブを成功裏に実行しました!
この実験では、Kubernetes でポッドをジョブとクロンジョブで実行する方法を学びました。まずは、ジョブを実行する単純なポッドの例から始め、徐々に複数のポッドや定期的に実行されるクロンジョブを持つより複雑なジョブの例に至りました。この知識を使えば、Kubernetes で長時間実行されるアプリケーションやサービスの一部ではない様々なタスクを実行できます。