Kubernetes 1.23: SIG-CLI (kubectl) 変更内容

ここでは、Kubernetes 1.23 の CHANGELOG から SIG-CLI (kubectl) の取り組みについてまとめています。:memo: は筆者によるコメントです。

- https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.23.md

**新たに追加された主なコマンドとフラグ**

- `kubectl alpha events`: Events オブジェクトを扱う新しいアルファのコマンドで、このバージョンでは `--for` フラグによりイベントの発生元オブジェクトでリストをフィルタする機能を持っています
- `kubectl completion fish`: fish shell 向けの補完コードの生成
- `kubectl completion powershell`: PowerShell 向けの補完コードの生成

**変更があった主なコマンドとフラグ**

- `kubectl create secret/configmap --from-env`: これまで一度の実行で一度しかこのフラグを使用できませんでしたが、複数回使用できるようになりました
- `kubecctl wait --for`: `delete`, `condition` に加えて `jsonpath` がサポートされ、オブジェクトのどのフィールドでも wait の対象にできます

**廃止予定のコマンドとフラグ**

- klog に関連する `--alsologtostderr` のフラグ

**削除されたコマンドとフラグ**

- `kubectl drain --ignore-errors`: 複数ノードに対して実行した際に途中発生したエラーを無視して最後まで実行するというフラグでしたが、このフラグは削除され、この挙動がデフォルトになりました

そのほか、細かい変更は、 https://github.com/superbrothers/kubectl-docs/compare/v1.22.0...v1.23.0 で参照できます。

## 所感

