ここでは、Kubernetes 1.31 の CHANGELOG から SIG-CLI (kubectl) の取り組みについてまとめています。
は筆者によるコメントです。
新たに追加された主なコマンドとフラグ
-
kubectl debug --keep-annotations/init-containers/labels/liveness/readiness/startupフラグ: copy pod でオリジナルの設定を残す -
kubectl kustomize --helm-api-versionsフラグ: Helm ChartCapabilities.APIVersionsの値を明示的に指定する -
kubectl kustomize --helm-kube-versionフラグ: Helm ChartCapabilities.KubeVersionの値を明示的に指定する -
kubectl logs --all-podsフラグ: Deployment や Service を対象とした場合に pod selector にマッチするすべての pods が対象にできるようになった
変更があった主なコマンドとフラグ
-
kubectl wait --forフラグ:--for=createとすることでオブジェクトの作成を待つことができるようになった -
kubectl create secret docker-registry --from-fileフラグ: キー名の指定がない場合は.dockerconfigjsonが使われるように変更 -
kubectl create token --bound-object-kindフラグ: Node へのトークンの紐づけをサポート -
kubectl runコマンド: セパレータの指定が必須になった
廃止予定のコマンドとフラグ
なし
削除されたコマンドとフラグ
-
kubectl run --filename/force/grace-period/kustomize/recursive/timeout/waitフラグ: 廃止予定だったため削除 -
kubectl drain --delete-local-dataフラグ: 廃止予定だったため削除
そのほか、細かい変更は、 https://github.com/superbrothers/kubernetes-docs/compare/kubernetes-1.30...kubernetes-1.31 で参照できます。
所感
kubectl wait --for=create や kubectl logs --all-pods など、便利機能がいくつか追加されました。これまでサードパーティのツールを使っていた部分を kubectl に寄せることもできそうです。
廃止予定だったフラグの削除や非推奨だった kubectl run のセパレータなしが廃止されたり、スクリプト内で使われてそうなコマンド、フラグに変更が入っています。1.31 へアップグレードする前にスクリプトを見直しておきましょう。
What's New (Major Themes)
なし
Urgent Upgrade Notes
なし
Changes by Kind
Deprecation
なし
API Change
なし
Feature
- kubectl wait に --for=create オプションが追加されました (#125868, soltysh) [SIG CLI and Testing]
-
kubectl waitコマンドでオブジェクトの作成を待てるようになりました。次のように使われることが想定されています。kubectl wait --for=create deploy/test-1 kubectl wait --for=jsonpath=.status.readyReplicas=1 deploy/test-1
-
-
kubectl debugに copy pod からの probes, labels, annotations, initContainers の削除を制御できる--keep-*フラグが追加されました (#123149, mochizuki875) [SIG CLI and Testing]-
kubectl debugコマンドはデバッグ対象として node, pod, copy pod の3種類があります -
copy pod の作成で機能する下記フラグが追加され、通常削除せれてしまう設定を残したままにできるようになりました
--keep-labels--keep-annotations--keep-liveness--keep-readiness--keep-startup--keep-init-containers
-
-
kubectl set imageコマンドに補完機能が追加されました (#124592, ah8ad3) [SIG CLI] -
kubectl logsコマンドに、pod selector を使用するオブジェクトからすべての pods を取得するための--all-podsフラグが追加されました (#124732, cmwylie19) [SIG CLI and Testing]-
deployment や svc を対象に kubectl logsコマンドを実行した場合にこれまではそれらオブジェクトの pod selector にマッチする1つの pod が対象になっていました -
--all-podsフラグを指定することで、pod selector にマッチするすべての pods が対象になります。同時にこのフラグを指定して場合--prefixフラグが自動で有効化されてログ出力に[<pod>/<container>]のプレフィックスが付与されます。
-
-
kubectl config set-contextコマンドに namespace のオートコンプリートが追加されました (#124994, TessaIO) [SIG CLI] -
kubectl port-forwardコマンドに ports のオートコンプリートが追加されました (#124683, TessaIO) [SIG CLI]-
pod spec.containers.portsフィールドが設定されている必要があります
-
- Node オブジェクトにバインドされた ServiceAccount トークンの作成が許可されました。これにより、ユーザは Pod にバインドされたトークンと同様に、ServiceAccount トークンの有効性を指定した Node オブジェクトにバインドできます。
kubectl create token <serviceaccount-name> --bound-object-kind=Node --bound-object-node=<node-name>で使用できます (#125238, munnerz) [SIG Auth and CLI]-
「Node オブジェクトにバインドされた ServiceAccount トークン」というのは、トークンのライフサイクルを Node オブジェクトにも紐づけるという意味で、紐づけた Node オブジェクトが削除された場合にトークンが無効化されるようになります -
そのほか、トークンに Node 名が含まれるようになります。KEP は https://kep.k8s.io/4193
-
- kubectl で WebSocket を使用した PortForward を無効にするには、環境変数のフィーチャーゲートを明示的に設定する必要があります。
PORT_FORWARD_WEBSOCKETS=false(#125528, seans3) [SIG API Machinery and CLI]-
「PortForward using WebSockets instead of SPDY」がベータに昇格してデフォルトで有効化されたため、kubectl でこの機能を無効にするには明示的に環境変数を設定する必要があります
-
- クライアントサイドの apply において、null 値を「この値に関連付けられたキーを削除する」として定義できるようになりました (#125646, HirazawaUi) [SIG API Machinery, CLI and Testing]
-
null 値はパッチ時にはキーを削除するという挙動ですが、作成時にはデフォルト値が入る挙動になっており、kubectl applyで初回実行時にデフォルト値が入り、再度実行すると削除されるようになっていたようです (https://github.com/kubernetes/kubernetes/issues/123304) -
この変更で null 値は削除の挙動に統一されて初回実行時にもフィールド自体が削除されるようになりました
-
-
kubectl debugの--customフラグがデフォルトで有効になり、yaml サポートが追加されました (#125333, ardaguclu) [SIG CLI and Testing]
Bug or Regression
-
kubectl describe configmap実行時に、data の異なるキーと値のペア間に追加の行が挿入されるようになりました (#123597, siddhantvirus) -
kubectlが以下の操作をサポートするようになりましたkubectl create secret docker-registry <NAME> --from-file=<path/to/.docker/config.json>-
kubectl create secret docker-registry <NAME> --from-file=.dockerconfigjson=<path/to/.docker/config.json>(#119589, carlory) -
docker-registry type の secret はキーが .dockerconfigjsonである必要がありますが、--from-fileで指定した場合に指定したファイル名がキー名になってしまいうまくいっていなかったようです -
このタイプの場合でキーが指定されていなければ .dockerconfigjsonがキー名になるように変更されています
-
kubectl create cronjobsを使用する際の役割に対する追加ルール要件(cronjobs/finalizers)が削除され、後方互換性が保たれました (#124883, ardaguclu) -
kubectlが位置引数が存在する場合にkubectl-create-subcommandプラグインを見つけられるようになりました(例:kubectl create subcommand arg) (#124123, sttts)-
kubectl plugin で kubectl-create-subcommandがサポートされるようになっていましたが、サブコマンドが引数を受け取る場合にそれがコマンドとして処理されてしまってコマンドが見つからないバグがあったようです
-
- Windows cmd.exe でスペースを含むダブルクオートされたパスの
EDITOR/KUBE_EDITORが修正されました (#112104, oldium) [SIG CLI and Windows] -
kubectl describeで NetworkPolicy のポート範囲が正しく表示されないバグが修正されました(開始ポートのみが表示される問題) (#123316, jcaamano) -
kubectl getコマンドで--sort-byフラグを使用する際に、文字列がアルファベット順にソートされないバグが修正されました (#124514, brianpursley)-
--sort-byフラグの処理は github.com/fvbommel/sortorder ライブラリが使用されているんですが、これが文字列のソートをうまくやってくれていなかったようです -
ライブラリの使用をやめて単純に文字列比較するというように修正されています (i.String() < j.String())
-
- sample-cli-plugin のヘルプテキストが一貫性を持つよう修正され、常に
kubectl nsが使用されるようになりました (#125641, nirs) -
kubectlで Pod が終了した際に、STATUS 列に Pod のフェーズが 'Failed' または 'Succeeded' と表示されるようになりました (#122038, lowang-bh)-
これまで Pod が削除されている最中は Pod がすでに終了していて Failed または Succeeded のフェイズだとしても Terminating と表示されていたみたいです
-
Other (Cleanup or Flake)
-
kubectl exec [POD] [COMMAND]を--セパレータなしで実行する機能が削除されました。--セパレータは Kubernetes v1.18 リリースから推奨されており、古い方法でのkubectl execの呼び出しは非推奨とされていました。この変更は、古いkubectl execコマンド実行の非推奨化と一致し、kubectl exec [POD] -- [COMMAND]の使用を強制して、互換性の向上と推奨されるプラクティスの遵守を促進します (#125437, ardaguclu) [SIG CLI and Testing]-
ずっと今後セパレータ指定が必須になるよと警告が出ている状態でしたが、いよいよ必須になるようです。世のスクリプトで壊れるものが多く出そうで怖いですね。
-
-
kubectl describe serviceとkubectl describe ingressが endpoints ではなく endpointslices を使用するようになりました (#124598, aroradaman) [SIG CLI and Network] - 非推奨およびサポートされていない
kubectl runフラグ(filename, force, grace-period, kustomize, recursive, timeout, wait)のサポートが削除されました。また、kubectl drainの非推奨な--delete-local-dataのサポートが削除され、代わりに--delete-emptydir-dataを使用する必要があります (#125842, soltysh) [SIG CLI]-
kubectl runの削除されたフラグはあまり使われていない気がするので問題なさそうです。もともと 1.29 で削除されるよとあったみたいですが、削除対応が漏れていたっぽいです -
kubectl drain --delete-local-dataフラグはローカルデータとは何がわかりやすいということで--delete-emptydir-dataが代わりに用意されたという経緯だったと思います- emptydir データを削除されるとまずいケースって存在するんですかね。これがまずいとクラスタ運用できなさそうですが
-
-
kubectl describe serviceがロードバランサー IP の内部トラフィックポリシーと IP モードを表示するようになりました (#125117, tnqn) [SIG CLI and Network]