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

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

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

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

- `kubectl config set-context --proxy-url` フラグ: kubeconfig の プロキシ URL を設定
- `kubectl create token` コマンド: Bound ServiceAccount token のリクエスト
- `kubectl get/patch/edit/replace --subresource` フラグ: サブリソースの操作
- `kubectl rollout --selector/-l` フラグ: ラベルセレクタによる対象の指定

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

- `--filename, -f` フラグ: Glob パターンを受け付けるようになりました（e.g. `-f '*.yaml'`
- `--validate` フラグ: bool から `true`, `struct`, `warn`, `false`, `ignore` の文字列を受け入れるように変更されました
    - true/strict - 検証を実施し、オブジェクトの無効なフィールドでリクエストをエラーにする。apiserver で有効な場合にはサーバサイドの検証を実行し、なっていない場合にはクライアントサイドの検証にフォールバックする。
    - warn - サーバサイドの検証を実行し、無効なフィールドについて警告する（警告のみでオブジェクトから無効なフィールドを削除してリクエストを成功させる）。サーバで検証が利用できない場合は、検証を実施しない。
    - false/ignore - 検証を実施しないで、オブジェクトから不正なフィールドを黙って削除する。
- `kubectl version`: ビルトインの Kustomize バージョンが出力されるようになりました
- `kubectl kustomize`: Kustomize v4.5.4 に更新

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

なし

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

- `kubectl run --serviceaccount/--hostport/--requests/--limits` フラグ
- `--generator` フラグ
- `--container-port` フラグ
- `kubectl kustomize --enable-managedby-label` フラグ

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

## :memo: 所感

1.24 でも引き続き目立った新機能はなく、改善、バグ修正、廃止予定だった機能の削除が主な変更でした。

## What's New (新情報)

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

## Known Issues（既知の問題）

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

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

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

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

### Deprecation（廃止）

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

### API Change（API の変更）

