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

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

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

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

- `kubectl alpha event` の次のフラグ:
    - `--output`: `json|yaml` サポートが追加され、将来カスタムカラム等の機能が追加される予定
    - `--types`: `Normal` または `Warning` が指定でき、特定のイベントタイプのみをフィルタして出力する。デフォルトは `Normal,Warning` で、すべてのタイプが含まれる。
    - `--no-headers`: デフォルトの出力形式でヘッダを出力しなくなる
- `kubectl diff --show-managed-fields` フラグ: 出力に managed-fields の差分を含むようになる。デフォルトでは含まれないように変更された。
- `kubectl top pod --sum` フラグ: Pods が使用するリソースの合計値が出力される

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

- `kubectl kustomize` コマンド: kustomize v4.5.7 にアップグレード

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

なし

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

- `kubectl run` の次のフラグ:
    - `--cascade`, `--filename`, `--force`, `--grace-period`, `--kustomize`, `--recursive`, `--timeout`, `--wait`

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

## 所感

1.25 でも kubectl に主だった変更はなく、細かい修正や機能追加があります。

特に便利なのは `kubectl diff` コマンドで managed-fields が含まれなくなった変更です。managed-fields は Server-Side Apply において、どの manager がどのフィールドを管理しているかの情報をシステムが管理するためのフィールドで、一般にユーザがこのフィールドが変更されることについて知る必要はないため、`kubectl get -o yaml` コマンドで managed-fields がデフォルトで出力されなくなったのに次いで `kubectl diff` コマンドでも出力されなくなりました。

