はじめに
ここでは、Kubernetes 1.18 の CHANGELOG から SIG-CLI (kubectl) の取り組みについてまとめています。
- https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md
- https://relnotes.k8s.io/?areas=kubectl&releaseVersions=1.18.0
新たに追加されたコマンドとフラグ
-
kubectl alpha debug
: 実行中の Pod にデバッグコンテナをアタッチする。 -
--tls-server-name
フラグ(全コマンド共通): サーバ証明書の検証に使用するサーバ名。指定されていない場合は、ホスト名が使われる。 -
kubectl drain --disable-eviction
フラグ: eviction(退去)がサポートされていたとしても、drain が delete を使用するように強制する。これは、PodDisruptionBudgets のチェックをバイパスするため、注意して使用すること。
変更があったコマンドとフラグ
-
kubectl delete --force
フラグ: true の場合、API からリソースを直ちに削除し、猶予付き削除(graceful deletion)を無視します。一部のリソースでは不整合やデータの損失が発生する可能性がある。-
--force
フラグの動作に変更はありませんが、これまで--grace-period=0
とともに指定する必要がありましたが、それが不要になったという変更です
-
-
kubectl create/patch/apply
コマンドなどの--dry-run string
フラグ: "none" または "server"、"client" でなければならない。クライアントストレテジ(戦略)の場合は、サーバに送信せずに送信されるであろうオブジェクトのみを表示する。サーバストレテジの場合は、リソースを永続化せずにサーバに対してリクエストを送信する(デフォルトは "none")
廃止予定のコマンドとフラグ
-
kubectl convert
(v1.17 で削除予定だったが引き続き削除されておらず) -
kubectl get --export
フラグ(v1.18 で削除予定だったが削除されておらず)
削除されたコマンドとフラグ
kubectl rolling-update
そのほか、細かい変更は、 https://github.com/superbrothers/kubectl-docs/compare/v1.17.0...v1.18.0 で参照できます。
What's New (新情報)
kubectl debug コマンド
SIG CLI はかなり長い間デバッグユーティリティの必要性について議論してきました。エフェメラルコンテナ の開発により、kubectl exec
の上に構築されたツールで開発者をサポートする方法が明らかになりました。kubectl debug コマンド の追加は、開発者がクラスタ内で簡単に Pod をデバッグできることを可能にします。このコマンドを使用すると Pod の隣で動作する一時的なコンテナを作成できるだけでなく、インタラクティブなトラブルシュートのためにコンソールにアタッチすることもできます。
1.16 でもアルファとしてアナウンスされていましたが、一部の機能の実装が未完でした。まだ一部残っているもののほぼ完了ということでおそらく再度アナウンスされたということだと思われます。1.16 時点での機能については Kubernetes 1.16 アルファ機能を先取り! エフェメラルコンテナ - Speaker Deck、Kubernetes 1.16: Ephemeral Containers (alpha) - Qiita にまとめていますので参照してください。1.16 からの主な変更は次のとおりです。
-
kubectl alpha debug
としてエフェメラルコンテナを Pod に追加するコマンドが追加された- 1.16 では kubectl プラグインとして提供されていましたが、kubectl 自体に追加されました。
- 1.16 からの変更として、エフェメラルコンテナとして実行するコンテナのイメージがデフォルトで busybox だったのに変わって設定されなくなりました。docker.io を参照できない環境もあることを考慮するとデフォルトを設定しておくよりも常に明示的にイメージを指定させたほうがよいという判断でしょうか。
- CRI と kubelet が namespace targeting mode をサポートした
- namespace targeting mode がサポートされたことで、デバッグ対象の Pod の Share Process Namespace 機能を有効にしなくてもあとから Pod に含まれる他のコンテナのプロセスを参照できるようになりました
- https://speakerdeck.com/superbrothers/kubernetes-1-dot-16-ephemeral-containers-alpha-bf6ff69c-410b-4f89-a7e9-e856db91fb7f?slide=15
- v1.18.0 時点での
kubectl alpha debug
コマンドでは明示的に--target
フラグで PID ネームスペースを共有するコンテナ名を指定する必要があります
なお、エフェメラルコンテナはアルファレベルの機能のため、使用するには FeatureGates EphemeralContainers
を明示的に有効にする必要があります。
Urgent Upgrade Notes(必ず一読してからアップグレードしなければならない事項)
ありません。
Deprecations and Removals (廃止および削除)
-
kubectl
と k8s.io/client-go は、http://localhost:8080
のサーバアドレスをデフォルトとして使用しなくなりました。もしこのようなレガシーなクラスタを所有している場合は、サーバのセキュリティを確保することを強く推奨します。サーバのセキュリティを確保できない場合は、$KUBERNETES_MASTER
環境変数にhttp://localhost:8080
を設定することで、サーバアドレスのデフォルト設定を引き続き使用できます。kubectl
のユーザは、--server
フラグまたは--kubeconfig
か$KUBECONFIG
で指定した kubeconfig ファイルのなかで、サーバアドレスを指定することもできます。(#86173, soltysh) [SIG API Machinery, CLI and Testing] -
kubectl run
は、以前から非推奨だったジェネレータと Pods の作成に関連しないフラグを削除しました。kubectl run
コマンドは Pods を作成するだけになりました。Pods 以外のオブジェクトを作成するには、特定のkubectl create
サブコマンドを参照してください。 (#87077, soltysh) [SIG Architecture, CLI and Testing]-
以前からアナウンスされていたとおり、
kubectl run
での Deployment 等の作成が削除されました。多くの書籍やドキュメントで多用されているので、今後困惑する読者が増えそうです。
-
以前からアナウンスされていたとおり、
- 廃止予定だった
kubectl rolling-update
コマンドが削除されました。 (#88057, julianvmodesto) [SIG Architecture, CLI and Testing]
Changes by Kind(種類別の変更)
-
--dry-run
フラグの boolean と unset の値は廃止予定となり、将来のバージョンではserver|client|none
のいずれかの値が必須になります。 (#87580, julianvmodesto) [SIG CLI]- Server-side Apply のサポートに伴う変更です
-
これまでの同様の動作を期待する場合は
--dry-run=client
に変更する必要があります
-
kubectl apply --server-dry-run
フラグは廃止予定となり、--dry-run=server
に置き換えられました。 (#87580, julianvmodesto) [SIG CLI]- 上と同様です
Feature(機能追加)
-
kubectl exec
コマンドの呼び出し時に--filename
フラグを使ってリソースを指定できるようになりました。 (#88460, soltysh) [SIG CLI and Testing]-
-f
--filename
オプションを使いマニフェストファイルに定義されたオブジェクトに対してkubectl exec
が使えるようになりました。ただし、複数のオブジェクトがマニフェストファイルに含まれている場合(---
を使用して)、エラーになるのでどの程度使えるシーンがあるのか謎です。 -
合わせてコンテナ内で実行するコマンドの指定はダッシュ(
--
)で区切ることが推奨されるメッセージが出力されるようになりました。全く関係のない変更だと思うんですが、なぜ混ぜ込まれているのか。
-
-
kubectl/drain
: disable-eviction オプションが追加されました。eviction(退去)がサポートされていたとしても drain が delete を使うように強制します。これは、PodDisruptionBudgets をバイパスするため、注意して使用してください。 (#85571, michaelgugino) [SIG CLI]- モチベーションとしては PodDisruptionBudgets のよって Pod の退去が進まなくなることが分かっている場合に、evict の代わりに delete を使いたいことがあるということのようです。基本的には使わないほうがよいでしょう。
- evict の代わりに delete を使うというのは、PodDisruptionBudgets が機能するのは Pod の削除(delete)ではなく、退去(evict)に対してだからです。詳しくは Kubernetes: 複数の Node を安全に停止する (kubectl drain + PodDisruptionBudget) - Qiita を参照ください。
-
kubectl/drain
: skip-wait-for-delete-timeout オプションが追加されました。Pod のDeletionTimestamp
が N 秒より古い場合に、Pod の待機をスキップします。スキップするための秒は 0 より大きな値でなければなりません。 (#85577, michaelgugino) [SIG CLI]-
ローカルボリュームを持つ Pod などで DeletionTimestamp(Pod が削除されるであろう日時で、Pod の削除命令から GracePeriodSeconds を足した日時。詳しくは https://qiita.com/superbrothers/items/3ac78daba3560ea406b2 を参照ください。) を過ぎても削除されない場合があり、drain の実行がブロックされてしまう問題があるそうで、
--skip-wait-for-delete-timeout
フラグを使用すると、DeletionTimestamp から N 秒より経過した Pod を待つことをスキップするようになります。
-
ローカルボリュームを持つ Pod などで DeletionTimestamp(Pod が削除されるであろう日時で、Pod の削除命令から GracePeriodSeconds を足した日時。詳しくは https://qiita.com/superbrothers/items/3ac78daba3560ea406b2 を参照ください。) を過ぎても削除されない場合があり、drain の実行がブロックされてしまう問題があるそうで、
-
kubectl --dry-run
フラグはクライアントサイドとサーバサイドのドライラン戦略(dry-run strategies)をサポートするためにclient
またはserver
、none
を受け入れるようになりました。--dry-run
フラグの boolean と unset の値は廃止予定となり、将来のバージョンではclient | server | none
の値が必須になります。 (#87580, julianvmodesto) [SIG CLI] -
kubectl delete/taint/replace
コマンドに--dry-run=server|client
が追加されました (#88292, julianvmodesto) [SIG CLI and Testing] -
kubectl
で--force
フラグを使用してオブジェクトを削除する際に、--grace-period=0
も合わせて使用する必要がなくなりました。 (#87776, brianpursley) [SIG CLI]-
これまでは
--force
フラグの使用は--grace-period=0
を併用する必要がありましたが、それが不要になったようです。
-
これまでは
-
kubectl
にkubectl alpha debug
コマンドが追加されました。このコマンドはデバッグを目的に実行中の Pod に対してエフェメラルコンテナをアタッチできます。 (#88004, verb) [SIG CLI]
そのほか (バグまたはクリーンアップ、 Flake <- どう訳せばよいのか。小さな変更?)
-
kubectl describe statefulsets.apps
がパーティションのローリングアップデートで壊れた値を表示する問題を修正しました。 (#85846, phil9909) [SIG CLI]- StatefulSet のバーティションについては、公式ドキュメント を参照ください。
- cluster のダンプ情報に init containers のログが追加されました (#88324, zhouya0) [SIG CLI]
-
kubectl create
コマンドの--generator
フラグが廃止予定になりました (#88655, soltysh) [SIG CLI] -
kubectl port-forward
が Service の名前付きポートで正常に動作しないバグが修正されました (#85511, oke-py) [SIG CLI] -
kubectl annotate
が local=true が設定された場合にエラーとなるバグが修正されました (#86952, zhouya0) [SIG CLI] -
kubectl create deployment
でイメージ名に_
または.
が含まれている場合にエラーになるバグが修正されました (#86636, zhouya0) [SIG CLI] -
kubectl drain
が DaemonSets やその他のオブジェクトを無視するバグを修正しました。 (#87361, zhouya0) [SIG CLI]-
kubectl drain
は本来 DaemonSets やローカルボリュームを使用する Pods が退避対象に含まれていると警告のメッセージを出力するのですが、それが出力されていないというバグで動作自体に問題はないようです。
-
-
kubectl describe
で CSI PersistentVolume を対象とした場合に FSType を含むように修正されました。 (#85293, huffmanca) [SIG CLI and Storage] -
kubectl cluster-info dump --output-directory=xxx
は、出力形式に応じた拡張子を持つファイルを生成するようになりました。 (#82070, olivierlemasle) [SIG CLI] -
kubectl describe <type>
とkubectl top pod
は、出力する結果がない場合に、"No resources found"
または"No resources found in <namespace> namespace"
とメッセージを出力するようになりました (#87527, brianpursley) [SIG CLI] -
kubectl drain node --dry-run
は、退去または削除される Pods をリストするようになりました (#82660, sallyom) [SIG CLI]- 地味に便利そうです。
-
kubectl set resources
とkubectl set subject
は、リソースに変化のない値を渡した場合にエラーを返さないようになりました。 (#85490, sallyom) [SIG CLI] - kubelet と kubeadm で pause イメージが 3.2 にアップグレードされました (#88173, BenTheElder) [SIG CLI, Cluster Lifecycle, Node and Testing]
- CLI と関係ないような
-
kubectl apply -f <file> --prune -n <namespace>
は、ファイルでネームスペースが定義されていない全てのリソースをCLI で指定されたネームスペースで prune するようになりました (#85613, MartinKaburu) [SIG CLI] -
kubectl create clusterrolebinding
はrbac.authorization.k8s.io/v1
オブジェクトを作成するようになりました (#85889, oke-py) [SIG CLI] -
kubectl diff
は、差分があるときにのみ 1 を返し、kubectl がエラーの場合は 1 以上を返すようになりました。または、"exit status code1"
のメッセージはミュートされました。 (#87437, apelisse) [SIG CLI and Testing]
所感
1.16 で追加されたエフェメラルコンテナ、kubectl debug
の機能セットがついに揃ってきました。namespace targeting mode
がサポートされたことで、Share Process Namespace を有効にしておく必要がなくなったのが便利です。ベータになるにはもう少しかかりそうですが、非常に楽しみな機能です。