- kubectl のユーザヘルプコマンドの読みやすさが改善されました ([#104736](https://github.com/kubernetes/kubernetes/pull/104736), [lauchokyip](https://github.com/lauchokyip))
    - :memo: 下記の感じで改行が入るようになったようです  
    ```
    $ kubectl options
    The following options can be passed to any command:
    
        --add-dir-header=false:
            If true, adds the file directory to the header of the log messages (DEPRECATED: will be removed in a future
            release, see
            https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/2845-deprecate-klog-specific-flags-in-k8s-components)
    
        --alsologtostderr=false:
            log to standard error as well as files (DEPRECATED: will be removed in a future release, see
            https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/2845-deprecate-klog-specific-flags-in-k8s-components)
    ```
- `ServerSideFieldValidation` 機能がベータに昇格し、デフォルトで有効化されるようになりました。Kubectl 1.24 からはこの機能が有効化されているとクライアントサイトの検証の代わりにサーバサイドの検証が使われるようになりました。 ([#108889](https://github.com/kubernetes/kubernetes/pull/108889), [kevindelgado](https://github.com/kevindelgado))
    - :memo: ベータに昇格とありますが、実際にはその後に問題が見つかり、アルファに戻されています
    - :memo: CRD のメタデータの検証で問題が見つかったようです

### Feature（機能）

- `kubectl config set-cluster` に `proxy-url` フラグが追加されました ([#105566](https://github.com/kubernetes/kubernetes/pull/105566), [ardaguclu](https://github.com/ardaguclu))
- `kubectl config set-context` で補完がサポートされました ([#106739](https://github.com/kubernetes/kubernetes/pull/106739), [kebe7jun](https://github.com/kebe7jun))
- すべての `kubectl rollout` コマンドにラベルセレクタが追加されました ([#99758](https://github.com/kubernetes/kubernetes/pull/99758), [aramperes](https://github.com/aramperes))
- `kubectl diff` コマンドに `kubectl apply --prune` をシミュレートする prune フラグが追加されました ([#105164](https://github.com/kubernetes/kubernetes/pull/105164), [ardaguclu](https://github.com/ardaguclu))
    - :memo: 便利そう
- SOCKS5 プロキシ経由での kubectl コマンドの利用（`kubectl exec` と `kubectl port-forward`）がサポートされました ([#105632](https://github.com/kubernetes/kubernetes/pull/105632), [xens](https://github.com/xens))
- 最初にシェルが展開することなく、kubectl でファイル名パターンでリソースが管理できるようになりました ([#102265](https://github.com/kubernetes/kubernetes/pull/102265), [danielrodriguez](https://github.com/danielrodriguez))
    - :memo: `kubectl delete -f '*.yaml'` のような glob パターンがサポートされたという意味です。複数のファイルを指定する場合はこれまで `-f a.yaml -f b.yaml` とする必要がありました。
    - :memo: 実装としては `filepath.Glob` が使われているため、対象がファイル名でソートされるとのことです
- `kubectl get/patch/edit/replace` コマンドに status と scale サブリソースの取得と更新を行う `--subresource` フラグ（アルファ）が追加されました ([#99556](https://github.com/kubernetes/kubernetes/pull/99556), [nikhita](https://github.com/nikhita))
    - :memo: これまで subresource の操作は取得は `kubectl --raw` でいけたが、パッチは `kubectl` で実施できず curl を用いる必要があり、テストやデバッグで面倒だったということがモチベーションのようです
    - :memo: KEP: https://github.com/kubernetes/enhancements/issues/2590
- kubectl `--validate` フラグが bool から `true`, `struct`, `warn`, `false`, `ignore` の文字列を受け入れるように変更されます ([#108350](https://github.com/kubernetes/kubernetes/pull/108350), [kevindelgado](https://github.com/kevindelgado))
    - true/strict - 検証を実施し、オブジェクトの無効なフィールドでリクエストをエラーにする。apiserver で有効な場合にはサーバサイドの検証を実行し、なっていない場合にはクライアントサイドの検証にフォールバックする。
    - warn - サーバサイドの検証を実行し、無効なフィールドについて警告する（警告のみでオブジェクトから無効なフィールドを削除してリクエストを成功させる）。サーバで検証が利用できない場合は、検証を実施しない。
    - false/ignore - 検証を実施しないで、オブジェクトから不正なフィールドを黙って削除する。
- kubectl の discovery キャッシュ の TTL のデフォルト値が6時間に増やされました ([#107141](https://github.com/kubernetes/kubernetes/pull/107141), [mk46](https://github.com/mk46))
    - :memo: discovery キャッシュはクラスタで利用できる API を見つけるための仕組みで、これまでキャッシュの TTL は10分だったが、これが6時間に変更された
    - :memo: Crossplane や GCP Config Connector, Azure Service Operator といったコントローラのような多くの CRD（1000 はないものの100個はあり得る）をインストールするものの場合、discovery キャッシュの更新に数十秒かかってしまい、生産性に問題があった
- Kubectl はリソースを指定する際の `<type>/<name>` 形式の補完、`exec` コマンドの `--container/-c` フラグのコンテナ名の補完、Pod を対象とするコマンドでリソースタイプの補完をそれぞれサポートしました ([#108493](https://github.com/kubernetes/kubernetes/pull/108493), [marckhouzam](https://github.com/marckhouzam))
    - :memo: `kubectl attach/exec/logs/port-forward` コマンドは引数に Pod 名を取りますが、それに加えて Deployment や Service といったリソース名も取れます（例えば、`kubectl logs deployments/app`）。これらのコマンドはこれまで Pod 名の補完のみをサポートしていましたが、`<type>/<name>` 形式も補完されるようになりました
- `kubectl logs` は、Pod の最初のコンテナをデフォルトで選択するようになり、合わせて警告メッセージを出力するようになりました。この新しい動作は `kubectl exec` と揃えられた形です。 ([#105964](https://github.com/kubernetes/kubernetes/pull/105964), [kidlj](https://github.com/kidlj))
    - :memo: べんり
- `kubectl describe ingress` の出力は、可能であれば IngressClass 名を含むようになりました ([#107921](https://github.com/kubernetes/kubernetes/pull/107921), [mpuckett159](https://github.com/mpuckett159))
- `kubectl kustomize` と `kubectl apply -k` は Kustomize v4.5.4 に更新されました ([#108994](https://github.com/kubernetes/kubernetes/pull/108994), [KnVerey](https://github.com/KnVerey))
- `kubectl config delete-user` で補完がサポートされました ([#107142](https://github.com/kubernetes/kubernetes/pull/107142), [dimbleby](https://github.com/dimbleby))
- `kubectl create token` は ServiceAccount トークンを要求できるようになりました。ServiceAccount トークンの要求には `edit` または `admin` の RBAC ロールの権限が必要です。 ([#107880](https://github.com/kubernetes/kubernetes/pull/107880), [liggitt](https://github.com/liggitt))
    - :memo: ServiceAccount が作成されると自動的に生成されていた Secret-based ServiceAccount token が生成されなくなったため、今後 ServiceAccount のトークンを作成したい場合は Bound ServiceAccount token を使用する必要があり、そのトークンのリクエストを簡単に行えるようにするために新しく `kubectl create token` コマンドが追加された
    - :memo: Bound ServiceAccount token については [Bound Service Account Tokenとは何か \- Qiita](https://qiita.com/hiyosi/items/e4fb3d9188f8d6e650b2) を参照
- `kubectl version` は組み込みの Kustomize のバージョンを含むようになりました ([#108817](https://github.com/kubernetes/kubernetes/pull/108817), [KnVerey](https://github.com/KnVerey))
    - :memo: 次のように出力されるようになった。わざわざ Kustomize のバージョンを知るのに CHANGELOG を見に行かなくて済むようになってべんり。  
    ```
    $ kubectl version 2>/dev/null | grep Kustomize
    Kustomize Version: v4.5.4
    ```

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

- `kubectl cp` で負の値に対する `--retries` 機能が修正されました ([#108748](https://github.com/kubernetes/kubernetes/pull/108748), [atiratree](https://github.com/atiratree))
    - :memo: `--retries` フラグはもともと0より小さい値を指定した場合は無限に繰り返す仕様になっていたが正しく機能していなかったみたい  
    ```
    --retries=0: Set number of retries to complete a copy operation from a container. Specify 0 to disable or any negative value for infinite retrying. The default is 0 (no retry).
    ```
- `kubectl create secret` コマンドで不正な出力形式を使用した場合にパニックになるバグが修正されました ([#107221](https://github.com/kubernetes/kubernetes/pull/107221), [rikatz](https://github.com/rikatz))
- kubectl の `--context` フラグにコロンが含まれる値を指定すると bash 補完が効かなくなるバグが修正されました ([#107439](https://github.com/kubernetes/kubernetes/pull/107439), [brianpursley](https://github.com/brianpursley))
- drainer が Ctx または Client に nil を持つ場合に `RunCordonOrUncordon` がエラーになります ([#105297](https://github.com/kubernetes/kubernetes/pull/105297), [jackfrancis](https://github.com/jackfrancis))
- コマンドエラー（例えば `kubectl list` -> `unknown command`）が複数行のプレーンテキストではなくエスケープされた改行のログメッセージとして出力されていてエラーが読みにくかったのが修正されました ([#107044](https://github.com/kubernetes/kubernetes/pull/107044), [pohly](https://github.com/pohly))
- 冗長度の高いデバッグメッセージであるにも関わらず JSON での出力で `"v":0` と書かれていたログメッセージが修正されました ([#106978](https://github.com/kubernetes/kubernetes/pull/106978), [pohly](https://github.com/pohly))
- デフォルトバックエンドがいないときに `kubectl describe ingress` が `default-backend:80` と表示する場合に値を `<default>` として出力するように変更されました ([#108506](https://github.com/kubernetes/kubernetes/pull/108506), [jlsong01](https://github.com/jlsong01))
    - :memo: 下記のように表示されていたのが改善された感じです  
    ```
    Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
    ```
- 冗長設定が有効な場合に kubectl のレスポンスにレスポンスステータスとヘッダが再度追加されました ([#108505](https://github.com/kubernetes/kubernetes/pull/108505), [rikatz](https://github.com/rikatz))
- 1.24 で `ServerSideFieldValidation` 機能がアルファに戻されました ([#109271](https://github.com/kubernetes/kubernetes/pull/109271), [liggitt](https://github.com/liggitt))
- `kubectl version` は余分な引数が指定された場合に失敗するように修正されました ([#107967](https://github.com/kubernetes/kubernetes/pull/107967), [jlsong01](https://github.com/jlsong01))

### Other (Cleanup or Flake)

- `kubectl describe priorityclass` に PreemptionPolicy が追加されました ([#108701](https://github.com/kubernetes/kubernetes/pull/108701), [denkensk](https://github.com/denkensk))
- `kubectl plugin list` コマンドに例が追加されました ([#106600](https://github.com/kubernetes/kubernetes/pull/106600), [bergerhoffer](https://github.com/bergerhoffer))
- `NewDefaultKubectlCommand` のデフォルトの設定フラグが修正されました ([#107131](https://github.com/kubernetes/kubernetes/pull/107131), [jonnylangefeld](https://github.com/jonnylangefeld))
- クラスタに CRD が存在する前に CRD を適用した場合のエラーメッセージが改善されました ([#107363](https://github.com/kubernetes/kubernetes/pull/107363), [eddiezane](https://github.com/eddiezane))
    - :memo: 下記のように表示されていたのが  
    ```
    unable to recognize "sealedsecret.yaml": no matches for kind "SealedSecret" in version "bitnami.com/v1alpha1"
    ```
    次のように変わりました。これはよい変更。  
    ```
    resource mapping not found for name: "letsencrypt" namespace: "cert-manager" from "sealedsecret.yaml": no matches for kind "SealedSecret" in version "bitnami.com/v1alpha1"
    ensure CRDs are installed first
    ```
- Kubectl のスタックトレースは `-v=99` でのみ表示されるようになり、`-v=6` では表示されなくなりました ([#108053](https://github.com/kubernetes/kubernetes/pull/108053), [eddiezane](https://github.com/eddiezane))
- Kubectl: 1.23 以下との互換性のために `--dry-run`, `--dry-run=true`, `--dry-run=false` がもとに戻されました ([#107003](https://github.com/kubernetes/kubernetes/pull/107003), [julianvmodesto](https://github.com/julianvmodesto))
- kubectl run から廃止予定だった `--serviceaccount` と `--hostport`, `--requests`, `--limits` が削除されました ([#108820](https://github.com/kubernetes/kubernetes/pull/108820), [mozillazg](https://github.com/mozillazg))
- 削除予定だった `generator` と `container-port` のフラグが削除されました ([#106824](https://github.com/kubernetes/kubernetes/pull/106824), [lauchokyip](https://github.com/lauchokyip))
- ServerResources は2019年2月に廃止予定となり (https://github.com/kubernetes/kubernetes/commit/618050e)、現在は削除され、代わりに ServerGroupsAndResources の使用が提案されています ([#107180](https://github.com/kubernetes/kubernetes/pull/107180), [ardaguclu](https://github.com/ardaguclu))

### Uncategorized（そのほか）

- `kubectl version` の長い出力が廃止予定となり、将来 `kubectl version --short` に置き換えられます。完全な出力が必要な場合は `--output=yaml|json` を代わりに使用する必要があります ([#108987](https://github.com/kubernetes/kubernetes/pull/108987), [soltysh](https://github.com/soltysh))