LoginSignup
9
1

More than 1 year has passed since last update.

Kubernetes 1.23: SIG-Apps の変更内容

Last updated at Posted at 2021-12-24

はじめに

このページではKubernetes v1.23 における SIG-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 が対象。
      Kubernetes基礎_-_Google_Slides.png
    • 詳細について知りたい方はこちらをご参照ください。

SIG-Apps 以外の SIG に関する変更は以下にまとめてありますので、合わせてご参照下さい。

注目の変更

Feature Gatesの中で今回Stageに変更のあったSig-Appsに関連する機能は以下になります。

  • Job

    • JobTrackingWithFinalizersBeta
    • JobReadyPodsAlpha
    • TTLAfterFinishedGA
  • StatefulSet

    • StatefulSetAutoDeletePVCAlpha
    • StatefulSetMinReadySecondsBeta

上記のうちで今回追加されたJobReadyPodsStatefulSetAutoDeletePVCについてもう少し詳しく記載します。その他の機能については、過去のSIG-Apps の変更内容をご確認下さい。

Job

Track ready Pods in Job status

実行中のJobのステータスについては元々status.activeが存在しました。このフィールドはpendingrunningの合計数が格納されています。この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.scheduleCRON_TZを指定することで任意のタイムゾーンでCronJobを実行できるようになり、公式ドキュメントの方にもその方法が記載されました。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
-  schedule: "CRON_TZ=Asia/Tokyo 15 18 * * *"
  jobTemplate:

その件についてはその後に議論された結果、本番環境での利用については推奨しない旨の警告文が追加されました。

CronJob___Kubernetes.png

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 に関するものについて以下に和訳したものを記載します。

:pencil: がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。

:wastebasket: Deprecation(非推奨)

該当なし

:earth_asia: 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)

    • :pencil: WindowsOSを使用する際の識別等に使うためのフィールドが追加されたようです。
  • JobTrackingWithFinalizersがBetaになり、デフォルトで有効になりました。 (#105687, @alculquicondor)

  • KubeletがNodeのOSラベルとマッチするPodでなかった場合は、リジェクトするようになりました。 (#105292, @ravisantoshgudimetla) [SIG Apps and Node]

  • fieldValidation=[Strict,Warn,Ignore]が導入され、サーバサイドでリクエストのスキーマが厳密にチェックされるようになりました。 (#105916, @kevindelgado)

    • :pencil: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)

:sparkle: FEATURE(機能追加)

  • workqueue APIにProcessingのconditionが追加されました。
    workqueueAPIの Shutdownを変更して、ワークキューがすべての処理中のアイテムの処理を完了するまで待機するようにしました。(#101928, @alexanderConstantinescu)

  • Client-go: fake clientReactorDeleteOptionsを渡します。 (#102945, @chenchun)

  • ユーザが手動でPVを削除しようとした時に、PVのReclaimPolicyDeleteであることを確認してから、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)

:page_facing_up: Documentation(ドキュメント改善)

:tools: ENHANCEMENT(機能改善)

該当なし

:bug: 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)

    • :pencil:jobで作成されたPodの-が一個多かった件の修正です。1.22でjobを触ってる時にずっと違和感があったので修正してもらえて個人的は嬉しいです。

      - job-name--1-
      + job-name-1-
      

:microscope: Other (その他の修正)

  • 解析不能な status.certificateフィールドを持つCertificateSigningRequestオブジェクトをクリーンアップするように修正しました。 (#103823, @liggitt)

  • 既に非推奨になっていたcronjob controllerが削除されました。 (#106126, @soltysh) [SIG Apps]

    • :pencil: 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に期待したいと思います。

9
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1