はじめに
このページではKubernetes v1.23 における SIG-Apps に関連する変更内容をまとめています。
- https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.22.md
- https://relnotes.k8s.io/?releaseVersions=1.23.0&sigs=apps
SIG-AppsはKubernetesのワークロードの扱いなどの変更を主に扱っているため、他のSIGと関係する変更が多くなっております。
- 直近での過去の変更内容は以下になります。
SIG / SIG-Apps とは?
-
SIGとは?
- Special Interest Groups の略称
- 各 SIG には Subproject が与えられていて、 Subproject に対して独立して開発できるようになっています。
- Kubernetes は巨大なプロジェクトなので、各SIG 毎に担当(Subproject)が割り当てられていて、各SIG は独立して開発をしています。
- SIG 間を跨って話し合いをする必要が生じた場合は Working Groups が一時的に作られ、その枠組みの中で話し合うことになります。
-
SIG-Appsとは?
- Apps Special Interest Group の略称
- Kubernetes に対して、application を deploy したりすることに関することが対象。具体的には Pod, ReplicaSet, Deployments, DaemonSet, StatefulSet, Jobs, CronJob が対象。
- 詳細について知りたい方はこちらをご参照ください。
SIG-Apps 以外の SIG に関する変更は以下にまとめてありますので、合わせてご参照下さい。
注目の変更
Feature Gatesの中で今回Stageに変更のあったSig-Appsに関連する機能は以下になります。
-
Job
-
JobTrackingWithFinalizers
:Beta
-
JobReadyPods
:Alpha
-
TTLAfterFinished
:GA
-
-
StatefulSet
-
StatefulSetAutoDeletePVC
:Alpha
-
StatefulSetMinReadySeconds
:Beta
-
上記のうちで今回追加されたJobReadyPods
とStatefulSetAutoDeletePVC
についてもう少し詳しく記載します。その他の機能については、過去のSIG-Apps の変更内容をご確認下さい。
Job
Track ready Pods in Job status
実行中のJobのステータスについては元々status.active
が存在しました。このフィールドはpending
とrunning
の合計数が格納されています。このpending
が実際はずっとimage pullしている可能性があったりと、active
という表現が誤った印象を与えやすいということで、Podのready
状態をカウントして格納するstatus.ready
のフィールドが追加されました。
- 関連情報
KEP | KEP-2879 |
---|---|
Feature stage | Alpha |
Feature Gate | JobReadyPods |
issue | #2879 |
PR | #104915 |
参考 | 公式ドキュメント |
実際の使用イメージ (クリックすると開きます)
- 以下のようなJobのマニフェストを用意します。
apiVersion: batch/v1
kind: Job
metadata:
name: pi-with-timeout
spec:
completions: 3
backoffLimit: 5
activeDeadlineSeconds: 100
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
- デプロイします。
$ kubectl apply -f job.yaml
job.batch/pi-with-timeout created
$ kubectl get job,po
NAME COMPLETIONS DURATION AGE
job.batch/pi-with-timeout 2/3 18s 18s
NAME READY STATUS RESTARTS AGE
pod/pi-with-timeout-5kwjk 0/1 Completed 0 18s
pod/pi-with-timeout-b8c8f 0/1 Completed 0 9s
pod/pi-with-timeout-plxvs 0/1 ContainerCreating 0 1s
- Jobのstatusに
ready
のフィールドが追加されていることを確認する
$ kubectl get job -ojsonpath='{.items[].status}' | jq
{
"active": 1,
+ "ready": 1,
"startTime": "2021-12-23T06:42:43Z",
"succeeded": 1,
"uncountedTerminatedPods": {}
}
jobにstatus.ready
のフィールドが追加され、カウントされた数値が入っていることが確認できます。
StatefulSet
Auto remove PVCs created by StatefulSet (PersistentVolumeClaim retention)
StatefulSetのvolumeClaimTemplates
によって作成されたPVCについては、不要になった際に手動で削除する必要がありました。これに自動で削除する機能が追加されました。詳細についてはこちらのQiitaに書いたのでそちらをご参照ください。
- 関連情報
KEP | KEP-2214 |
---|---|
Feature stage | Alpha |
Feature Gate | StatefulSetAutoDeletePVC |
issue | #1847 |
PR | #99728 |
参考 | 公式ドキュメント |
CronJobでのタイムゾーンの指定について
v1.22の時にcronのライブラリをv3に更新した結果
- github.com/robfig/cron v1.1.0
+ github.com/robfig/cron/v3 v3.0.1
以下のようにCronJobのspec.schedule
にCRON_TZ
を指定することで任意のタイムゾーンでCronJobを実行できるようになり、公式ドキュメントの方にもその方法が記載されました。
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
- schedule: "CRON_TZ=Asia/Tokyo 15 18 * * *"
jobTemplate:
その件についてはその後に議論された結果、本番環境での利用については推奨しない旨の警告文が追加されました。
ref https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/
議論の内容を要約すると、k8sのspecで定義されてコミュニティで実装したものではなく内部のライブラリの機能により偶発的に動くようになっただけであり、コミュニティとしてこの機能をサポートする意思決定はなされてないので非推奨とする。CronJobでのタイムゾーンの指定については別途対応していくという形になります。
ref https://github.com/kubernetes/kubernetes/issues/47202#issuecomment-970696621
現状、タイムゾーンの指定が必要なケースではCronjobberを利用するか、独自実装するケースが多いと思いますが、k8sの機能として正式にサポートされることを熱望するコメントも多数ありました。
CronJobでのタイムゾーンの指定する件については既にこちらのPRがありますが、2021年6月くらいから動きが止まっているので今後に期待しています。
v1.23 Release Notes
v1.23 Release Notes の中で SIG-Apps に関するものについて以下に和訳したものを記載します。
がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。
Deprecation(非推奨)
該当なし
API Changes(API変更)
-
feature gate
StatefulSetAutoDeletePVC
が追加されました。この機能を使用するとStatefulSetのpodsによって作成されたPVCが自動で削除されるようになります。 (#99728, @mattcary) -
HPAのv2beta2からv2になり、一部のフィールドが変更になりました。 (#102534, @wangyysde) [SIG API Machinery, Apps, Auth, Autoscaling and Testing]
-
Ephemeral containersがBetaからGAになりデフォルトで有効化されるようになりました。(#105405, @verb)
-
PodSpecに
OS
フィールドが追加されました。 (#104693, @ravisantoshgudimetla)- WindowsOSを使用する際の識別等に使うためのフィールドが追加されたようです。
-
JobTrackingWithFinalizersがBetaになり、デフォルトで有効になりました。 (#105687, @alculquicondor)
-
KubeletがNodeのOSラベルとマッチするPodでなかった場合は、リジェクトするようになりました。 (#105292, @ravisantoshgudimetla) [SIG Apps and Node]
-
fieldValidation=[Strict,Warn,Ignore]
が導入され、サーバサイドでリクエストのスキーマが厳密にチェックされるようになりました。 (#105916, @kevindelgado)-
fieldValidation
の設定が追加されました。-
Strict
:不明なフィールドが存在する場合はリクエストがエラー -
Warn
:不明なフィールドが存在する場合はリクエストは成功するが、警告が出る -
Ignore
:不明なフィールドが存在する場合はリクエストが成功
-
-
-
StatefulSetの
minReadySeconds
がBetaになりました。(#104045, @ravisantoshgudimetla) -
Generic Ephemeral Volume
がGAとなりました。この機能は無条件で有効化されます。 (#105609, @pohly) -
TTLAfterFinished
がGAになりデフォルトで有効化されるようになりました。 (#105219, @sahilvv) -
JobのPodのうち、ReadyになっているPodの数をトラッキングするようになりました。この機能はAlphaなのでfeature gate
JobReadyPods
を有効化する必要があります。 (#104915, @alculquicondor)
FEATURE(機能追加)
-
workqueue
APIにProcessing
のconditionが追加されました。
workqueue
APIのShutdown
を変更して、ワークキューがすべての処理中のアイテムの処理を完了するまで待機するようにしました。(#101928, @alexanderConstantinescu) -
Client-go: fake client
Reactor
にDeleteOptions
を渡します。 (#102945, @chenchun) -
ユーザが手動でPVを削除しようとした時に、PVの
ReclaimPolicy
がDelete
であることを確認してから、storage backendからvolumeを削除します。 (#105773, @deepakkinni) -
Feature gate
StorageObjectInUseProtection
が非推奨となり、無効化することもできません。1.25で完全に削除されます。 (#105495, @ikeeip) -
Jobがsuspendedされまだ開始していない時に、Node affinity, Node selectors,tolerationsが変更可能になりました。 (#105479, @ahg-g)
-
JobのPod templateのannotationsとlabelsは、suspendedでまだ開始されたことないの場合に変更可能になりました。 (#105980, @ahg-g)
-
JobTrackingWithFinalizers
が有効になっている場合、以下のようになります。- 小さなjobsによる枯渇を避けるためにsingle JobのPodのトラッキング数に制限を設けます。
- Job controllerは完了したPodをトラッキングし、カウントした数を
job_pod_finished_total
のメトリクスに出力します。
(#105197, @alculquicondor)
Documentation(ドキュメント改善)
- ユーザはCronjobで時刻を指定する際に、サポートされていない
CRON_TZ
を使用しないようにしてください。使用した場合はAPI serverとcronjob controllerの両方から警告が出ます。 https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ containing explanation (#106455, @soltysh) [SIG Apps]
ENHANCEMENT(機能改善)
該当なし
BUGFIX(バグ修正)
-
EndpointSlice Mirroring controllerは管理しているEndpointSlicesにService selectorが追加された時にクリーンアップされるようになりました。 (#105997, @robscott) [SIG Apps, Network and Testing]
-
job controllerの同期の修正:競合が起こった際に、最新の情報に同期するようになります。これによりJobTrackingWithFinalizersの信頼性が向上します。 (#105214, @alculquicondor)
-
500以上のPodのfinalizersをトラッキングするjobの修正。Podをカウントする前に全てのfinalizers削除されているか確認するようにしました。 (#104666, @alculquicondor)
-
NonIndexed Jobsの名前に含まれる
-1
が修正されました。 (#105676, @alculquicondor)-
jobで作成されたPodの
-
が一個多かった件の修正です。1.22でjobを触ってる時にずっと違和感があったので修正してもらえて個人的は嬉しいです。- job-name--1- + job-name-1-
-
Other (その他の修正)
-
解析不能な
status.certificate
フィールドを持つCertificateSigningRequest
オブジェクトをクリーンアップするように修正しました。 (#103823, @liggitt) -
既に非推奨になっていたcronjob controllerが削除されました。 (#106126, @soltysh) [SIG Apps]
- v1のコントローラーがコードから削除されたことで、cronjob controller v2への移行がこれで完全に完了しました。
-
Surface warning when users don't set
propagationPolicy
for jobs while deleting. (#104080, @ravisantoshgudimetla) -
ユーザがジョブの削除で
propagationPolicy
を設定しない場合に警告が出るようになりました。 (#104080, @ravisantoshgudimetla)
所感
今回の一番大きな変更はStatefulSetAutoDeletePVC
かなと思います。便利な機能ですが、使い方を間違えると意図しないデータ削除につながるため、十分な検証の上で使用するようにしてください。その他については順調にFeature GatesのStageがBetaやGAに移行したと思います。Job周りについて小さな改善が多く以前より信頼性が向上したように見えます。次回はJobTrackingWithFinalizers
のGAに期待したいと思います。