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

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

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

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

- `kubectl diff --concurrency` フラグ: 差分を並列処理するオブジェクトの数。数が大きいほど高速だが、より多くのメモリ、I/O、CPU を使用する (デフォルトは 1)

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

なし

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

なし

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

- `kubectl version --short` フラグ: バージョン数のみを出力する。デフォルトの挙動が `--short` フラグに揃えられたため削除された。

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

## 所感

SIG-CLI は完全に落ち着いており小さい変更とバグ修正のみでした。

`SelfSubjectReview` API が v1 に昇格し、`kubectl auth whoami` が GA したのはめでたいです。これまでは自身のユーザ名やグループを知る方法がなかったので、RBAC の設定のときに面倒でした。

`kubectl diff --concurrency` フラグは地味に便利です。CI 時に時間がかかっている場合は並列数を高く設定してみると改善されるかもしれません。

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

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

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

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

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

### Deprecation（廃止）

- `kubectl version` のデフォルトの出力を `kubectl version --short` が出力するものと同じに変更され、`--short` フラグを完全に削除されました ([#116720](https://github.com/kubernetes/kubernetes/pull/116720), [soltysh](https://github.com/soltysh))
    - :memo: v1.24 から `kubectl version` を実行すると警告が出るようになってました

### API Change（API の変更）

- `SelfSubjectReview` API が `authentication.k8s.io/v1` に昇格し、`kubectl auth whoami` コマンドは GA しました ([#117713](https://github.com/kubernetes/kubernetes/pull/117713), [nabokihms](https://github.com/nabokihms)) [SIG API Machinery, Architecture, Auth, CLI and Testing]
    - :memo: `SelfSubjectReview` API は自身のトークンや証明書からユーザ情報（ユーザ名やグループ）を返してくれる機能で、`kubectl auth whoami` はその API を使うコマンドです
    - :memo: `Token Review` API という似た機能がありますが、こちらは自身ではなく ServiceAccount トークンを検証してくれるものです

### Feature（機能）

- `kubectl diff` で処理の並列数を設定するための `--concurrency` フラグが追加されました ([#118810](https://github.com/kubernetes/kubernetes/pull/118810), [brancz](https://github.com/brancz))
    - :memo: `kubectl diff` は内部的に diff が処理が直列で実行されていたため、非常に多くのオブジェクトを処理しないといけない場合に時間がかかる問題がありました
    - :memo: `--concurrency` フラグのデフォルト値は `1` のため、並列に処理したい場合は明示的に値を指定する必要があります
- kubectl に新しいコマンドライン引数 `--interactive` が追加されました。新しいコマンドライン引数により、ユーザはリソースごとの削除要求を対話的に確認できます。 ([#114530](https://github.com/kubernetes/kubernetes/pull/114530), [ardaguclu](https://github.com/ardaguclu)) [SIG CLI and Testing]
    - :memo: 次のように削除前に削除対象となるオブジェクトリストを確認できます  
        ```
         $ KUBECTL_INTERACTIVE_DELETE=true k delete po --all --interactive
        You are about to delete the following 3 resource(s):
        pod/nginx-7b77898b76-kpkdc
        pod/nginx-7b77898b76-tfcc2
        pod/nginx-7b77898b76-v5kgv
        Do you want to continue? (y/n): y
        pod "nginx-7b77898b76-kpkdc" deleted
        pod "nginx-7b77898b76-tfcc2" deleted
        pod "nginx-7b77898b76-v5kgv" deleted
        ```
    - :memo: `--interactive` フラグはアルファであり、使用には `KUBECTL_INTERACTIVE_DELETE=true` 環境変数を付与する必要があります
    - :memo: 個人的にインタラクティブな処理は不要で、kubectl plugin でカバーすべきという意見なのですが、ほしい人は多かったかもしれません
- `wait --for=jsonpath='{expression}'[=value]` の "value" の部分がオプションになった。値を指定しない場合、つまり `wait --for=jsonpath='{expression}'` のようなコマンドの場合、式がオブジェクトやリテラルのような *任意の* 単一の JSON 値を返すと、待機条件がマッチしたと解釈される。 ([#118160](https://github.com/kubernetes/kubernetes/pull/118160), [minherz](https://github.com/minherz))
    - :memo: これまではフィールドがすでに存在している場合にしか使用できませんでしたが、この変更で新しくフィールドが追加される場合にも対応できるようになりました
- サブコマンドを持つコマンドのヘルプメッセージがよりわかりやすくなりました。これは `kubectl <command> --help ...` の代わりに完全なコマンドを表示します。

`kubectl create secret --help` の説明が変更されました。3種類のシークレットタイプの簡単な紹介と、コマンドの使い方の明確な手引が追加されました。 ([#117930](https://github.com/kubernetes/kubernetes/pull/117930), [LronDC](https://github.com/LronDC))
    - :memo: これまでサブコマンド（例えば `kubectl create`）のヘルプを出力した場合にも `kubectl <command> --help` となってしまっていたところが、`kubectl create <command> --help` と出力されるようになったというものです

## Bug or Regression

- `kubectl {$COMMAND}--help` 内のコードブロックに3つのインデントが追加されました ([#118029](https://github.com/kubernetes/kubernetes/pull/118029), [ardaguclu](https://github.com/ardaguclu))
- 手動でトリガされた場合に Cronjob の `status.lastSuccessfulTime` が反映されない問題が修正されました ([#118530](https://github.com/kubernetes/kubernetes/pull/118530), [carlory](https://github.com/carlory))
    - :memo: 「手動にトリガ」とは、`kubectl create job --from cronjob/name` を使用して Job を作成した場合のことを言ってます
    - :memo: `kubectl create job` コマンドで作成した Job に CronJob controller が期待する Owner Reference が設定されていなかったことが問題でした
- Deployment で `kubectl port-forward` を使用すると、実行中の pod が利用可能な場合でも、終了中の pod に接続されるバグが修正されました ([#119256](https://github.com/kubernetes/kubernetes/pull/119256), [brianpursley](https://github.com/brianpursley)) [SIG CLI]
    - :memo: Deployment でとありますが、Deployment に限らず Service などを使った場合でも同様です。また、`kubectl port-forward` に限らず `kubectl logs` など他のコマンドでも同様です。
- explain が jsonpath を正しく認識していなかったバグが修正されました ([#115694](https://github.com/kubernetes/kubernetes/pull/115694), [mpuckett159](https://github.com/mpuckett159))
    - :memo: どうやら CR でフィールド名に `.` が含まれる場合に正しく処理されていなかったようです。通常フィールド名にドットを使うことはないと思うので、ほぼほぼ影響なさそうです
- 指定した api version に変換できないリソースがあった場合に `kubectl-convert` が失敗する問題が修正されました。新しい動作として、変換に失敗したリソースを警告し、残りのリソースの変換を継続するようになりました ([#117002](https://github.com/kubernetes/kubernetes/pull/117002), [gxwilkerson33](https://github.com/gxwilkerson33))
    - :memo: `kubectl-convert` は古い API バージョンのマニフェストを指定した API バージョンに変換するコマンドで v1.20 で削除されましたが、kubectl plugin として使えるようにリポジトリに残っています (https://github.com/kubernetes/kubernetes/tree/master/pkg/kubectl/cmd/convert)
- 指定された種類のリソースがない場合に、kubectl rollout status からの応答やエラーがない問題が修正されました ([#117884](https://github.com/kubernetes/kubernetes/pull/117884), [gxwilkerson33](https://github.com/gxwilkerson33)) [SIG CLI]
- restricted debug profile が修正されました ([#117543](https://github.com/kubernetes/kubernetes/pull/117543), [mochizuki875](https://github.com/mochizuki875))
    - :memo: `kubectl debug` の restricted debug profile で作成される pod が Pod Security Standard の restricted ポリシーを満たしていなかったようです。具体的には `allowPrivilegedEscalation` と `seccompProfile` が指定されていませんでした
- `kubectl events --for` が replicasets.apps などの完全修飾名もサポートするようになりました ([#117034](https://github.com/kubernetes/kubernetes/pull/117034), [ardaguclu](https://github.com/ardaguclu))
- すべてのリソースで `kubectl explain` が正しく動作するようになりました ([#118876](https://github.com/kubernetes/kubernetes/pull/118876), [atiratree](https://github.com/atiratree))
    - :memo: bindings のように `GET` メソッドを持たないリソースで explain が機能していなかったようです
- `kubectl expose` は同じポートに異なるプロトコルを持つ Service を作成することをサポートするようになりました ([#114909](https://github.com/kubernetes/kubernetes/pull/114909), [aimuz](https://github.com/aimuz))

### Other (Cleanup or Flake)

- `genericclioptions.IOStreams` が廃止されました。`genericiooptions.IOStreams` を使用してください ([#117102](https://github.com/kubernetes/kubernetes/pull/117102), [ardaguclu](https://github.com/ardaguclu))
- すでに冗長な `KUBECTL_EXPLAIN_OPENAPIV3` が削除されました ([#119286](https://github.com/kubernetes/kubernetes/pull/119286), [ardaguclu](https://github.com/ardaguclu))
    - :memo: OpenAPI v3 は 1.27 でベータに昇格しており環境変数の指定はすでに不要でした