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

## はじめに

ここでは、Kubernetes 1.22 の CHANGELOG から SIG-CLI (kubectl) の取り組みについてまとめています。

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

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

- `kubectl annotate --all-namespaces/-A` フラグ: 全 namespace を対象に実行する
- `kubectl label --all-namespaces/-A` フラグ: 全 namespace を対象に実行する
- `kubectl describe/drain --chunk-size` フラグ: オブジェクトリストを取得する際のチャンクサイズ（デフォルト `500`）
- `kubectl top pod --field-selector` フラグ: フィールドセレクタのサポート


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

- `kubectl top --use-protocol-buffers` フラグ: デフォルトで Protocol Buffers が使用されるように変更
- `kubectl kustomize`: Kustomize のバージョンが v4.2.0 に更新

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

- `kubectl create/edit/expose/patch/run/... --record` フラグ

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

- `kubectl autoscale --generator` フラグ
- `kubectl create deployment --generator` フラグ

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

## 所感

v1.22 は kubectl に対する大きな機能追加はなく改善とバグ修正が主で、注目機能の [Ephemeral Containers](https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/)（`kubectl debug`コマンドで実行中の Pod に対してデバッグ目的のサイドカーコンテナをあとから挿入する機能） も認可周りで API 変更が入ったとのことで残念ながらベータに昇格せずデフォルトで使用できるようにはなりませんでした。現時点では v1.23 がベータ昇格のターゲットバージョンに設定されているので、大いに期待しましょう。

