Kubernetes 1.23: SIG-Apps の変更内容

## はじめに

このページでは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と関係する変更が多くなっております。

- 直近での過去の変更内容は以下になります。
  - [Kubernetes 1.22: SIG-Apps の変更内容](https://qiita.com/yosshi_/items/95b8a38ad1c44a0266bd)
  - [Kubernetes 1.21: SIG-Apps の変更内容](https://qiita.com/yosshi_/items/ec042a801ef69fa44ef6)
  - [Kubernetes 1.20: SIG-Apps の変更内容](https://qiita.com/yosshi_/items/20994d6446688c5c066a)


<details><summary>SIG / SIG-Apps とは？</summary><div>

- 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309176/78f42f49-da9f-c268-9034-e8d73556334a.png)
    - 詳細について知りたい方は[こちら](https://github.com/kubernetes/community/tree/master/sig-apps)をご参照ください。




</div></details>


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

- [Kubernetes 1.23: 変更点まとめ(What's new!)とアップグレード時の注意事項](https://qiita.com/uesyn/items/ffbdb26daa727fdc9db2)


## 注目の変更
Feature Gatesの中で今回Stageに変更のあった[Sig-Appsに関連する機能](https://github.com/kubernetes/enhancements/tree/master/keps/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](https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/2879-ready-pods-job-status)  |
| ---- | ---- |
|  **Feature stage**  |  **Alpha**  |
|  **Feature Gate**  |  **JobReadyPods** | 
|  **issue**  |  **[#2879](https://github.com/kubernetes/enhancements/issues/2879)** | 
|  **PR**  |  **[#104915](https://github.com/kubernetes/kubernetes/pull/104915)** | 
|  **参考**  |  **[公式ドキュメント](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/job-v1/#JobStatus)** | 

<details><summary>実際の使用イメージ (クリックすると開きます)</summary><div>


- 以下のようなJobのマニフェストを用意します。

```yaml
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`のフィールドが追加されていることを確認する

```diff
$ kubectl get job -ojsonpath='{.items[].status}' | jq
{
  "active": 1,
+  "ready": 1,
  "startTime": "2021-12-23T06:42:43Z",
  "succeeded": 1,
  "uncountedTerminatedPods": {}
}
```

jobに`status.ready`のフィールドが追加され、カウントされた数値が入っていることが確認できます。


</div></details>

### StatefulSet

#### Auto remove PVCs created by StatefulSet (PersistentVolumeClaim retention)

StatefulSetの`volumeClaimTemplates`によって作成されたPVCについては、不要になった際に手動で削除する必要がありました。これに自動で削除する機能が追加されました。詳細については[こちらのQiita](https://qiita.com/yosshi_/items/93dd3b4960412aaca453)に書いたのでそちらをご参照ください。

- 関連情報

|  KEP  |  [KEP-2214](https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/2214-indexed-job)  |
| ---- | ---- |
|  **Feature stage**  |  **Alpha**  |
|  **Feature Gate**  |  **StatefulSetAutoDeletePVC** | 
|  **issue**  |  **[#1847](https://github.com/kubernetes/enhancements/issues/1847)** | 
|  **PR**  |  **[#99728](https://github.com/kubernetes/kubernetes/pull/99728)** | 
|  **参考**  |  **[公式ドキュメント](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention)** | 

## CronJobでのタイムゾーンの指定について
v1.22の時にcronのライブラリをv3に更新した結果

```diff
-   github.com/robfig/cron v1.1.0
+   github.com/robfig/cron/v3 v3.0.1
```

以下のようにCronJobの`spec.schedule`に`CRON_TZ`を指定することで任意のタイムゾーンでCronJobを実行できるようになり、公式ドキュメントの方にもその方法が記載されました。

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

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

![CronJob___Kubernetes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309176/9c7c736b-cbda-8c07-4a9c-2ec0ab771276.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](https://github.com/hiddeco/cronjobber)を利用するか、独自実装するケースが多いと思いますが、k8sの機能として正式にサポートされることを熱望するコメントも多数ありました。

CronJobでのタイムゾーンの指定する件については既にこちらの[PR](https://github.com/kubernetes/kubernetes/pull/102889)がありますが、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](https://github.com/kubernetes/kubernetes/pull/99728), [@mattcary](https://github.com/mattcary))

- HPAのv2beta2からv2になり、一部のフィールドが変更になりました。 ([#102534](https://github.com/kubernetes/kubernetes/pull/102534), [@wangyysde](https://github.com/wangyysde)) [SIG API Machinery, Apps, Auth, Autoscaling and Testing]

- Ephemeral containersがBetaからGAになりデフォルトで有効化されるようになりました。([#105405](https://github.com/kubernetes/kubernetes/pull/105405), [@verb](https://github.com/verb))

- PodSpecに`OS`フィールドが追加されました。 ([#104693](https://github.com/kubernetes/kubernetes/pull/104693), [@ravisantoshgudimetla](https://github.com/ravisantoshgudimetla))
  - :pencil: WindowsOSを使用する際の識別等に使うためのフィールドが追加されたようです。

- JobTrackingWithFinalizersがBetaになり、デフォルトで有効になりました。 ([#105687](https://github.com/kubernetes/kubernetes/pull/105687), [@alculquicondor](https://github.com/alculquicondor))

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

- `fieldValidation=[Strict,Warn,Ignore]`が導入され、サーバサイドでリクエストのスキーマが厳密にチェックされるようになりました。 ([#105916](https://github.com/kubernetes/kubernetes/pull/105916), [@kevindelgado](https://github.com/kevindelgado))
  - :pencil:`fieldValidation`の設定が追加されました。
    - `Strict`:不明なフィールドが存在する場合はリクエストがエラー
    - `Warn`:不明なフィールドが存在する場合はリクエストは成功するが、警告が出る
    - `Ignore`:不明なフィールドが存在する場合はリクエストが成功

- StatefulSetの`minReadySeconds`がBetaになりました。([#104045](https://github.com/kubernetes/kubernetes/pull/104045), [@ravisantoshgudimetla](https://github.com/ravisantoshgudimetla))

- `Generic Ephemeral Volume`がGAとなりました。この機能は無条件で有効化されます。  ([#105609](https://github.com/kubernetes/kubernetes/pull/105609), [@pohly](https://github.com/pohly))

- `TTLAfterFinished`がGAになりデフォルトで有効化されるようになりました。 ([#105219](https://github.com/kubernetes/kubernetes/pull/105219), [@sahilvv](https://github.com/sahilvv))

- JobのPodのうち、ReadyになっているPodの数をトラッキングするようになりました。この機能はAlphaなのでfeature gate `JobReadyPods`を有効化する必要があります。 ([#104915](https://github.com/kubernetes/kubernetes/pull/104915), [@alculquicondor](https://github.com/alculquicondor))


### :sparkle: FEATURE（機能追加）

- `workqueue` APIに`Processing`のconditionが追加されました。
  `workqueue`APIの` Shutdown`を変更して、ワークキューがすべての処理中のアイテムの処理を完了するまで待機するようにしました。([#101928](https://github.com/kubernetes/kubernetes/pull/101928), [@alexanderConstantinescu](https://github.com/alexanderConstantinescu))

- Client-go: fake client`Reactor`に`DeleteOptions`を渡します。 ([#102945](https://github.com/kubernetes/kubernetes/pull/102945), [@chenchun](https://github.com/chenchun))

- ユーザが手動でPVを削除しようとした時に、PVの`ReclaimPolicy`が`Delete`であることを確認してから、storage backendからvolumeを削除します。 ([#105773](https://github.com/kubernetes/kubernetes/pull/105773), [@deepakkinni](https://github.com/deepakkinni))

- Feature gate `StorageObjectInUseProtection`が非推奨となり、無効化することもできません。1.25で完全に削除されます。  ([#105495](https://github.com/kubernetes/kubernetes/pull/105495), [@ikeeip](https://github.com/ikeeip))

- Jobがsuspendedされまだ開始していない時に、Node affinity, Node selectors,tolerationsが変更可能になりました。 ([#105479](https://github.com/kubernetes/kubernetes/pull/105479), [@ahg-g](https://github.com/ahg-g))

- JobのPod templateのannotationsとlabelsは、suspendedでまだ開始されたことないの場合に変更可能になりました。 ([#105980](https://github.com/kubernetes/kubernetes/pull/105980), [@ahg-g](https://github.com/ahg-g))

- `JobTrackingWithFinalizers`が有効になっている場合、以下のようになります。
  - 小さなjobsによる枯渇を避けるためにsingle JobのPodのトラッキング数に制限を設けます。
  - Job controllerは完了したPodをトラッキングし、カウントした数を`job_pod_finished_total`のメトリクスに出力します。
  ([#105197](https://github.com/kubernetes/kubernetes/pull/105197), [@alculquicondor](https://github.com/alculquicondor))


### :page_facing_up: Documentation（ドキュメント改善）
- ユーザはCronjobで時刻を指定する際に、サポートされていない`CRON_TZ`を使用しないようにしてください。使用した場合はAPI serverとcronjob controllerの両方から警告が出ます。 https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ containing explanation ([#106455](https://github.com/kubernetes/kubernetes/pull/106455), [@soltysh](https://github.com/soltysh)) [SIG Apps]

### :hammer_and_wrench: ENHANCEMENT（機能改善）
該当なし

### :bug: BUGFIX(バグ修正)

- EndpointSlice Mirroring controllerは管理しているEndpointSlicesにService selectorが追加された時にクリーンアップされるようになりました。 ([#105997](https://github.com/kubernetes/kubernetes/pull/105997), [@robscott](https://github.com/robscott)) [SIG Apps, Network and Testing]

- job controllerの同期の修正:競合が起こった際に、最新の情報に同期するようになります。これによりJobTrackingWithFinalizersの信頼性が向上します。 ([#105214](https://github.com/kubernetes/kubernetes/pull/105214), [@alculquicondor](https://github.com/alculquicondor))

- 500以上のPodのfinalizersをトラッキングするjobの修正。Podをカウントする前に全てのfinalizers削除されているか確認するようにしました。 ([#104666](https://github.com/kubernetes/kubernetes/pull/104666), [@alculquicondor](https://github.com/alculquicondor))

- NonIndexed Jobsの名前に含まれる`-1`が修正されました。 ([#105676](https://github.com/kubernetes/kubernetes/pull/105676), [@alculquicondor](https://github.com/alculquicondor))
  - :pencil:jobで作成されたPodの`-`が一個多かった件の修正です。1.22でjobを触ってる時にずっと違和感があったので修正してもらえて個人的は嬉しいです。

    ```diff
    - job-name--1-
    + job-name-1-
    ```

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

- 解析不能な `status.certificate`フィールドを持つ`CertificateSigningRequest`オブジェクトをクリーンアップするように修正しました。 ([#103823](https://github.com/kubernetes/kubernetes/pull/103823), [@liggitt](https://github.com/liggitt))

- 既に非推奨になっていたcronjob controllerが削除されました。 ([#106126](https://github.com/kubernetes/kubernetes/pull/106126), [@soltysh](https://github.com/soltysh)) [SIG Apps]
  - :pencil: v1のコントローラーがコードから削除されたことで、cronjob controller v2への移行がこれで完全に完了しました。

- Surface warning when users don't set `propagationPolicy` for jobs while deleting. ([#104080](https://github.com/kubernetes/kubernetes/pull/104080), [@ravisantoshgudimetla](https://github.com/ravisantoshgudimetla))

- ユーザがジョブの削除で`propagationPolicy`を設定しない場合に警告が出るようになりました。 ([#104080](https://github.com/kubernetes/kubernetes/pull/104080), [@ravisantoshgudimetla](https://github.com/ravisantoshgudimetla))

## 所感

今回の一番大きな変更は`StatefulSetAutoDeletePVC`かなと思います。便利な機能ですが、使い方を間違えると意図しないデータ削除につながるため、十分な検証の上で使用するようにしてください。その他については順調にFeature GatesのStageがBetaやGAに移行したと思います。Job周りについて小さな改善が多く以前より信頼性が向上したように見えます。次回は`JobTrackingWithFinalizers`のGAに期待したいと思います。