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

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

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

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

- `kubectl delete -i/--interactive`: true の場合、オブジェクトを削除する前に削除対象のオブジェクトをリストする

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

なし

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

なし

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

なし

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

## 所感

今回も SIG-CLI に関連する特出した変更はなく書くことがありません（終）

## What's New (Major Themes)（主要な変更）

なし

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

なし

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

### Deprecation（廃止）

なし

### API Change（API の変更）

なし

### Feature（機能）

- `kubectl node drain` helper に `OnPodDeletionOrEvictionStarted` と `OnPodDeletionOrEvictionFailed` のコールバックが追加された。`kubectl` を拡張している人はこれらの新しいコールバックを使うことでより詳細な設定が可能になる。加えて `OnPodDeletedOrEvicted` node drain helper callback が廃止予定になった。 ([#117502](https://github.com/kubernetes/kubernetes/pull/117502), [@adilGhaffarDev](https://github.com/adilGhaffarDev)) [sig/cli]
    - :memo: k8s.io/kubectl/pkg/drain.Helper は drain 動作を制御するヘルパ。リリースノードの `OnPodDeletionOrEvictionFailed` は誤りで「`OnPodDeletionOrEvictionStarted` と `OnPodDeletionOrEvictionFinished`」が正しい。名前のとおり Pod の削除または Eviction が開始/完了した際に任意の関数を呼び出すことができる。
    - :memo: https://pkg.go.dev/k8s.io/kubectl/pkg/drain#Helper
- プラグインからサブコマンドの詳細を出力するように `kubectl help` が変更された ([#116752](https://github.com/kubernetes/kubernetes/pull/116752), [@xvzf](https://github.com/xvzf)) [sig/cli]
    - :memo: `kubectl help` コマンドで出力されるサブコマンドリストに `User-Installed Plugin Commands:` としてプラグインリストが並ぶようになった
- kubectl describe pvc `<PVC>` コマンドの出力の "Used by:" の部分に ephemeral storage volume として `<PVC>` を使用する pods をリストするようになった ([#120427](https://github.com/kubernetes/kubernetes/pull/120427), [@MaGaroo](https://github.com/MaGaroo)) [sig/cli]
- プラグインのサブコマンド解決機能が `beta` に昇格。 ([#120663](https://github.com/kubernetes/kubernetes/pull/120663), [@ardaguclu](https://github.com/ardaguclu)) [sig/cli,sig/testing]
    - :memo: 例えば `kubectl-create-foo` プラグインは `kubectl create` がすでに存在することからこれまでは使用できなかったが、これを許可する機能。ベータに昇格しデフォルトで有効になった。
    - https://github.com/kubernetes/enhancements/tree/master/keps/sig-cli/3638-kubectl-plugin-subcommands
- `kubectl delete` の `--interactive` フラグがデフォルトで全ユーザーに表示されるようになった ([#120416](https://github.com/kubernetes/kubernetes/pull/120416), [@ardaguclu](https://github.com/ardaguclu)) [sig/cli,sig/testing]
    - :memo: `kubectl delete` コマンドで実際にオブジェクトを削除する前に削除対象のオブジェクトリストを確認できる機能。これまでは `KUBECTL_INTERACTIVE_DELETE` 環境変数を付与する必要があったが、昇格してデフォルトで有効になった。
    - :memo: `This flag is in Alpha.` とあるが v1.29 でベータに昇格しており、これは嘘だ
        - 直しました。 [Update the help mesage of interactive flag in kubectl delete by superbrothers · Pull Request \#122441 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/122441#issuecomment-1867235772)
- kubectl イメージの `Dockerfile` が更新され、特定のベースイメージと必須ユーティリティ (bash と jq) が追加された ([#119592](https://github.com/kubernetes/kubernetes/pull/119592), [@rayandas](https://github.com/rayandas)) [sig/node,sig/cli,sig/testing,sig/release]
    - :memo: [Make our \`kubectl\` image more useful? · Issue \#119567 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/119567) が提案イシューでもうちょっと便利なツールが入っててもいいじゃんというもの。単独で下記のようなシェルスクリプトが実行できるとうれしいよねとある。
        ```shell
        while true; do
          kubectl get -o json node $THIS_NODE | jq -r '.status.conditions[] | [.type,.status] | @tsv' | grep Ready | cut -f2 > .ready.tmp
          mv -f file.tmp ready
          sleep 10
        done
        ```
    - :memo: 今回 debian ベースとなり `bash`, `grep`, `sed`, `gawk`, `coreutils`, `jq`, `diffutils ` が追加されている
    - :memo: いいんじゃんと思う一方でやりだしたらきりがないのではという気もする


## Documentation

- 特定の Deployment を指定せずに `kubectl rollout restart` を使用する場合の説明と例が追加された ([#120118](https://github.com/kubernetes/kubernetes/pull/120118), [@Ithrael](https://github.com/Ithrael)) [sig/cli]
    - :memo: namespace に含まれるすべてのオブジェクトが対象になる

## Bug or Regression

- netadmin デバッグプロファイルに `CAP_NET_RAW` が追加され、ノードのデバッグ時の privileged が削除された ([#118647](https://github.com/kubernetes/kubernetes/pull/118647), [@mochizuki875](https://github.com/mochizuki875)) [sig/cli,sig/testing]
    - :memo: `kubectl debug` コマンドの `netadmin` profile で `EphemeralContainer` と `DebuggingContainer` が対象の場合というのがより正確。これまでは `NET_ADMIN` のみが追加されていた。
    - :memo: `NET_RAW` がないと `ping` コマンドが実行できない
- フルネームのリソースに対しての `kubectl events` が `GroupVersion` でイベントをフィルタしない問題が修正された ([#120119](https://github.com/kubernetes/kubernetes/pull/120119), [@Ithrael](https://github.com/Ithrael)) [sig/cli,sig/testing]
    - :memo: `kubectl events --for Resource1.v1.group1/name` のように GVK で書くとフィルタにマッチしていなかったみたい
- `kubectl wait --for` での jsonpath 式の扱いが改善された。フィールドの内容にマッチする単純なフィルター式を使用できるようになった。 ([#118748](https://github.com/kubernetes/kubernetes/pull/118748), [@andreaskaris](https://github.com/andreaskaris)) [sig/cli,sig/testing]
    - :memo: `kubectl wait --for='jsonpath={.status.conditions[?(@.type=="Ready")].status}=True' pod/busybox1` のように Condition のタイプを指定した条件がこれまで機能してなかったみたい
    - :memo: 単純に `=` で最初に分割してしまっていたことが原因みたい
- `kubectl` - `kubectl prune v2`: annotation が `contains-group-resources` から `contains-group-kinds` に変更された。これが KEP で定義したものであり、エンドユーザにとってより明確なため。この機能は `alpha` だが、以前の annotation を認識する。この移行サポートは `beta`/`GA` では削除される予定。 ([#118942](https://github.com/kubernetes/kubernetes/pull/118942), [@justinsb](https://github.com/justinsb)) [sig/cli]
    - :memo: prune v2 は現在複数の GitOps ツールなどで独自に prune の実装がされてしまっているのを統一する取り組み
    - :memo: 現在 `kubectl apply` に存在する prune 機能は対象のリソースが限定されているなどの多くの問題があり使い物にならない
    - :memo: prune v2 のしくみは個人的には複雑なのでやめたほうがいいんじゃないかと思っている。詳細は https://qiita.com/superbrothers/items/16212fc088bfb2849585#%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1-applyset-%E6%A9%9F%E8%83%BD に以前書いているので参照。
- describe PVC サブコマンドに `--show-events=false` 引数を渡すと `kubectl` が events を表示しないように修正された ([#120380](https://github.com/kubernetes/kubernetes/pull/120380), [@MaGaroo](https://github.com/MaGaroo)) [sig/cli]
    - :memo: 表示されちゃってたみたい

### Other (Cleanup or Flake)

- feature flag の値は小文字でも大文字でも使用できるようになったが、名前は一致しなければならない ([#121441](https://github.com/kubernetes/kubernetes/pull/121441), [@soltysh](https://github.com/soltysh)) [sig/cli]
    - :memo: `TrUe` でも `fAlSe` でもよくなったという話
- `1.22` より前のバージョンの ephemeral container legacy server support のサポートが削除された ([#119537](https://github.com/kubernetes/kubernetes/pull/119537), [@ardaguclu](https://github.com/ardaguclu)) [sig/cli]
    - :memo: 1.22 より前に実装された ephemeral container のサポートはもうサポートバージョンから離れているしいらないよねってことで削除
    - :memo: 同じ PR で `DebugOptions` struct に AttachFunc メソッドが追加されている。どうやら debug コマンドを拡張する際にアタッチの処理を変えたいってことらしいが、なぜ同じ PR に入っているのか