アプリケーションが実際に生きる姿を見る
このラボはアプリケーションが実際に動くクラスターで行います
VMの中に本物のk3sが起動しています。kubeletがプローブを実際に実行し、Jobが実際に完了し、ConfigMapが実際にマウントされます。
CKADコースの他のラボが動く疑似クラスターでは、これらのどれも起こりません。プローブを設定しても動かず、Jobを作っても完了しません。
最初の起動には2分ほどかかります。
目標
3種類のプローブ、JobとCronJob、QoS、設定の注入を動作で確認します。
なぜ重要なのか
CKADでよく間違えるのは、文法ではなく動作の違いです。
startupProbeがなぜ必要なのかは、起動が遅いアプリケーションに短いlivenessを設定してみて初めてわかります。起動が終わる前に死んで再起動するのを、永遠に繰り返します。completionsとparallelismは、それぞれ「何回成功する必要があるか」と「いくつを同時に動かすか」です。混同すると、Jobがいつまでも終わらなかったり、必要以上に動いたりします。- ConfigMapをボリュームとして入れると値が変わったときにファイルが更新されますが、環境変数として入れるとPodを作り直す必要があります。
ステップ
すべてのリソースはネームスペース(ckad)に作成します。
- 起動に20秒ほどかかるコンテナ(
slow-start)に、短いlivenessProbeとstartupProbeを一緒に設定し、再起動なしで準備が整う様子を記録してください(保存先:/root/ckad/startup.txt)。 - Deployment(
api、レプリカ3)とServiceを作成します。ただし1つのPodだけreadinessが失敗するようにして、エンドポイントから外れる様子を記録してください(保存先:/root/ckad/endpoints.txt)。 - Job(
batch、completions: 3、parallelismを指定)が実際に完了する様子を記録してください(保存先:/root/ckad/job.txt)。 - Job(
doomed)がbackoffLimitを使い切ってFailedになる様子を記録してください(保存先:/root/ckad/backoff.txt)。 - CronJob(
tick)を作成して実際に1回以上動かし、記録してください(保存先:/root/ckad/cronjob.txt)。concurrencyPolicyも決めます。 - 3つのPod(
qos-guaranteed、qos-burstable、qos-besteffort)でQoSクラス3種類を作成し、記録してください(保存先:/root/ckad/qos.txt)。 - Pod(
cfg-pod)にConfigMapをボリュームと環境変数の両方で注入し、Podの中でどう見えるかを記録してください(保存先:/root/ckad/config.txt)。 - レポートファイル(
/root/ckad/report.md)に、startup_restarts=、job_completions=、evicted_first=の3行と説明を書いてください。
参考
startupProbeが成功するまで、livenessProbeとreadinessProbeは開始されません。そのため、起動が遅いアプリケーションに使います。- Jobの状態は
kubectl -n ckad get job batch -o jsonpath='{.status}'で確認します。 - QoSは
kubectl get pod <이름> -o jsonpath='{.status.qosClass}'にあります(プレースホルダーはPod名です)。直接指定するのではなく、requests/limitsで決まります。 - CronJobの
scheduleは*/1 * * * *のように書きます。1分ごとなら、ラボの最中に1回は動きます。 - よくある間違い1:
startupProbeだけを設定してlivenessProbeを設定しないことです。startupProbeはlivenessを後回しにするための仕組みなので、単独では意味がありません。 - よくある間違い2: QoSの
Guaranteedを作ろうとして、requestsだけを指定してしまうことです。requestsとlimitsが、すべてのリソースで完全に同じである必要があります。
起動が遅いとき
起動に20秒ほどかかるコンテナ(slow-start)に、短いlivenessProbeとstartupProbeを一緒に設定し、再起動なしで準備が整う様子を記録してください(保存先: /root/ckad/startup.txt)。
短いlivenessだけを設定すると、起動が終わる前に死んでしまいます。startupProbeがそれを後回しにしてくれます。
準備ができていないPodは外れる
Deployment(api、レプリカ3)とServiceを作成します。ただし1つのPodだけreadinessが失敗するようにして、エンドポイントから外れる様子を記録してください(保存先: /root/ckad/endpoints.txt)。
3つのレプリカのうち1つだけreadinessが失敗するようにして、EndpointSliceを確認してください。
completionsとparallelism
Job(batch、completions: 3、parallelismを指定)が実際に完了する様子を記録してください(保存先: /root/ckad/job.txt)。
completionsは何回成功する必要があるか、parallelismはいくつを同時に動かすか、です。
Jobはいつあきらめるのか
Job(doomed)がbackoffLimitを使い切ってFailedになる様子を記録してください(保存先: /root/ckad/backoff.txt)。
backoffLimitの回数だけ再試行したあと、Failed条件が付きます。小さく設定すれば待たずに済みます。
実行が重なるとき
CronJob(tick)を作成して実際に1回以上動かし、記録してください(保存先: /root/ckad/cronjob.txt)。concurrencyPolicyも決めます。
*/1 * * * *で1分ごとに動かし、1回以上実行されるのを待ってください。concurrencyPolicyも決めます。
リソースが足りないとき、誰が先に追い出されるのか
3つのPod(qos-guaranteed、qos-burstable、qos-besteffort)でQoSクラス3種類を作成し、記録してください(保存先: /root/ckad/qos.txt)。
QoSは直接指定するのではなく、requests/limitsの組み合わせで決まります。
ボリュームと環境変数は違う
Pod(cfg-pod)にConfigMapをボリュームと環境変数の両方で注入し、Podの中でどう見えるかを記録してください(保存先: /root/ckad/config.txt)。
同じConfigMapを2つの方式で注入し、Podの中でどう見えるかを比べてください。
何を学んだのか
レポートファイル(/root/ckad/report.md)に、startup_restarts=、job_completions=、evicted_first=の3行と説明を書いてください。
startup_restarts=、job_completions=、evicted_first=の3行と説明を書いてください。