Kubernetes 1.18: SIG APPS の変更内容

# はじめに

このページでは[Kubernetes 1.18のChangelog](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1180)を基に、SIG APPSに関連する変更内容をまとめています。

SIG-APPSはKubernetesのワークロードの扱いなどの変更を主に扱っているため、他のSIGと関係する変更が多いです。ワークロードの取り扱いやバグについては、この文書を参照してもらうのが良いですが、機能の詳細などは今後公開されていく他のSIGのまとめの方が詳しいと思います。（人によってまとめ方も違うので、それぞれ見て欲しいです。）

この記事は [Kubernetes 1.18の変更点 まとめ](https://qiita.com/watawuwu/items/521d1364b71b863b406c) の一部です。他の変更点もみてみてください。

:memo: がついた文章は筆者の補足です。


※この記事は、[Z Lab](https://qiita.com/organizations/zlab)の業務の一環として作成したものです。

-----

# Changes by Kind

## Deprecation

kube-apiserver:

- 以下の廃止予定だったAPIはもう提供されなくなります
  - 全ての `apps/v1beta1`, `apps/v1beta2` のリソース。代わりに `apps/v1`を使ってください
  - `extensions/v1beta1`以下の`daemonsets`, `deployments`, `replicasets`のリソース。 代わりに `apps/v1` を使ってください
  - `extensions/v1beta1` 以下の networkpolicies` 代わりに `networking.k8s.io/v1` を使ってください
  - `extensions/v1beta1` 以下の podsecuritypolicies` 代わりに `policy/v1beta1` を使ってください

## API Change

なし

### New API types/varsions

- より良いIngress設定を実現する IngressClass リソースが追加されました。([#88509](https://github.com/kubernetes/kubernetes/pull/88509), [@robscott](https://github.com/robscott))  [SIG API Machinery, Apps, CLI, Network, Node and Testing]

### New API fields:

- autoscaling/v2beta2 HorizontalPodAutoscaler に`spec.behavior`フィールドが追加されました。 これによりスケールの振る舞いを設定することができます。振る舞いの設定は スケールアップ、ダウンのそれぞれで指定することができます。ポリシーのリストとして安定性ウインドウを指定することができます。ポリシーは追加、削除されるPodの数の絶対値かパーセンテージを指定します。([#74525](https://github.com/kubernetes/kubernetes/pull/74525), [@gliush](https://github.com/gliush)) [SIG API Machinery, Apps, Autoscaling and CLI]
  - :memo: [KEP: Configurable scale up/down velocity for HPA](https://github.com/kubernetes/enhancements/blob/master/keps/sig-autoscaling/20190307-configurable-scale-velocity-for-hpa.md)に仕様が記載されています。
- `pathType` というフィールドが追加され、これを使うことで リクエストに対してどのように指定されたパスをマッチさせるのかを示すことができます。値としては`Exact`, `Prefix`, `ImplementationSpecific` が設定できます。([#88587](https://github.com/kubernetes/kubernetes/pull/88587), [@cmluciano](https://github.com/cmluciano)) [SIG Apps, Cluster Lifecycle and Network]
- Alphaの機能である`AnyVolumeDataSource`を使うことで PersistentVolumeClaimの spec.dataSourceで独自のデータソースを指定することができます。
  - ([#88636](https://github.com/kubernetes/kubernetes/pull/88636), [@bswartz](https://github.com/bswartz)) [SIG Apps and Storage]
- Alphaの機能である `ServiceAppProtocol` を使うことで、 ServicePort, EndpointPortの定義に `appProtocol` を指定できるようになります。 ([#88503](https://github.com/kubernetes/kubernetes/pull/88503), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
- Alphaの機能である `ImmutableEphemeralVolumes`を使うことで Secret, ConfigMapオブジェクトの `immutable` フィールドを指定し、これらが不変であることを示すことができます。([#86377](https://github.com/kubernetes/kubernetes/pull/86377), [@wojtek-t](https://github.com/wojtek-t))
 - :memo: [KEP: Immutable ephemeral volumes](https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/20191117-immutable-secrets-configmaps.md) このフィールドを設定することでkubeletがConfigMap, Secretの変更を監視し、ファイルを書き換えるという仕事をする必要がなくなり、パフォーマンスが向上することが期待されます。

## Other API changes:

なし

### Configuration file changes:
kube-scheduler:

- Kube-schedulerが1より多くのスケジューリングプロファイルで動作できるようになりました。プロファイルの選択には `.spec.schedulerName` を用います。 ([#88285](https://github.com/kubernetes/kubernetes/pull/88285), [@alculquicondor](https://github.com/alculquicondor)) [SIG Apps, Scheduling and Testing]


#### kube-proxy:

- kube-controller-managerの 新しい`--endpointslice-updates-batch-period` フラグを使うことで Podの変化によって発生する endpointsliceの更新を削減することができます。 ([#88745](https://github.com/kubernetes/kubernetes/pull/88745), [@mborsz](https://github.com/mborsz))

### Features graduated to GA:

- TaintBasedEvictions がGAとなりました ([#87487](https://github.com/kubernetes/kubernetes/pull/87487), [@skilxn-go](https://github.com/skilxn-go))
- Windows RunAsUserName がGAとなりました ([#87790](https://github.com/kubernetes/kubernetes/pull/87790), [@marosset](https://github.com/marosset)) [SIG Apps and Windows]

## Feature

なし

### Other (Bug, Cleanup or Flake)

- APIサーバが1.16以上で、kubeletが1.15以下の場合 PodのステータスであるpodIP, NodeのSpecであるpodCIDRを更新できていなかった問題を修正しました。([#88505](https://github.com/kubernetes/kubernetes/pull/88505), [@liggitt](https://github.com/liggitt)) [SIG Apps and Network]
- EndpointSliceがterminatingなPodのEndpointを含んでいた問題を修正しました。([#89056](https://github.com/kubernetes/kubernetes/pull/89056), [@andrewsykim](https://github.com/andrewsykim)) [SIG Apps and Network]
- EndpointSlice controllerの競合問題を修正し、EndpointSliceの外部からの変更を扱えるようにしました。([#85703](https://github.com/kubernetes/kubernetes/pull/85703), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
- EndpointSliceコントローラが共有オブジェクトを変更しようとするバグを修正しました。([#85368](https://github.com/kubernetes/kubernetes/pull/85368), [@robscott](https://github.com/robscott)) [SIG API Machinery, Apps and Network]
- NodeのEventの "involevedObject"の"apiVersion"が設定されていないバグを修正しました。([#87537](https://github.com/kubernetes/kubernetes/pull/87537), [@uthark](https://github.com/uthark)) [SIG Apps and Node]
- StatefulSetのconversionにより、同じマニフェストを何度もapplyすることができなかった問題を修正しました。([#87706](https://github.com/kubernetes/kubernetes/pull/87706), [@liggitt](https://github.com/liggitt)) [SIG Apps and Testing]
- Nodeが追加され、provider IDを決める際にエラーとなってしまうと、それ以降 provider IDが設定されないバグを修正しました。 ([#87043](https://github.com/kubernetes/kubernetes/pull/87043), [@zjs](https://github.com/zjs)) [SIG Apps and Cloud Provider]
- みなしごとなったControllerRevisionが再びStatefulSetのものにならないようにしました。([#86801](https://github.com/kubernetes/kubernetes/pull/86801), [@likakuli](https://github.com/likakuli)), ([#84984](https://github.com/kubernetes/kubernetes/pull/84984), [@cofyc](https://github.com/cofyc)) [SIG Apps]
  - :memo: ControllerRevisionは、普段は目にすることはないですが、StatefulSetなどの変更履歴を管理するためのオブジェクトです。`deleteOptions.propagationPolicy=Orphan`の場合、StatefulSetが削除されると、StatefulSetが管理するControllerRevisionはOwnerがなくなり、みなしごとなることが期待されるのですが、バグにより再び削除しようとしているStatafulSetがOwnerとなってしまう状態だったようです。このみなしごを再び引き取ってしまうバグは2つの要因があったようで上記2つのPRによりそれぞれが修正されています。
- CSR controllerが扱う署名の証明書と鍵を、api-serverで行っているのと同じようにディスクから再読み込みできるようにしました。 ([#86816](https://github.com/kubernetes/kubernetes/pull/86816), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Apps and Auth]

----

# まとめ

過去のAPIVersionは使えなくなり`apps/v1`が普通に使われるようになったことからも、Appsが担当しているワークロード周りのリソースの成熟を感じます。
新しい機能はネットワーク、ストレージなどとの連携がらみのものが多く、SIG-APPSの変更点から現在のKubernetesが力を入れている分野を俯瞰することができます。

既存のリソースは古いものに関してはバグもそれほどないように見えますが、StatefulSetなどはまだバグ修正が目立ちます。また、新機能追加やリファクタリングの影響で過去バージョンとの互換性が崩れてしまうことに対する修正も増えてきており、複雑化していくKubernetesのメンテナンスの難しさを感じました。