大きな機能追加はありませんが、スクリプトで便利に使えそうな改善が入っています。新しいコマンドとして `kubectl alpha events` が追加され、今後 Events に関する便利機能が追加されていくことが期待されます。欲しい機能のコメントを [k/kubectl](https://github.com/kubernetes/kubectl/) のイシューか #sig-cli Slack チャンネルで募集しているとのことだったので、アイデアがある方は投稿してみるとよさそうです。

SIG CLI の担当ではありませんが、Ephemeral Containers がついに GA になり `kubectl debug` を Pod に対して使用できるようになりました。アルファで初めて追加されたのが 1.16、1.16 のリリースが2019年9月なので、2年強経っての GA でめっちゃめでたい:tada: これで distroless のようなより小さいベースイメージの使用が進みそうです。なお、Ephemeral Containers の API が Kubernetes v1.22 で変更されているため、v1.23 のクラスタで使用するには kubectl v1.22 以上を使用する必要があります。

## What's New (新情報)

SIG-CLI に関連する情報はありません。

## What's New (新情報)

SIG-CLI に関連する情報はありません。

## Known Issues（既知の問題）

SIG-CLI に関連する情報はありません。

## Urgent Upgrade Notes（必ず一読してからアップグレードしなければならない事項）

SIG-CLI に関連する情報はありません。

## Changes by Kind（種類別の変更）

### Deprecation (廃止)

- `kubectl --dry-run` の空のデフォルト値とブール値が削除されました。`kubectl --dry-run` の使用には `--dry-run=(server|client|none)` を必ず指定する必要があります。([#105327](https://github.com/kubernetes/kubernetes/pull/105327), [julianvmodesto](https://github.com/julianvmodesto))
    - :memo: 値が空、またはブール値（`true` または `false`）の場合で、エラーになるようになりました
    - :memo: が、その後未だ多くのユーザがスクリプト等で値が空で実行していることがあることからこの変更はリバートされ、v1.23.1 では以前の挙動に戻っています
        - [Re-introduce removed kubectl --dry-run values. #107003](https://github.com/kubernetes/kubernetes/pull/107003)

### API Change (API 変更)

- Job ステータスで Ready な状態の Pods 数をトラックするようになりました。この機能はアルファで有効にするには JobReadyPods フィーチャゲートが必要です。  ([#104915](https://github.com/kubernetes/kubernetes/pull/104915), [alculquicondor](https://github.com/alculquicondor))
    - :memo: Job `status.ready` フィールドで Job に紐づく Ready な状態の Pods 数が管理されるようになったという変更ですが、kubectl にも変更が入っていて `kubectl describe job` コマンドで下記のように Ready Pods の数が表示されるようにもなりました  
        ```
        Pods Statuses:    1 Active (1 Ready) / 0 Succeeded / 0 Failed
        ```

### Feature（機能）

- kubectl に fish shell の補完が追加されました ([#92989](https://github.com/kubernetes/kubernetes/pull/92989), [WLun001](https://github.com/WLun001))
    - :memo: kubectl の補完コードの生成には [spf13/cobra](https://github.com/spf13/cobra) ライブラリの機能が使われており、このライブラリが fish shell の補完もサポートしたため、kubectl でも使えるようになりました。
- windows/arm64 プラットフォーム向けのクライアントサイドバイナリの生成がサポートされました ([#104894](https://github.com/kubernetes/kubernetes/pull/104894), [pacoxu](https://github.com/pacoxu))
    - :memo: クライアントサイドバイナリというのはつまり kubectl のことです。Go 1.17 で windows/arm64 プラットフォームのサポートが追加されたことによる変更です。
- `kubectl completion powershell` の実行で PowerShell の補完ができるようになりました。 ([#103758](https://github.com/kubernetes/kubernetes/pull/103758), [zikhan](https://github.com/zikhan))
- 任意の JSONPath でウェイトする機能が `kubectl wait` に追加されました ([#105776](https://github.com/kubernetes/kubernetes/pull/105776), [lauchokyip](https://github.com/lauchokyip))
    - :memo: `kubectl wait --for=jsonpath='{.status.phase}'=Running pod/busybox1` の形で任意のステータスフィールドを JSONPath 形式で指定できるようになりました。`status` フィールド以外に `spec` でもどのフィールドでも機能します。
    - :memo: これまでは Delete または Condition フィールドしか対象にできなかったため、とても柔軟になりました。べんり。
- `kubectl run` と `kubectl expose` により作成されるリソースをオーバライドするために RFC7396 JSON Merge Patch、RFC6902 JSON Patch または Strategic Merge Patch のいずれかで指定できるようになりました ([#105140](https://github.com/kubernetes/kubernetes/pull/105140), [brianpursley](https://github.com/brianpursley))
    - :memo: これまで `kubectl run` と `kubectl expose` では作成されるオブジェクトにパッチを当てる `--overrides` フラグをサポートしていましたが、パッチに使えるのは JSON Merge Patch だけでした。
    - :memo: この変更で JSON Merge Patch に加えて JSON Patch と Strategic Merge Patch が使えるようになりました。
    - :memo: どのパッチ形式を使用するかは `--override-type` フラグで指定します。JSON Merge Patch は `merge` (デフォルト）、JSON Patch は `json`、Strategic Merge Patch は、`srategic` です。
- 複数の `--from-env-file` フラグの使用がサポートされました ([#104232](https://github.com/kubernetes/kubernetes/pull/104232), [lauchokyip](https://github.com/lauchokyip))
    - :memo: `kubectl create secret generic` コマンドで `KEY=VALUE` 形式で記述されたファイルからキーと値を読み込む `--from-env-file` フラグを一度の実行で複数回使用できるようになったという変更です。
- 複数の `--from-env-file` フラグの使用がサポートされました ([#101646](https://github.com/kubernetes/kubernetes/pull/101646), [lauchokyip](https://github.com/lauchokyip))
    - :memo: リリースノートの記述が上と一緒でわかりにくいのですが、こちらは `kubectl create configmap` コマンドが対象です。
- 新しいアルファのコマンドとして `kubectl events` が追加されました ([#99557](https://github.com/kubernetes/kubernetes/pull/99557), [bboreham](https://github.com/bboreham))
    - :memo: `kubectl get events` は多くの改善余地があり、それを実現するために新たに独立したコマンドとして `kubectl events` を作成してやっていくということのようです（現在はアルファなので `kubectl alpha events` にある）
    - :memo: v1.23 時点では `--for` フラグによりイベントの発生元オブジェクトでリストをフィルタする機能が追加されている
    - :memo: KEP が https://github.com/kubernetes/enhancements/tree/master/keps/sig-cli/1440-kubectl-events があり、検討されている追加機能として下記がある
        - `--watch-event=[]`: 指定のイベントのみでフィルタ
        - `--watch-until=EventType`: ウォッチしつつ、指定のイベントタイプが来ると終了
        - `--watch-until-exists=pod/bar`: 指定のオブジェクトが存在したら終了
- `kubectl describe ingress` でラベルが表示されるようになりました ([#103894](https://github.com/kubernetes/kubernetes/pull/103894), [kabab](https://github.com/kabab))
- kubectl が `--output/-o` フラグの補完を提供するようになりました ([#105851](https://github.com/kubernetes/kubernetes/pull/105851), [marckhouzam](https://github.com/marckhouzam))
- シェル補完がコマンドがサポートしていればリソース名をサジェストし続けるようになりました。例えば `kubectl get pod pod1 <TAB>` がさらに Pod 名をサジェストします。 ([#105711](https://github.com/kubernetes/kubernetes/pull/105711), [marckhouzam](https://github.com/marckhouzam))
    - :memo: 地味にべんり
- `kubectl describe namespace` が Conditions を表示するようになりました ([#106219](https://github.com/kubernetes/kubernetes/pull/106219), [dlipovetsky](https://github.com/dlipovetsky))

### Bug or Regression（バグまたはリグレッション）

- `kubectl top node` でリソース使用量に `Capacity` を表示する show-capacity オプションが追加されました ([#102917](https://github.com/kubernetes/kubernetes/pull/102917), [bysnupy](https://github.com/bysnupy)) [SIG CLI]
    - :memo: `kubectl top node` コマンドはノードの CPU, Memory の使用量を実数と割合で表示するコマンドです。割合の算出にはノードの Allocatable（割当可能なリソース）が使用されていますが、`--show-capacity` フラグを使うと Allocatable に代わって Capacity が使われるようになります。
    - :memo: Allocatable は Capacity から system-reserved と Hard-Eviction-Thresholds を引いた値ですが、`kubectl top node` コマンドでノードのメモリ使用量はノードホスト上の実際の使用量に基づいているため、メモリ使用量の割合が100%を超えてしまうことがありました。
- ドキュメントに合わせるために `kubectl diff --invalid-arg` のステータスコードが 1 から 2 に変更されました ([#105445](https://github.com/kubernetes/kubernetes/pull/105445), [ardaguclu](https://github.com/ardaguclu))
- kubectl describe が event の age を計算するのに `Eventseries.count` と `EventSeries.lastObservedTime` を使うように変更されました ([#104482](https://github.com/kubernetes/kubernetes/pull/104482), [harjas27](https://github.com/harjas27))
- kubectl がアンダースコアを含むフラグ名に対して重複した警告メッセージを発したり、存在しないフラグの使用を推奨することがあるバグが修正されました ([#103852](https://github.com/kubernetes/kubernetes/pull/103852), [brianpursley](https://github.com/brianpursley))
- `kubectl` で Secrets を作成する際にサポートされていない output タイプを指定するとパニックするバグが修正されました ([#106317](https://github.com/kubernetes/kubernetes/pull/106317), [lauchokyip](https://github.com/lauchokyip))
- `kubectl taint` で taint が衝突した際に JSON で衝突した taint が表現されていたのが`Key=Effect` に変更されました ([#104011](https://github.com/kubernetes/kubernetes/pull/104011), [manugupt1](https://github.com/manugupt1))
- `kubectl kustomize` が v4.4.1 にアップグレードされました https://github.com/kubernetes-sigs/kustomize/releases/tag/kustomize%2Fv4.4.1 ([#106389](https://github.com/kubernetes/kubernetes/pull/106389), [natasha41575](https://github.com/natasha41575)) [SIG CLI]

### Other (そのほか)

- `-v` と `-vmodule` を除く `klog` のフラグが非推奨になりました。`-vmodule` のサポートはテキストログ形式でのみ保証されます。 ([#105042](https://github.com/kubernetes/kubernetes/pull/105042), [pohly](https://github.com/pohly))
    - :memo: klog の `--alsologtostderr` 等のフラグが非推奨なり、将来のリリースで削除去れる予定です
- Kubectl: 廃止予定のコマンドラインフラグ（いくつかの klog のフラグなど）には `DEPRECATED: <explanation>` というコメントがつくようになりました ([#106172](https://github.com/kubernetes/kubernetes/pull/106172), [pohly](https://github.com/pohly)) [SIG CLI]
- drain の ignore error フラグが削除され、この機能がデフォルトになりました ([#105571](https://github.com/kubernetes/kubernetes/pull/105571), [yuzhiquan](https://github.com/yuzhiquan)) [SIG CLI]
    - :memo: これまで複数ノードに対して `kubectl drain` コマンドを実行すると、デフォルトでは途中のノードで drain に失敗した場合、コマンドの実行が中断されていましたが、`--ignore-errors` フラグを使うことで中断されず最後まで実行されるようになっていました。
    - :memo: この変更では、`--ignore-errors` フラグが削除され、このフラグの挙動がデフォルトになりました