Kubernetes 1.21: SIG Autoscaling の変更内容

# はじめに

ここでは、[Kubernetes 1.21 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.21.md#v1200) と [cluster-autoscaler 1.21](https://github.com/kubernetes/autoscaler/releases/tag/cluster-autoscaler-1.21.0
) から SIG Autoscaling の取り組みについてまとめています。

:memo: 以下は筆者の補足になります。

# Kuberentes 1.21

## API Changes

- PodDisruptionBudget API スキーマの変更なく policy/v1 になりました。機能的な変更点は空のセレクタを使用できるようになりました([#99290](https://github.com/kubernetes/kubernetes/pull/99290), @mortent)

## Bug or Regression

- 少なくとも1つのメトリックが利用できない/無効であるにもかかわらず、Horizontal Pod Autoscalerがスケールダウンするバグを修正しました。([#99514](https://github.com/kubernetes/kubernetes/pull/99514), @mikkeloscar) [SIG Apps and Autoscaling]
    - :memo: 1.16 から正しく動作していなかったようです。

# cluster-autoscaler 1.21.0 ChangeLog

https://github.com/kubernetes/autoscaler/releases/tag/cluster-autoscaler-1.21.0
各クラウドベンダーの変更点については記載しませんので、必要な方は公式の内容やソースコードを参照ください。

https://github.com/kubernetes/autoscaler/compare/cluster-autoscaler-1.20.0...cluster-autoscaler-1.21.0

## General

*リポジトリや開発時の運用スクリプトの変更なども含まれているので筆者の判断で適宜分類します。また変更点と PR の紐付けがないこととChangeLogの文章はPR本文が転記されているだけでよくわからないものも多いので適宜追加しています。*

### 新機能

- ノードの使用率を計算する際に `--ignore-daemonsets-utilization` フラグで、デーモンセットと一緒にミラーポッドも減算するようになりました([#3749](https://github.com/kubernetes/autoscaler/pull/3749))
    - :memo: `--ignore-daemonsets-utilization` を有効にするとノードのリソース使用率の計算の際に DaemonSets の Pod の使用率は換算されないようになりましたが、DaemonSet Pod に加えて、Mirror Pod も加算されない対象となったようです
- NodeGroup 単位でスケールダウンに関する設定を上書きできるようになりました([#3789](https://github.com/kubernetes/autoscaler/pull/3789))
    - :memo: NodeGroup 単位で ScaleDownUnneedTime、ScaleDownUnreadyTime、NodeGroup内のノードの使用率のしきい値をオーバーライドできるようになったとのことです
    - :memo: 実装自体は各クラウドプロバイダに任せられており、この追加は IF が追加されたというだけになっているため各クラウドプロバイダ側で実装が必要なようです
- SchedulerBasedPredicateCheckerのラウンドロビンの実装([#3817](https://github.com/kubernetes/autoscaler/pull/3817))
    - :memo: スケールダウン時の計算で新たなノードを選ぶ際に1.18でランダム性を排除した結果遅くなったのでラウンドロビンでノードを選ぶように変更したとのこと
- 空ノードを削除する際に daemonset の pod も evict するオプションを追加しました([#3824](https://github.com/kubernetes/autoscaler/pull/3824))
    - :memo: 1.20 で追加されたノード削除時に daemonset の pod も evict する機能ですが、daemonset以外の Pod が存在しない Node の場合この処理がスキップされていた部分をスキップしないようにできるようになったとのことです
    - :memo: 1.20 のときはスキップされる関係で挙動の確認が面倒でした :cry: 
- デフォルトでは cluster-autoscaler-status となっている ConfigMap の名前を変更できるようになりました([#3888](https://github.com/kubernetes/autoscaler/pull/3888))
- Kubernetes に登録されていないために cluster-autocaler によって削除されたノード数をカウントする新しいメトリックが追加されました([#3922](https://github.com/kubernetes/autoscaler/pull/3922))
    - :memo: `old_unregistered_nodes_removed_count` が追加されています
- leader election に使用するリソースの名前を設定できるようになりました([#3630](https://github.com/kubernetes/autoscaler/pull/3630))
    - :memo: 同じ namespace に別のクラスタオートスケーラをデプロイしたいケースに対応するためとのことです
- スケールアップ時の認証エラー報告のサポートしました ([#3950](https://github.com/kubernetes/autoscaler/pull/3950))
- AutoscalerErrorTypeの文字列値に基づいて、スケールアップに失敗したメトリックを記録するようになりました ([#3969](https://github.com/kubernetes/autoscaler/pull/3969))
- user-agent を指定する設定が追加されました ([#3989](https://github.com/kubernetes/autoscaler/pull/3989))
    - :memo: user-agent が各クラウドプロバイダに渡され、それを各クラウドで利用するようになったようです。実装は各クラウドの実装に依存します
- 新たなクラウドプロバイダに OVHcloud が追加されました ([#3773](https://github.com/kubernetes/autoscaler/pull/3773))
- 新たなクラウドプロバイダに Linode が追加されました([#3790](https://github.com/kubernetes/autoscaler/pull/3790))
- 新たなクラウドプロバイダに Bizflycloud が追加されました([#4009](https://github.com/kubernetes/autoscaler/pull/4009))
    - :memo: 1.21.0 には入っていないような。。。
- 新たなクラウドプロバイダに Hetzner が追加されました([#3838](https://github.com/kubernetes/autoscaler/pull/3838))

### バグ修正
- priority-expander 有効時に誤解を招くようなログが出力されていた問題を修正しました([#3758](https://github.com/kubernetes/autoscaler/pull/3758))
    - :memo: priority-expander は使っていないため知らない機能でしたがスケールする ScaleGroup (=NodeGroup?) に優先度を付けられる機能のようです。
    - 詳しくは　https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler/expander/priority に記載されています
- Fix: upcoming nodes のために異なる hostname ラベルを設定するように変更されました([#3883](https://github.com/kubernetes/autoscaler/pull/3883))
    - :memo: 新たなNodeの追加の際の計算時などでノードを追加する際に既存ノードのコピーから当たらなノード情報を作っていましたがこのときに hostname ラベルの変更が漏れていたようでそれが修正されたようです
    - :memo: そのラベルが残っていると Topology の計算などで影響を受け意図しない計算結果が出る問題があるようでした
- 2分後にReadyになるノードのバグを修正([#3924](https://github.com/kubernetes/autoscaler/pull/3924))
    - :memo: Ready になっているノードが Ready として扱われていない問題があったようです

### その他細かい変更
- バグレポートと新機能リクエストのために issue テンプレートが追加されました ([#3750](https://github.com/kubernetes/autoscaler/pull/3750))
- アーキテクチャ固有のリリースでは、同じコンテナイメージにタグを付けるのではなく、別のコンテナイメージを使うようにしました([#3768](https://github.com/kubernetes/autoscaler/pull/3768))
- @towca が承認者として追加されました ([#3774](https://github.com/kubernetes/autoscaler/pull/3774))
- chart: deployment templateのadditionalLabelsへの参照を修正しました([#3782](https://github.com/kubernetes/autoscaler/pull/3782))
- Chartのテストアクションが更新されました ([#3932](https://github.com/kubernetes/autoscaler/pull/3932)?)
- Recommendation: master -> control plane ([#3803](https://github.com/kubernetes/autoscaler/pull/3803))
- Github Actions を使った　Test と verifyが追加されました([#3860](https://github.com/kubernetes/autoscaler/pull/3860))
- Makefile のクリーンアップが行われました([#3863?](https://github.com/kubernetes/autoscaler/pull/3863))
- Helm Chart Imageが更新されました (v1.18.1 → v1.20.0)([#3880](https://github.com/kubernetes/autoscaler/pull/3880))
- Update Index for CA Chart (PRが見つからず。。)
- 過去の Chart ファイルが削除されました ([#3885](https://github.com/kubernetes/autoscaler/pull/3885))
- Chart で prometheus rule がサポートされました([#3900](https://github.com/kubernetes/autoscaler/pull/3900))
- Chart で automountServiceAccountToken の指定がサポートされました ([#3912](https://github.com/kubernetes/autoscaler/pull/3912))
- update-vendor script のリファクタリングが行われました ([#3915](https://github.com/kubernetes/autoscaler/pull/3915))
- gitignore ファイルにアーキテクチャ別のcluster-autoscalerバイナリファイルが追加されました ([#3921](https://github.com/kubernetes/autoscaler/pull/3921))
- Chart で status-config-map-name がサポートされました ([#3954](https://github.com/kubernetes/autoscaler/pull/3954))
- custom resources logic の部分でリファクタリングが行われました([#3971](https://github.com/kubernetes/autoscaler/pull/3971))
    - :memo: refactoring. GpuResources -> CustomResources になったようです

### クラウドプロバイダ固有に関連した変更(いくつか混ざってました😅 )
- Add max pods per node config to build node ([#3755](https://github.com/kubernetes/autoscaler/pull/3755))
    - gce の話でした :cry: 
- Define clusterapi in cloudprovider layer([#3801](https://github.com/kubernetes/autoscaler/pull/3801))
    - clusterapiの話

# 総評

今回は大きな変更点はなく、細かい設定項目が増えたアップデートとなってます。いくつか新しいIFが追加され各クラウドプロバイダ側に実装できる余地が増えたので、クラウドプロバイダ側は対応を検討する必要がありそうです。