- [KEP\-277: Update for beta in 1\.23 by verb · Pull Request \#2892 · kubernetes/enhancements](https://github.com/kubernetes/enhancements/pull/2892)

`kubectl kustomize` として組み込まれている kustomize は v1.22 でも順調に v4.2.0 まで更新されています。合わせていくつかの新しい kustomize のフラグが `kubectl kustomize` にも追加されています。


## What's New (新情報)

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

## Known Issues（既知の問題）

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

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

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

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

### Deprecation (廃止)

- `kubectl` の `--record` フラグが廃止予定となり、このフラグは HTTP リクエストに kubectl コマンドの詳細情報を付与する[仕組み](https://github.com/kubernetes/enhancements/tree/master/keps/sig-cli/859-kubectl-headers)に置き換えられます ([#102873](https://github.com/kubernetes/kubernetes/pull/102873), [soltysh](https://github.com/soltysh))
    - :memo:  `--record` フラグは、オブジェクトを作成/更新する際にオブジェクトの annotation にどのコマンドにより操作されたのかを記録するものです
    - :memo: 当初は `--record` フラグを使う例をときどき見かけましたが、実際に使っている話を聞いたことがありません
    - :memo: v1.21 で kubectl コマンドを実行するとそのコマンドの情報が HTTP ヘッダに記録される仕組みがアルファで追加され、v1.22 でベータに昇格しデフォルトになったため、それに合わせて `--record` フラグが廃止予定になったようです

### API Change (API 変更)

- Exec plugin の作者は、kubeconfig の新しい `interactiveMode` フィールドで標準入力のデフォルト処理をオーバライドできるようになりました ([#99310](https://github.com/kubernetes/kubernetes/pull/99310), [ankeesler](https://github.com/ankeesler))
    - :memo: Exec plugin でインタラクティブモードとするかどうかの判断に標準出力がターミナルかどうかを使っていることが問題でした。2FA コードの入力などインタラクティブモードである必要がある場合に例えばスクリプトの一部として kubectl コマンドが使用され、標準出力がターミナル以外に向いていると（例えば `echo $(kubectl version)`）標準入力が使えなくなりコードが入力できませんでした。
    - :memo: この PR ではまず標準入力がターミナルに向いているかどうかでインタラクティブモードが使用可能かどうかを判断するように変更されました。加えて kubeconfig に `users.user.exec.interactiveMode` フィールドが追加され、Exec plugin の作者がインタラクティブモードを制御できるようになりました。値は次のとおりです。
        - `Never`: 標準入力が使用できるかどうかに関わらず処理を実行し、Exec plugin に標準入力を渡さない
        - `IfAvailable`: 標準入力が使用できるかどうかに関わらず処理を実行し、可能であれば Exec plugin に標準入力を渡す
        - `Always`: 標準入力が使用できない場合、処理をエラーで終了させる

### Feature（機能）

- `kubectl describe` コマンドに BinaryData (バイナリデータ) の説明が追加されました ([#100568](https://github.com/kubernetes/kubernetes/pull/100568), [lauchokyip](https://github.com/lauchokyip))
    - :memo: BinaryData が設定されていてもこれまで `kubectl describe` コマンドに何も出力されていませんでしたが、キー名とバイト数が出力されるようになりました
- `kubectl top pod` コマンドに `--field-selector` オプションが追加されました ([#102155](https://github.com/kubernetes/kubernetes/pull/102155), [lauchokyip](https://github.com/lauchokyip)) [SIG CLI]
- 廃止予定の機能について `ignore-errors` フラグの警告メッセージが出力されるようになりました ([#102677](https://github.com/kubernetes/kubernetes/pull/102677), [yuzhiquan](https://github.com/yuzhiquan))
    - :memo: これは `kubectl drain` コマンドの `--ignore-errors` フラグのことで、これまで `kubectl drain` コマンドは複数のノードを対象とした場合にエラーになると途中で処理を終了してしまう挙動でしたが、v1.23 で途中でエラーになっても全ノードで処理が継続するように変更される予定です。`--ignore-errors` フラグはそれを先取って将来の挙動を使うようにフラグですが、複数ノードを対象としてこのフラグを使用せずに途中にエラーになった場合に、挙動が v1.23 で変更されることと、このフラグを使用することで、将来の挙動が先取りできることを警告するメッセージが出力されるようになったよということです。
- Kubectl: `kubectl get pods` コマンドの出力に `LAST RESTART` カラムが追加されました ([#100142](https://github.com/kubernetes/kubernetes/pull/100142), [Ethyling](https://github.com/Ethyling))
    - :memo: Pod が最後にリスタートしたのがいつかがカラムに追加されるようになりました。べんりです。
    - :memo: 今回新たにデフォルトで表示されるカラムが追加されたわけですが、何をカラムに追加するのか、また `-o wide` に入れるべきかどうかがどこで判断されているのかがよくわかりませんでした。
- kubectl command headers がベータとなりデフォルトになりました ([#103238](https://github.com/kubernetes/kubernetes/pull/103238), [seans3](https://github.com/seans3)) [SIG CLI]
- `kubectl diff` コマンドの出力でデフォルトで Secret の値が隠蔽されるようになりました ([#96084](https://github.com/kubernetes/kubernetes/pull/96084), [loozhengyuan](https://github.com/loozhengyuan))
    - :memo: `kubectl diff` コマンドは Secret のデータに変更があった場合にも差分をそのまま出力してしまっていたため、クレデンシャルが丸見えになるという問題がありました
    - :memo: この変更で Secret のデータは `***` という形で隠蔽されるようになりました。なお、データが追加/削除された場合と値が変更された場合にも隠蔽しつつ変更されたことがしっかりわかる見た目となってします （[k/k#96084](https://github.com/kubernetes/kubernetes/pull/96084#issuecomment-720349473)）
- シェル補完は Cobra の Go を使った方法に移行し、ファイルの補完が適用されない場合に無効にするなどよりかしこくなりました。また、`cp` コマンドの補完は、ユーザがなにかを入力していない限りすべてのファイルを表示しないようになりました。 ([#96087](https://github.com/kubernetes/kubernetes/pull/96087), [marckhouzam](https://github.com/marckhouzam)) [SIG CLI]
    - :memo: この変更で、kubectl の補完コードの読み込みが高速化されました :tada: 加えて、これまで動的補完の候補（例えば Pod 名のリストの補完）の取得はシェルスクリプトで実装されていましたが、この Cobra の新しい補完では Go で実装できるようになり、開発者にとっても最高の変更になりました。
    - :memo: Cobra の Go を使った新しい補完機能については https://github.com/spf13/cobra/blob/master/shell_completions.md で参照できます
- `kubectl debug` コマンドは `EphemeralContainers` 機能が有効な 1.22 以前のクラスタでエフェメラルコンテナを作成できます。API の変更により、1.22 以前の kubectl は、1.22 以上のクラスタでエフェメラルコンテナを作成できないことに注意してください。 ([#103292](https://github.com/kubernetes/kubernetes/pull/103292), [verb](https://github.com/verb))
- `kubectl drain` コマンドに新しいフラグである `--check-size=SIZE` がベータとして追加されデフォルトで有効です。このフラグによりアイテム数を変更したり、`0` を渡すことでこの機能を無効化できます。 ([#100148](https://github.com/kubernetes/kubernetes/pull/100148), [KnVerey](https://github.com/KnVerey))
    - :memo: `kubectl get` コマンドに用意されていた `--check-size` フラグが `kubectl drain` コマンドにも追加されました
    - :memo: このフラグを使用すると、一度にすべてのオブジェクトを取得するのではなく、チャンクで取得するようになります。デフォルトのサイズは `500` です。
- `kubectl describe` コマンドに `--check-size=SIZE` フラグが追加されました。このフラグによりアイテム数を変更したり、`0` を渡すことでこの機能を無効化できます。 ([#101171](https://github.com/kubernetes/kubernetes/pull/101171), [KnVerey](https://github.com/KnVerey))
- `kubectl`: Metrics API での Protocol Buffers の使用がデフォルトになりました ([#102039](https://github.com/kubernetes/kubernetes/pull/102039), [serathius](https://github.com/serathius))
    - :memo: 1.21 で追加された機能で、metrics-server のレスポンスに JSON 形式の代わりに Protocol Buffers を使うようになります
    - :memo: JSON 形式へのエンコードに metrics-server の CPU の30%とメモリの15%が使用されているそうで、それを削減することが目的です

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

- `kubectl describe` コマンドで EndpointSlice に zone がない場合に panic になる問題が修正されました ([#101025](https://github.com/kubernetes/kubernetes/pull/101025), [tnqn](https://github.com/tnqn))
- `kubectl set env/resources` コマンドが init containers に機能していない問題が修正されました ([#101669](https://github.com/kubernetes/kubernetes/pull/101669), [carlory](https://github.com/carlory))
- `kubectl debug node` コマンドが taint されている（NoExecute）ノードで機能していない問題が修正され、すべてを許容するようになりました ([#98431](https://github.com/kubernetes/kubernetes/pull/98431), [wawa0210](https://github.com/wawa0210))
    - :memo: 作成される Pod に `tolerations: {operator: Exists}` をつけることで対応したようです
- 特定の古いバージョンの Windows や Window 8 でレガシーコンソールモードが有効になっている場合に `kubectl exec` コマンドがクラッシュする問題が修正されました ([#102825](https://github.com/kubernetes/kubernetes/pull/102825), [n4j](https://github.com/n4j))
- `kubectl create ingress` コマンドで annotation フラグに空の値が設定されている場合に panic になる問題が修正されました ([#101377](https://github.com/kubernetes/kubernetes/pull/101377), [rikatz](https://github.com/rikatz))
- 無関係な Pod のインスタンス間でデフォルト設定がリークするコードが修正されました ([#103284](https://github.com/kubernetes/kubernetes/pull/103284), [kebe7jun](https://github.com/kebe7jun)) [SIG CLI]
    - :memo: リリースノートの文章からは何が何やら全くわかりませんがこれは `kubectl logs` コマンドに関するバグで、複数の Pod を対象とした場合に `kubectl.kubernetes.io/default-container` annotation によるデフォルトで選択するコンテナの設定が関連のない異なる Pods 間で共有されてしまう問題があったようです。
- `kubectl describe` コマンドで Job completion mode の表示が修正されました ([#101160](https://github.com/kubernetes/kubernetes/pull/101160), [alculquicondor](https://github.com/alculquicondor))
- `kubectl create configmap` コマンドが失敗した場合も常にゼロの終了コードを返すバグが修正されました ([#101780](https://github.com/kubernetes/kubernetes/pull/101780), [nak3](https://github.com/nak3)) [SIG CLI]
- `kubectl describe podsecuritypolicy` コマンドで新しい Kind を使い、出力が整理されました ([#101436](https://github.com/kubernetes/kubernetes/pull/101436), [KnVerey](https://github.com/KnVerey))
- cpu, memory, storage, ephemeral-storage, hugepages, attachable-volumes の正しいソートをサポートしました ([#100435](https://github.com/kubernetes/kubernetes/pull/100435), [lauchokyip](https://github.com/lauchokyip))
    - :memo: `--sort-by` フラグでリソースを指定した場合に正しくソートされていなかったようです
- `kubectl create service` コマンドは `namespace` フラグを尊重するように修正されました ([#101005](https://github.com/kubernetes/kubernetes/pull/101005), [zxh326](https://github.com/zxh326))
- `kubectl get` コマンドは表示が壊れるのを避けるために複数行の文字列を切り詰めるように修正されました ([#103514](https://github.com/kubernetes/kubernetes/pull/103514), [soltysh](https://github.com/soltysh))
- `kubectl wait --for=delete` コマンドは not found のエラーを正しく無視するように修正されました ([#96702](https://github.com/kubernetes/kubernetes/pull/96702), [lingsamuel](https://github.com/lingsamuel))
- `kubectl kustomize` コマンドが [kustomize/v4.2.0](https://github.com/kubernetes-sigs/kustomize/releases/tag/kustomize%2Fv4.2.0) に更新されました ([#103419](https://github.com/kubernetes/kubernetes/pull/103419), [natasha41575](https://github.com/natasha41575)) [SIG CLI]
- `kubectl kustomize` コマンドが [kustomize/v4.1.3](https://github.com/kubernetes-sigs/kustomize/releases/tag/kustomize%2Fv4.1.3) に更新されました([#102193](https://github.com/kubernetes/kubernetes/pull/102193), [gautierdelorme](https://github.com/gautierdelorme))
- `kubectl kustomize` コマンドが [kustomize/v4.1.2](https://github.com/kubernetes-sigs/kustomize/releases/tag/kustomize%2Fv4.1.2) に更新されました ([#101120](https://github.com/kubernetes/kubernetes/pull/101120), [monopole](https://github.com/monopole))
- kubectl: Quota が一貫した単位形式で表示されるように修正されました ([#102177](https://github.com/kubernetes/kubernetes/pull/102177), [atiratree](https://github.com/atiratree)) [SIG CLI]

### Other (そのほか)

- `kubectl autoscale` コマンドから廃止予定だった `--generator` フラグが削除されました ([#99900](https://github.com/kubernetes/kubernetes/pull/99900), [MadhavJivrajani](https://github.com/MadhavJivrajani))
- `kubectl create deployment` コマンドから廃止予定だった `--generator` フラグが削除されました ([#99915](https://github.com/kubernetes/kubernetes/pull/99915), [BLasan](https://github.com/BLasan))
- コマンドの説明や例文を更新し、文法や句読点の整合性が改善されました ([#103524](https://github.com/kubernetes/kubernetes/pull/103524), [bergerhoffer](https://github.com/bergerhoffer)) [SIG Auth and CLI]