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

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

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

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

- `kubectl config set-credentials コマンド`
    - `--exec-interactive-mode` フラグ: kubeconfig user エントリの exec credentials plugin の InteractiveMode を設定
    - `--exec-provide-cluster-info` フラグ: kubeconfig user エントリの exec credentials plugin の ProvideClusterInfo を設定

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

- `kubectl create token --duration` フラグ: 値に `0` を受け入れるようになり、指定された場合にデフォルト値を使用する
- `kubectl debug --profile` フラグ: `sysadmin` プロファイルが追加

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

なし

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

なし

**そのほか**

- `kubectl create deployment --image` フラグ: ヘルプメッセージだけの変更で `--image` フラグを複数使用して複数コンテナの Deployment を作成できることを提示

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

## 所感

今回も目立った新機能はありませんでしたが、`kubectl exec/attach/port-forward` コマンドでの kubectl から API サーバ、kubelet の双方向ストリーミングプロトコルを SPDY/3.1 から WebSockets に移行する取り組みが進んでいます ([KEP 4006](https://github.com/kubernetes/enhancements/issues/4006)) 。多くの L7 プロキシやロードバランサが SPDY をサポートしていないことが問題になっていました。v1.30 で `kubectl exec/attach/cp` はベータに昇格しデフォルトで有効化、`kubectl port-forward` はアルファで提供され、有効には kubectl で `KUBECTL_PORT_FORWARD_WEBSOCKETS=true` の付与、API サーバで `PortForwardWebsockets` feature gate を有効にして使用できるようになりました。

## What's New (Major Themes)

なし

## Urgent Upgrade Notes

なし

## Changes by Kind

### Deprecation

- kubectl: apply の廃止予定だった `prune-whitelist` フラグが削除されました。代わりに `prune-allowlist` フラグを使用してください。 ([#120246](https://github.com/kubernetes/kubernetes/pull/120246), [pacoxu](https://github.com/pacoxu))

### API Change

なし

### Feature

- `kubectl get cronjob` の出力に Timezone カラムが追加されました ([#122231](https://github.com/kubernetes/kubernetes/pull/122231), [ardaguclu](https://github.com/ardaguclu))
- `kubectl describe` の `VolumeAttributesClass` でより多くの情報が出力されるようになりました ([#122640](https://github.com/kubernetes/kubernetes/pull/122640), [carlory](https://github.com/carlory))
    - :memo: `VolumeAttributesClass` は `kubectl describe` に対応していなかったので、この変更で Events が出力されるようになりました
- `kubectl describe`: pod template の出力に Suspend to job と Node-Selectors と Tolerations が追加されました ([#122618](https://github.com/kubernetes/kubernetes/pull/122618), [ivanvc](https://github.com/ivanvc))
    - :memo: それら以外に BackoffLimit と TTLSecondsAfterFinished も追加されています
- `kubectl get job` はジョブリストにステータスを表示するようになりました ([#123226](https://github.com/kubernetes/kubernetes/pull/123226), [ivanvc](https://github.com/ivanvc))
- kubectl `port-forward` over websockets (SPDY トンネリング) が `Alpha` 機能フラグ環境変数 `KUBECTL_PORT_FORWARD_WEBSOCKETS=true` を使用して有効にできるようになりました。通信先の API サーバもまたは `Alpha` 機能フラグ PortForwardWebsockets を有効にしておく必要があります。 ([#123413](https://github.com/kubernetes/kubernetes/pull/123413), [seans3](https://github.com/seans3))
    - :memo: [KEP 4006](https://github.com/kubernetes/enhancements/issues/4006) の `kubectl exec/attach/port-forward` での双方向ストリーミングプロトコルを SPDY/3.1 から WebSockets に移行する取り組みの一貫です。「kubectl と API サーバ間」と「API サーバと kubelet 間」、「kubelet とコンテナランタイム間」の3つがあり、この PR は「kubectl と API サーバ間」の `kubectl port-forward` コマンドへの対応です。
    - SPDY は2015年以降非推奨となっており、今現在多くのプロキシ、ゲートウェイ、ロードバランサが SPDY をサポートしていません。SPDY は Google が開発したプロトコルで HTTP/2 策定のベースになりました。
    - v1.30 時点でクライアント (kubectl) から API サーバ間の通信に SPDY プロトコルを WebSocket でトンネリングするという手法が取られています。将来的に API サーバと kubelet 間の通信が WebSocket に移行するとクライントから API サーバ、kubelet までの通信で SPDY トンネリングなしに WebSocket に完全に置き換えられる計画です。
    - ユーザにとっての主問題は API サーバ前段のプロキシやロードバランサが SPDY をサポートしているものを選択しなければならなかったことなので (AWS ALB は SPDY をサポートしていません）、SPDY トンネリングでも解決します。なお L4 であれば問題になりません。
- `kubectl debug` に 新しい `custom` フラグが導入され、ユーザが定義済みのプロファイルをカスタマイズできるようになりました ([#120346](https://github.com/kubernetes/kubernetes/pull/120346), [ardaguclu](https://github.com/ardaguclu))
    - :memo: `custom` フラグに container spec が JSON 形式で書かれたファイルを指定する形で使用します
- kubectl config set-credentials コマンドに `exec-interactive-mode` と `exec-provide-cluster-info` フラグが追加されました ([#122023](https://github.com/kubernetes/kubernetes/pull/122023), [ardaguclu](https://github.com/ardaguclu))
- Kubectl debug は sysadmin プロファイルを含むようになりました ([#119200](https://github.com/kubernetes/kubernetes/pull/119200), [eiffel-fl](https://github.com/eiffel-fl))
    - :memo: privileged ありで実行されます
- kubectl で RemoteCommand over WebSockets を無効にするには環境変数フィーチャゲート `KUBECTL_REMOTE_COMMAND_WEBSOCKETS=false` を明示的に指定する必要があります ([#123281](https://github.com/kubernetes/kubernetes/pull/123281), [seans3](https://github.com/seans3))
    - :memo: `kubectl exec/attach` で WebSocket がデフォルトで使用されるようになりました

## Documentation

- `unmanagedWarning`との文法的な一貫性を保ちつつ、より分かりやすくするために `unmanagedFatal` のエラーメッセージを修正しました。この改善により、ユーザにとってより理解しやすいプロンプトが表示されるようになりました。 ([#120159](https://github.com/kubernetes/kubernetes/pull/120159), [Ithrael](https://github.com/Ithrael))
    - :memo: `kubectl drain` コマンドで bare pods の evict に失敗する場合のエラーメッセージを改善したという話で `cannot delete Pods that declare no controller (use --force to override)` になりました

## Bug or Regression

- `kubectl get hpa` の実行で使用率の情報にメトリック名が追加されました ([#122804](https://github.com/kubernetes/kubernetes/pull/122804), [sreeram-venkitesh](https://github.com/sreeram-venkitesh))
- `kubectl explain` でフィールドタイプに enum が定義されている場合にそれらを表示するように修正されました ([#123023](https://github.com/kubernetes/kubernetes/pull/123023), [ah8ad3](https://github.com/ah8ad3))
    - :memo: べんり
- API 呼び出し中にエラーが発生した場合、`kubectl` drain が pod を削除したと判断するバグが修正されました ([#122574](https://github.com/kubernetes/kubernetes/pull/122574), [brianpursley](https://github.com/brianpursley))
    - :memo: 例えば drain 中に control-plane ノードが削除されると pod が存在するにも関わらず削除したと判断してしまっていました。エラー処理の条件が甘かったことが原因。
- kubectl バージョン `1.29.0` で `--attach` フラグが無視されるリグレッションが修正されました ([#122447](https://github.com/kubernetes/kubernetes/pull/122447), [ardaguclu](https://github.com/ardaguclu))
- `kubectl logs <pod-name>` の使用で pod が見つからなかった際に、エラーメッセージに namespace が含まれるようになりました。以前は "Error from server (NotFound): pods "my-pod-name" not found" というメッセージでした。現在は "Error from server (NotFound): pods "my-pod-name" not found in namespace "default"" のようにメッセージに namespace が反映されます。 ([#120111](https://github.com/kubernetes/kubernetes/pull/120111), [newtondev](https://github.com/newtondev))

### Other (Cleanup or Flake)

- `kubectl create` token duration (期間) にデフォルト値として `0` を受け付けるようになりました ([#123565](https://github.com/kubernetes/kubernetes/pull/123565), [ah8ad3](https://github.com/ah8ad3))

### Uncategorized

- ライブラリとしてインポートしたときに `kubectl apply` がパニックになる問題が修正されました ([#122346](https://github.com/kubernetes/kubernetes/pull/122346), [Jefftree](https://github.com/Jefftree))