はじめに
ここでは、Kubernetes 1.21 の CHANGELOG から SIG-CLI (kubectl) の取り組みについてまとめています。
- https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.21.md
- https://relnotes.k8s.io/?areas=kubectl&releaseVersions=v1.21.0
新たに追加された主なコマンドとフラグ
-
--show-managed-fieldsフラグ: もしtrueの場合、JSON または YAML 形式でオブジェクトを出力する際にmanagedFieldsをそのままにする-
これまで出力されていた metadata.managedFieldsがデフォルトでは出力されなくなりました。出力したい場合が明示的に--show-managed-fieldsフラグを使用する必要があります -
metadata.managedFieldsは Server Side Apply で使用されるフィールドで、誰がどのフィールドを管理しているかの記録に使用されています
-
-
-qショートフラグ:--quietフラグのショートフラグとして追加 -
kubectl drain --ignore-errorsフラグ: ドレインするノード群のなかで発生したエラーを無視する-
これまでドレイン中にあるノードで失敗すると処理が中断されていましたが、この挙動は廃止予定となり、今後はエラーが発生しても対象のすべてのノードでドレインが実行されるように変更されます。このフラグを使用することで、将来的なデフォルトの挙動を先に試すことができます。
-
-
kubectl top --use-protocol-buffersフラグ: 使用すると、メトリクスのリクエストに Protocol Buffers が使われる
変更があった主なコマンドとフラグ
-
kubectl kustomizeコマンドとkubectl apply -kフラグ: Kustomize バージョンが v2.0.3 から v4.0.5 に更新
廃止予定のコマンドとフラグ
-
kubectl runコマンド:--serviceaccount, --hostport, --requests, --limitsフラグ
削除されたコマンドとフラグ
-
kubectl runコマンド:--generator, --replicas, --service-generator, --service-overrides, --scheduleフラグ
そのほか、細かい変更は、 https://github.com/superbrothers/kubectl-docs/compare/v1.20.0...v1.21.0 で参照できます。
What's New (新情報)
Kubectl の Kustomize の更新
kubectl の Kustomize バージョンが v2.0.3 から v4.0.5 にジャンプしました。Kustomize はライブラリとして扱われるようになり、将来の更新は不定期ではなくなります。
ついに kubectl に組み込まれていた Kustomize(kubectl kustomize、kubectl apply -k など)が最新まで追従されました。v2.0.3 から v4.0.5 への更新で別物になっているため、これまで kubectl の kustomize 機能を使用していた人は十分に注意してください。
Kustomize ツールは単体で機能するツールで独自のリリースサイクルも持っているため、個人的にはこれまでもこれからも組み込まれている機能は使わないつもりです。
デフォルトのコンテナを事前に選択できるアノテーション
複数のコンテナを含む Pod は、kubectl コマンドのために事前にコンテナを選択しておける
kubectl.kubernetes.io/default-containerアノテーションを使用できるようになりました。詳しくは KEP-2227 を参照してください。
これまでは kubectl で --container オプションを使用していなかった場合には次の挙動になっていました。
-
kubectl exec/attach/cp: デフォルトで最初のコンテナを選択する -
kubectl logs: デフォルトはなく、kubectl.kubernetes.io/default-logs-containerアノテーションがある場合はそれで指定されたコンテナを選択する
例えば Pod にサイドカーコンテナを挿入するサービスメッシュのプロダクトを採用した場合に、そのサービスメッシュがコンテナリストの先頭にサイドカーコンテナを挿入するようになっていると、これまでアプリケーションコンテナに対して実行されていたコマンドがサイドカーコンテナ内で実行されるようになってしまうという問題がありました。
kubectl.kubernetes.io/default-container アノテーションにより、事前にデフォルトで選択されるコンテナを指定できるようにすることで上記の課題が解決されます。
apiVersion: v1
kind: Pod
metadata:
annotations:
kubectl.kubernetes.io/default-container: app
なお、このアノテーションが使用されていない場合は、これまでと同じリストの先頭のコンテナがデフォルトで選択されます。
このアノテーションがサポートされたことで kubectl logs コマンドが kubectl.kubernetes.io/default-logs-container アノテーションを使用してデフォルトのコンテナを事前に選択できる機能がありましたが、これは廃止予定になり v1.25 で削除される予定です。代わりに kubectl.kubernetes.io/default-container を使用する必要があります。
kubectl プラグイン等でこのアノテーションをサポートしたい場合には podcmd.FindOrDefaultContainerByName 関数が便利につかえます。
Known Issues(既知の問題)
なし
Urgent Upgrade Notes(必ず一読してからアップグレードしなければならない事項)
なし
Changes by Kind(種類別の変更)
Deprecation (廃止)
-
kubecctl runコマンドから廃止予定だった--generator, --replicas, --service-generator, --service-overrides, --scheduleオプションが削除され、--serviceaccount, --hostport, --requests, --limitsが廃止予定になりました (#99732, soltysh) - Kubectl: 廃止予定だった
kubectl alpha debugコマンドが削除されました。代わりにkubectl debugを使用してください。 (#98111, pandaamanda) [SIG CLI]
API Change (API 変更)
- コネクションを維持するために SPDY pings が有効になり、
kubectl execとkubectl port-forwardが中断されないようになりました (#97083, knight42) [SIG API Machinery and CLI]-
SPDY pings の間隔は 5s となっており変更できません
-
Feature(機能)
-
kubectl drainコマンドをノードのリストに対して実行した際に途中で中断される挙動は廃止予定です。この新しい挙動は、ドレイン中にいくつかのノードで失敗したとしても対象のすべてのノードでコマンドが実行されるようになります。現時点では、ユーザは--ignore-errorsフラグを使用してこの挙動を試すことができます。 (#98203, yuzhiquan) - Kubectl コマンドヘッダのアルファ実装: クライアントのコマンドラインで KUBECTL_COMMAND_HEADERS 環境変数が設定されていると SIG CLI KEP 859 が有効になります (#98952, seans3)
-
kubectl から apiserver へのリクエストにどんなコマンド(apply,deleteなど)でどんなオプションを使用したのかの情報をヘッダで付与するようになる KEP です。クラスタ管理者はユーザがどのようなコマンドを使用して問題が発生したのかどうかなどを知れるようになり、問題の特定が容易になることが期待できます。
-
-
kubectl versionはクライアントとサーバのバージョン差異がサポートするバージョンスキュー(+/-1 マイナバージョン)を超えている場合に警告メッセージを出力するように変更されました (#98250, brianpursley) [SIG CLI] - Kubectl:
kubectl top pods/nodesに--use-protocol-buffersフラグが追加されました (#96655, serathius)-
PR のコメントによると metrics-server の CPU の 30% とメモリ の 15% は JSON のエンコードに使用されていて、それを削減できるようです -
--use-protocol-buffersはデフォルトfalseのため、使用するには明示的に指定する必要があります
-
- Kubectl:
kubectl getは、デフォルトで managed fields を出力しないようになりました。出力形式がjsonまたはyamlの場合に、ユーザは--show-managed-fieldsをtrueに設定することでmanagedFieldsを出力できます。 (#96878, knight42) [SIG CLI and Testing]-
kubectl get -o yamlで出力されてとても見にくかったmetadata.managedFieldsがデフォルトで出力されないようになりました。 -
managedFields は Server Side Apply で誰がどのフィールドを管理しているのかを管理するためのフィールドです。詳しくは Kubernetes 1.14: Server-side Apply (alpha) - Qiita を参照してください。
-
- Kubectl:
kubectl getでカンマで区切られたリストを bash-completion がサポートしました (#98301, phil9909) - ユーザは Pod で
kubectl.kubernetes.io/default-containerアノテーションを使用して kubectl コマンドで対象とするコンテナを事前に選択できるようになりました (#99581, mengjiao-liu) [SIG CLI] -
kubectl waitは、古い状態の報告を防ぐために observedGeneration >= generation を保証します。シナリオの例は、CRD のアップデートにあります。(#97408, KnicKnic)-
すでにオブジェクトの spec が変更されていて、その変更により kubectl waitの条件にマッチしなくなるような状況で、status がまだ変更されていないことで条件に一致してしまいコマンドが終了してしまう事態を避けることができるようになるようです
-
Bug or Regression(バグまたはリグレッション)
-
--dry-run=clientで Deployment を公開(expose)する場合に Namespace の指定に効果がないバグが修正されました (#97492, masap) [SIG CLI] -
KUBECTL_EXTERNAL_DIFFがイコール(=)を追加のパラメータとして受け入れるようになりました (#98158, dougsland) [SIG CLI]-
KUBECTL_EXTERNAL_DIFF環境変数はkubectl diffコマンドで任意のdiffコマンドとパラメータを使用できる機能ですが、これまでイコールを受け入れなかったため、KUBECTL_EXTERNAL_DIFF="diff --color=auto"のような指定ができなかったようです
-
- kubectl describe: API Group なしの Ingress backend を含む場合にパニックになるバグが修正されました (#100505, lauchokyip) [SIG CLI]
-
kubectl kustomize {arg}とkubectl apply -k {arg}が kustomize CLI v4.0.5 のコードを使うように更新されました (#98946, monopole) -
kubectl execとkubectl attachは、リモートコマンド出力と混同される可能性のあるローカルバイナリからの出力を抑制する--quietコマンドをサポートしました(全てのエラーでない出力が非表示)。加えてkubectl execとattachでデフォルトのコンテナが使用された場合に、選択できるコンテナのリストが出力されるようになりました (#99004, smarterclayton) [SIG CLI] - client-go exec credential plugins は、stdin でインタラクティブターミナルが検出された場合にのみ stdin を通過させるようになりました。これは以前は "stdout" がインタラクティブターミナルかどうかを確認していたことの修正です。 (#99654, ankeesler)
- Kubectl logs:
--ignore-errorsはすべてのコンテナで尊重されるようになり、parallelConsumeRequestの挙動と一貫性が保たれます (#97686, wzshiming) - Kubectl-convert:
no kind "Ingress" is registered for versionエラーが修正されました (#97754, wzshiming)
Other (そのほか)
なし
所感
ついに kubectl コマンドに組み込まれていた kustomize が更新されました。これはうれしいユーザが多いのではないかと思います。大きくバージョンに乖離があり、これまで使えていた kustomization.yaml が使えなくなっているので注意が必要です。個人的には kustomize は単体で使えるのだからビルトインしなくてよいのにという強い気持ちを持っています。
v1.21 でベータに昇格してデフォルトで有効化が予定されていた kubectl debug のデバッグコンテナ機能(Ephemeral Containers)は昇格が見送られました。SIG Auth が API の大幅な変更をリクエストしたためだそうです。とても強力な機能なため期待していましたが、次回に期待しましょう。なお、アルファレベルの機能として EphemeralContainers フィーチャゲートを有効にすることで使用することもできます。
CHANGELOG でときどき SIG の指定のない変更があり、そこに SIG CLI の変更がちょくちょく含まれていて探すのが大変でした。これは困るので今後修正してもらいたい。SIG Release に言えばよいだろうか。