Server-Side Apply の詳細について興味ある方は、[Kubernetes 1\.14: Server\-side Apply \(alpha\) \- Qiita](https://qiita.com/superbrothers/items/aeba9406691388b6a19e) を、managed-fields に興味がある方は [わかる！metadata\.managedFields \- Speaker Deck](https://speakerdeck.com/superbrothers/wakaru-metadata-dot-managedfields) を参照ください。

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

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

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

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

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

### Deprecation（廃止）

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

### API Change（API の変更）

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

### Feature（機能）

- `kubectl describe pod` コマンドの出力に Service Account フィールドが追加されました ([#111192](https://github.com/kubernetes/kubernetes/pull/111192), [aufarg](https://github.com/aufarg))
    - :memo: 最近そういえば ServiceAccount の情報が出力されてないなーと思っていたところでした。べんり。
- alpha events に `--output`, `--types`, `--no-headers` の新しいフラグが追加されました ([#110007](https://github.com/kubernetes/kubernetes/pull/110007), [ardaguclu](https://github.com/ardaguclu))
    - :memo: `--output`: `json|yaml` サポートが追加され、将来カスタムカラム等の機能が追加される予定
    - :memo: `--types`: `Normal` または `Warning` が指定でき、特定のイベントタイプのみをフィルタして出力する。デフォルトは `Normal,Warning` で、すべてのタイプが含まれる。
    - :memo: `--no-headers`: デフォルトの出力形式でヘッダを出力しなくなる
- `kubectl top pod` に sum 機能が追加されました ([#105100](https://github.com/kubernetes/kubernetes/pull/105100), [lauchokyip](https://github.com/lauchokyip))
    - :memo: 次のように Pods が使用するリソースの合計値が出力されるようになる  
        ```
        $ kubectl top po --sum
        NAME                     CPU(cores)   MEMORY(bytes)
        nginx-75889c7749-m98c8   0m           3Mi
        nginx-75889c7749-rqtgd   22m          3Mi
                                 ________     ________
                                 22m          7Mi
        ```
    - :memo: `kubectl top` コマンドを使用するには、対象のクラスタで metrics-server が実行されている必要があります。 https://github.com/kubernetes-sigs/metrics-server
- Kubectl: `kubectl rollout status` で複数リソースがサポートされました ([#108777](https://github.com/kubernetes/kubernetes/pull/108777), [pjo256](https://github.com/pjo256))
    - :memo: `kubectl rollout status deploy/nginx deploy/nginx2` のように複数のオブジェクトを一度に渡せるようになったようです。
- 新しい `KUBECACHEDIR` 環境変数が導入され、デフォルトの discovery cache のディレクトリである `HOME/.kube/cache` をオーバライドできるようになりました。 ([#109479](https://github.com/kubernetes/kubernetes/pull/109479), [ardaguclu](https://github.com/ardaguclu))
    - :memo: discovery cache の指定はこれまでも `--cache-dir` フラグでできましたが、毎回指定するのが面倒なので環境変数でやりたいということのようです
- TopologySpreadConstraints が pods, deployments, daemonsets 等に対する describe コマンドで表示されるようになりました ([#109563](https://github.com/kubernetes/kubernetes/pull/109563), [ardaguclu](https://github.com/ardaguclu))
    - :memo: これまで含まれていなかったので追加されたようで、次のように表示されます  
        ```
        Topology Spread Constraints:  topology.kubernetes.io/zone1:ScheduleAnyway when max skew 3 is exceeded
                                      topology.kubernetes.io/zone2:DoNotSchedule when max skew 1 is exceeded for selector foo=bar
        ```
- `kubectl diff` はデフォルトで managed fields を無視するように変更されました。そのため、差分に managed fields を含めるための `--show-managed-fields` フラグが追加されました。 ([#111319](https://github.com/kubernetes/kubernetes/pull/111319), [brianpursley](https://github.com/brianpursley))
    - :memo: `kubectl diff` コマンドの出力で表示されてしまっていた managed-fields の変更が今後デフォルトで出力されなくなりました。さいこう。
    - :memo: ただ、現状差分があると `metadata.generation` フィールドの値がインクリメントされてそれが差分として表示されてしまって邪魔なので、これも非表示にしたい気がする (イシューは作っておきました https://github.com/kubernetes/kubectl/issues/1267)
        ```diff
        $ kubectl diff -f nginx.yaml
        diff -u -N /tmp/LIVE-2978127705/apps.v1.Deployment.default.nginx /tmp/MERGED-2861968783/apps.v1.Deployment.default.nginx
        --- /tmp/LIVE-2978127705/apps.v1.Deployment.default.nginx       2022-08-28 10:50:39.099818887 +0900
        +++ /tmp/MERGED-2861968783/apps.v1.Deployment.default.nginx     2022-08-28 10:50:39.099818887 +0900
        @@ -4,7 +4,7 @@
           annotations:
             deployment.kubernetes.io/revision: "1"
           creationTimestamp: "2022-08-28T01:36:11Z"
        -  generation: 2
        +  generation: 3
           labels:
             app: nginx
           name: nginx
        @@ -30,7 +30,7 @@
                 app: nginx
             spec:
               containers:
        -      - image: nginx
        +      - image: nginxinc/nginx-unprivileged
                 imagePullPolicy: Always
                 name: nginx-unprivileged
                 resources: {}
        ```
- `StatefulSets` の `MaxUnavailable`  は、一度に1つ以上の Pods を停止させることでより早い `RollingUpdate` を可能にします。`RollingUpdate` の間に停止させたい Pods の数は `maxUnavailable` パラメータで設定できます。 ([#109251](https://github.com/kubernetes/kubernetes/pull/109251), [krmayankk](https://github.com/krmayankk))
    - :memo: StatefulSets の `maxUnavailable` について色々書かれていますが、この機能自体は 1.24 でアルファで追加されており、ここでの変更は `maxUnavailable` フィールドを `kubectl describe statefulsets` コマンドの出力に含まれるようにするもの

### Documentation（ドキュメント）

- kubectl 中国語翻訳の最適化 ([#110538](https://github.com/kubernetes/kubernetes/pull/110538), [hwdef](https://github.com/hwdef)) [SIG CLI]

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

- replace コマンドで dry-run と force のフラグが設定されている場合は、"--force が設定されている場合、dry-run は使用できません" というエラーメッセージが出力されるようになりました ([#110326](https://github.com/kubernetes/kubernetes/pull/110326), [ardaguclu](https://github.com/ardaguclu))
- 同じ値のラベルを設定してもエラーにせず無視するようになりました ([#105936](https://github.com/kubernetes/kubernetes/pull/105936), [zigarn](https://github.com/zigarn))
    - :memo: `kubectl label` コマンドは、これまで追加しようとしているラベルのキーがオブジェクトのラベルに存在している場合にエラーになっていました（`--overwrite` フラグで上書き可能）が、値が同一の場合はエラーにせずコマンドが成功するように変更されました
- `kubectl run` コマンドの使用されていないフラグが削除されました ([#110668](https://github.com/kubernetes/kubernetes/pull/110668), [brianpursley](https://github.com/brianpursley))
    - :memo: 具体的には次のフラグが削除されました
        - `--cascade`, `--filename`, `--force`, `--grace-period`, `--kustomize`, `--recursive`, `--timeout`, `--wait`
- `kubectl kustomize` の機能が https://github.com/kubernetes-sigs/kustomize/releases/tag/kustomize%2Fv4.5.7 に記述されているとおりにアップグレードされました ([#111606](https://github.com/kubernetes/kubernetes/pull/111606), [natasha41575](https://github.com/natasha41575))
- `pod.Spec.RuntimeClassName` フィールドが kubectl describe コマンドで利用可能になりました ([#110914](https://github.com/kubernetes/kubernetes/pull/110914), [yeahdongcn](https://github.com/yeahdongcn))

### Other (Cleanup or Flake)（そのほか）

- kubectl completion コマンドの short description に不足している powershell オプションが追加されました ([#109773](https://github.com/kubernetes/kubernetes/pull/109773), [danielhelfand](https://github.com/danielhelfand))
- discovery client のバースト制限のデフォルトが 300 に設定されました ([#109141](https://github.com/kubernetes/kubernetes/pull/109141), [ulucinar](https://github.com/ulucinar))
    - :memo: 以前の変更で kubectl のバースト制限は 300 に変更されたものの、client-go でのデフォルトは以前の 100 のままだったので、それも今回の変更で 300 に変更された
    - :memo: CRD の多いクラスタにおいて kubectlは `tbrl(b=300, r=50.0 qps)` に変更されたことで改善されたが、Helm 等のその他のクライアントでスロットリングが引き続き発生していた
        - `tbrl`: TokenBucketRateLimiter
        - https://github.com/kubernetes/kubernetes/blob/v1.25.0/staging/src/k8s.io/client-go/util/flowcontrol/throttle.go#L58-L66
- `kubectl run` と `kubectl debug` でアタッチに失敗した場合のエラーメッセージが改善されました ([#110764](https://github.com/kubernetes/kubernetes/pull/110764), [soltysh](https://github.com/soltysh))
    - :memo: 以前は `Error attaching ...` と表示されていたが、アタッチに失敗したことは致命的ではないため `warning: couldn't attach to pod/...` のように変更された
- 廃止予定だった `kubectl.kubernetes.io/default-logs-container` のサポートが削除されました ([#109254](https://github.com/kubernetes/kubernetes/pull/109254), [pacoxu](https://github.com/pacoxu))
    - :memo: 代わりに `kubectl.kubernetes.io/default-container` annotation を使用する必要があります
- シェル補完が `--subresource` フラグに提供されるようになりました ([#109070](https://github.com/kubernetes/kubernetes/pull/109070), [marckhouzam](https://github.com/marckhouzam))
    - :memo: `--subresource` フラグは、リソースのサブリソースを操作するためのフラグで v1.24 で実装された。現在は `status` と `scale` の2つがサポートされている。