はじめに
ここでは、Kubernetes 1.19 の CHANGELOG から SIG-CLI (kubectl) の取り組みについてまとめています。
- https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.19.md
- https://relnotes.k8s.io/?areas=kubectl&releaseVersions=v1.19.0
新たに追加された主なコマンドとフラグ
-
--warnings-as-errorsフラグ(全コマンド共通): サーバから受け取った警告をエラーとして扱い、ゼロ以外の終了コードで終了する -
kubectl annotateコマンドの--listフラグ: オブジェクトのmetadata.annotationsのリスト -
kubectl create deploymentコマンドの--portフラグ: Deploymentspec.template.spec.containers.portsを設定する -
kubectl diffコマンドの--selector(-l) フラグ: 差分出力の対象をラベルセレクタでフィルタする -
kubectl runコマンドの--privilegedフラグ: Provileged モードでコンテナを作成する
変更があった主なコマンドとフラグ
-
--outputフラグのjsonpath-as-json: jsonpath を使うが、maps / slices / structs 型を Go シンタックスに変わりに JSON でシリアライズする
廃止予定のコマンドとフラグ
-
kubectl convert(v1.17 で削除予定だったが引き続き削除されておらず)
削除されたコマンドとフラグ
-
kubectl get --exportフラグ
そのほか、細かい変更は、 https://github.com/superbrothers/kubectl-docs/compare/v1.18.0...v1.19.0 で参照できます。
What's New (新情報)
廃止予定 API 利用の警告
SIG API Machinery は、
kubectlユーザや API 利用者に表示される「廃止予定 API 利用の警告」とクラスタ管理者に表示されるメトリクスを実装しました。廃止予定 API へのリクエストには、対象 の API が削除されるリリースと代替 API の情報を含む警告が返されます。警告は、Admission Webhook、またカスタムリソースの廃止予定のバージョンとして指定することで返すこともできます。
廃止予定の API を利用していることをクラスタ利用者に通知できる機能です。Admission Webhook や CRD でも通知することができ、べんりそうです。この機能は SIG API Machinery での変更なので、SIG-CLI とは直接関係はありませんが、kubectl にこの機能に関する --warnings-as-errors という共通フラグが追加されています。このフラグを使用すると、利用した API に警告が含まれる場合にエラーとしてゼロ以外の終了コードでコマンドを終了することができるようになります。
Pod とノードをデバッグする CLI のサポートの拡張
SIG CLI は
kubectlによるデバッグを拡張して、新たに2つのデバッグワークフローをサポートします。コピーの作成による Pod のデバッグとホストの namespaces でのコンテナの作成によるノードにデバッグです。これらは、次の場合に便利です。
- エフェメラルコンテナが有効になっていないクラスタにデバッグコンテナを挿入する
- クラッシュするコンテナのイメージを変更したり、コマンドを
sleep 1dに変更したりすることで、デバッグを容易にする- ノードのホストファイルシステムの構成ファイルを調べる
これらの新しいワークフローは新しいクラスタ機能を必要としないので、
kubectl alpha debugコマンドを使って既存のクラスタで試すことができます。kubectlを使ったデバッグに関するフィードバックをお待ちしています。イシューの作成や Kubernetes Slack #sig-cli チャンネルへの参加、または kubernetes/enhancements#1441 イシューへのコメントで私たちに連絡してください。
kubectl alpha debug コマンドに新たに2つの機能が追加されました。
1つは、起動中かクラッシュしているかに関わらず対象の Pod に対してサイドカーとしてデバッグコンテナを追加、またプロセスネームスペースの共有(Pod spec.shareProcessNamespace)を有効にしたコピーの Pod を作成するというものです。v1.16 からアルファで提供されているエフェメラルコンテナを使用したデバッグコンテナの追加機能は、v1.19 時点でもアルファのため、フェーチャゲートで明示的にクラスタ管理者が機能を有効にしている必要があり、広く使えるものではありません。このコピー Pod を作成するワークフローでは、アルファ機能を使用していないため、直近のバージョンのクラスタであればどれでも利用できます。具体的には kubectl alpha debug コマンドの --copy-to フラグを使用します。下記では、mypod Pod をデバッグ対象の Pod として、このオリジナル Pod のデバッグコンテナとして busybox をサイドカーコンテナとして追加し、プロセスネームスペースの共有を有効にしたコピーの Pod を my-debugger Pod として作成します。
# Create a debug container as a copy of the original Pod and attach to it
kubectl alpha debug mypod -it --image=busybox --copy-to=my-debugger
もう1つは、ノードのデバッグを目的とした Pod を作成する機能です。具体的には対象ノードのホスト OS の各 namespaces を使い(ここでの namespaces は Kubernetes のではなく、Linux namespaces のことで、ホストの IPC、ネットワーク、PID の namespaces を使います) や、ホストの / をコンテナの /host にマウントした Pod を特定のノード上で実行するというものです。かなり強い権限を必要とするため、基本的に利用するのはクラスタ管理者です。具体的には下記のように kubectl alpha debug コマンドをノードを対象に実行します。下記では mynode ノードを対象に busybox イメージを使ってデバッグコンテナを実行します。新機能!という感じではなく、便利なユーティリティが追加されたという感じでしょうか。
# Create an interactive debugging session on a node and immediately attach to it.
# The container will run in the host namespaces and the host's filesystem will be mounted at /host
kubectl alpha debug node/mynode -it --image=busybox
そのほか、kubectl debug コマンドの詳細については KEP を参照ください。
Urgent Upgrade Notes(必ず一読してからアップグレードしなければならない事項)
API Changes(API の変更)
-
kubectl editコマンドでのmetadata.managedFieldsフィールドの非表示 (#91946, soltysh) [SIG CLI]-
metadata.managedFieldsフィールドは Server-side Apply で使用する管理用のフィールドです。ユーザが触るフィールドではないので、非表示になったことで少し便利になります。
-
Feature(機能)
-
kubectl create deploymentコマンドへの--portフラグの追加 (#91113, soltysh) [SIG CLI and Testing]-
Deployment spec.template.spec.containers.portsフィールドを設定します。
-
-
kubectl scaleコマンドの Client-side および Server-side でのドライランのサポート (#89666, julianvmodesto) [SIG CLI and Testing] -
kubectl diffコマンドへの--selector(-l) フラグの追加 (#90857, sethpollack) [SIG CLI]-
--selectorフラグで差分を検出する対象をフィルタできるようになりました。
-
-
kubectl runコマンドへの--privilegedフラグの追加 (#90569, brianpursley) [SIG CLI]-
Privileged モードでコンテナを作成できるようになりました。
-
-
kubectl taintコマンドでのno省略形のサポート (#88723, wawa0210) [SIG CLI]-
kubectl taintコマンドでは、nodeまたはnodesという完全なリソース名を指定しなければなりませんでしたが、省略形もサポートされました。
-
-
kubectl port-forwardコマンドが UDP をサポートしていないことを利用者に警告する (#91616, knight42) [SIG CLI]-
UDP をサポートしていないことに利用者が気づかずにデバッグに時間を浪費しないようにするための変更です。
-
-
kubectl alpha debugコマンドがオリジナルのコピーによる Pods のデバッグをサポート (#90094, aylei) [SIG CLI]-
デバッグ対象の Pod に対してデバッグコンテナのサイドカーコンテナとしての追加とプロセスネームスペースの共有(Pod spec.shareProcessNamespaces)を有効にしたコピーを追加で作成する
-
-
kubectl alpha debugコマンドがノードのホスト namespaces で実行されるデバッグコンテナの作成によるノードのデバッグをサポート (#92310, verb) [SIG CLI]-
ホスト OS の各 namespaces を使い、ホストの /をコンテナの/hostにマウントした Pod を特定のノード上で実行する
-
Bug or Regression(バグまたはリグレッション)
-
kubectl cluster-info dumpコマンドのnamespacesフラグが機能していないバグの修正 (#91890, zhouya0) [SIG CLI]-
クラスタ情報をダンプするコマンドで、--namespacesフラグはダンプする Namespace を指定するフラグですが(デフォルトはkube-systemNamespace)、このフラグを処理するコードがどこかで削除されてしまったようで、全く機能していなかったようです。
-
-
kubectl createコマンドの--dry-run=clientフラグが--namespaceフラグを無視するバグを修正 (#90502, zhouya0)-
kubectl createコマンドのなかでもrole/job/cronjobの場合にだけ--namespaceフラグが機能していなかったようです。
-
-
kubectl create secret docker-registryコマンドで--from-fileオプションが使えなかったバグを修正 (#90960, zhouya0) [SIG CLI and Testing]-
このコマンドは、--from-fileオプションが存在しているにも関わらず、--docker-passwordと--docker-usernameのオプションが必須扱いになっていました。 -
この PR によって、--from-fileオプションによってdocker-registryタイプの Secret オブジェクトも作成できるように修正されています。
-
-
kubectl describe CSINodeコマンドのnil pointer errorを修正 (#89646, zhouya0) [SIG CLI]-
CSINode オブジェクトの spec.drivers.allocatable.countフィールドは*int32で定義されているため、nilじゃないかの確認が必要だったということでした。 - https://github.com/kubernetes/api/blob/v0.19.0/storage/v1/types.go#L481
-
-
lease情報へのアクセス権限を持たないユーザがkubectl describe nodeコマンドを使えるように修正 (#90469, uthark) [SIG CLI]-
v1.17.0 から kubectl describe nodeコマンドで coordination.k8s.io/v1.Lease オブジェクトの情報を出力するように変更されましたが、RBAC 等で Lease オブジェクトへの参照権限を持たないユーザでコマンドの実行が失敗するようになってしまっていたようです。 -
Lease オブジェクトは、Node ハートビート機能の1つで、巨大なクラスタにおいて Node ステータスの更新によるハートビートの負荷軽減を目的に導入された機能で v1.17 で GA しました。詳しくは KEP を参照してください。
-
-
kubectl describeコマンドにおけて anntations が空の場合の出力形式を修正 (#91405, iyashu) [SIG CLI]-
annotations が空の場合に <none>と出力されることが望まれていたが、実際には何も出力されていなかったようです。
-
-
kubectl diffコマンドがパッチを永続化してしまうバグを修正 (#89795, julianvmodesto) [SIG CLI and Testing]-
kubectl diffコマンドを実行すると指定したマニフェストファイルとクラスタに記録されたオブジェクトの差分を出力してほしいだけのところ、1.18 のkubectlコマンドと 1.17 の API サーバの組み合わせで差分をクラスタに適用してしまうというバグがありました。 -
この修正は v1.18 に cherry-pick されており、v1.18.1 のパッチリリースに含まれています。
-
-
kubectl runコマンドの--dry-run=clientフラグが--namespaceフラグの指定を無視するバグを修正 (#90785, zhouya0) [SIG CLI] -
kubectl versionコマンドで kubeconfig ファイルがない場合にもバージョン情報を出力するように修正 (#89913, zhouya0) [SIG API Machinery and CLI]-
--client=trueの有無に関わらず kubeconfig ファイルが存在しないとクライアントの情報でさえ出力されない状態でした。
-
-
kubectl alpha debugコマンドの--containerフラグに-cの省略形が設定されていないのを修正 (#89674, superbrothers) [SIG CLI]-
ヘルプメッセージ上では省略形が設定されていることになっていましたが、実際には存在しなかったため修正しました。
-
- kubeconfig ファイルが存在しないと
--localまたは--dry-runフラグを使用してのkubectlコマンドの実行に失敗するバグを修正 (#90243, soltysh) [SIG API Machinery, CLI and Testing] - ZSH の補完の初期化時に初期化に成功した場合にもゼロ以外の終了ステータスが返るバグの修正 (#88165, brianpursley) [SIG CLI]
-
scaleサブリソースが有効な CustomResourceDefinition で、replicasフィールドのデフォルト値が定義されないバグを修正#89833, liggitt) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle and Instrumentation] - エラーの際に止まるのではなく全ての有効なオブジェクトを適用するように
kubectlを修正 (#89848, seans3) [SIG CLI and Testing] - Event オブジェクトの
firstTimestapフィールドが設定されていない場合には、eventTimeフィールドを使うように修正 (#89999, soltysh) [SIG CLI] -
kubectlまたは client-go の jsonpath は maps / slices / structs 型を Go シンタックスに変わりに JSON でのシリアライズをサポート(#89660, pjferrell) [SIG API Machinery, CLI and Cluster Lifecycle]-
kubectlコマンドの--output=jsonpath-as-jsonフラグで使えるようです。
-
-
kubectl autoscaleコマンドが--nameフラグを受け付けないバグを修正 (#91855, SataQiu) [SIG CLI] -
kubectl scaleコマンドが--timeoutフラグを受け付けないバグを修正 (#91858, SataQiu) [SIG CLI] - v1 CSR API を提供するサーバに対する
kubectl certificate approve/denyコマンド使用の問題を解消 (#91691, liggitt) [SIG Auth and CLI] -
--namespaceフラグなしでのkubectl apply --pruneコマンドの機能の復元。v1.17 以降、kubectl apply --pruneはdefaultNamespace (または kubeconfig から)か、コマンドラインフラグで明示的に指定された Namespace のリソースのみを prune するようになった。 しかし、これは kubectl 1.16 からの変更で、本来はマニフェストファイルのすべての Namespace のリソースに対して prune できた。このパッチは kubectl v1.16 の挙動を復元します。 (#89551, tatsuhiro-t) [SIG CLI and Testing] -
kubectl annotateコマンドが--listオプションをサポート (#92576, zhouya0) [SIG CLI]-
オブジェクトの annotations がリストできるようになりました。kubectl labelコマンドには存在していたフラグのようなので、kubectl annotateコマンドにも追加という感じでしょうか。
-
Other (Cleanup or Flake)
-
--cache-dirは、http とディスカバリの両方のキャッシュディレクトリを設定する。デフォルトは$HOME/.kube/cache。 (#92910, soltysh) [SIG API Machinery and CLI]-
これまでは http のキャッシュは $HOME/.kube/http-cache、ディスカバリのキャッシュは$HOME/.kube/cache/discoveryに保持されていましたが、両方で共通の親ディレクトリを持つように変更されました。 -
ディスカバリのキャッシュが保持されるディレクトリに変更はありませんが、http のキャッシュは $HOME/.kube/cache/httpに変更されます。
-
-
DISABLE_KUBECONFIG_LOCK環境変数による kubeconfig ファイルのロックを無効にする機能の追加 (#92513, soltysh) [SIG API Machinery and CLI]-
当初、複数は kubeconfigファイルの同時変更を防ぐ目的にロック機構を持つようにしていたが、現在ではそのような場合には複数の kubeconfig ファイルを持つようにすることを推奨しているとのこと。
-
-
kubectl getコマンドを使用して namespaced ではないリソースを取得した際の "not found" メッセージの変更 (#89861, rccrdpccl) [SIG CLI]-
"namespaced" ではないリソース(not namespaced resources)というのは、クラスタレベルのリソースのことで、例えば PersistentVolume(PV)といったリソースのことです。 -
この変更では、クラスタレベルのリソースに対して kubectl getコマンドを使用した場合に、No resources found in default namespace.のような Namespace に言及するクラスタレベルのリソースに対してのふさわしくないメッセージが出力されていたところを、No resources found.と出力するように変更されています。
-
-
kubectl topコマンドでの Heapster のサポートを削除 (#87498, serathius) [SIG CLI]-
kubectl topコマンドは、v1.8 から metrics-server による Metrics API をサポートし、Heapter によるメトリクスの提供は廃止予定となっていました。
-
- kubectl の各サブコマンドに専用のフィールドマネージャを設定することで、Server-side Apply での競合エラーを改善する (#88885, julianvmodesto) [SIG CLI and Testing]
-
Server-side Apply は、metadata.managedFields.managerフィールドにどのコンポーネントがオブジェクトのどのフィールドを管理しているのかを記録します。もしあるコンポーネントが他のコンポーネントが管理するフィールドを操作しようとすると競合を検出します。 -
kubectlコマンドによるオブジェクトの変更は全てkubectlというフィールドマネージャに設定されていましたが、kubectlコマンドには annotations を操作するkubectl annotateコマンドなどのオブジェクトを操作する様々なサブコマンドが存在し、共通のフィールドマネージャを利用していることで、異なるコマンドによる変更にも関わらず競合を検知できていなかったようです。 -
この変更では、kubectlコマンドの各サブコマンドに専用のフィールドマネージャ(例えばkubectl annotateコマンドであればkubectl-annotate)を設定することで、競合を検知できるように変更されています。
-
- 廃止予定だった
kubectl applyコマンドの--server-dry-runフラグを削除 (#91308, julianvmodesto) [SIG CLI and Testing]-
代わりに --dry-run=serverフラグを使用します。
-
-
kubectl config viewがクライアント証明書のようにデフォルトで Bearer トークンを黒塗りするように変更。--rawフラグは引き続き内容を全て出力するのに使用できる。(#88985, puerco)-
kubectl config viewコマンドは、デフォルトではクライアント証明書がそのまま出力されないようにREDACTEDという形で黒塗りされるようになっていますが、Bearer トークンも同じ形で黒塗りされるようになりました。
-
所感
kubectl alpha debug コマンドに2つの新機能が追加された以外には目新しい変更はありませんでした。廃止予定 API の警告が表示されるようになったのは便利そうです。Server-side Apply が使われるようになり、これに関する不具合の修正も目立ちます。kubectl get コマンドの --export フラグが完全に削除されました。もしスクリプトで利用している方がいれば注意してください。