Edited at

Kubernetes 1.15: SIG-CLI の変更内容


はじめに

ここでは、Kubernetes 1.15 の CHANGELOG から SIG-CLI (kubectl) の取り組みについてまとめています。

新たに追加されたコマンド



  • kubectl rollout restart: リソースを再実行する

廃止予定のコマンド

なし

削除されたコマンド



  • kubectl scale job: Job オブジェクトのスケール

そのほか、オプションの追加、削除は、 https://github.com/superbrothers/kubectl-docs/compare/v1.14.0...v1.15.0 で参照できます。


What's New (新情報)

SIG-CLI に関する大きな変更はありません。


アップグレード前に必ず確認すべき内容


  • 1.10 から廃止予定だった kubectl scale job が完全に削除されました (#78445, @soltysh)



    • :pencil: 1.10 から kubectl scale が scale サブリソースを利用するようになったことに伴い (Generic scaler)、scale サブリソースを持つ Deployments などのオブジェクトに加えて CRD などにも対応しました


    • :pencil: 一方で Jobs オブジェクトは scale サブリソースを持たず他のオブジェクトと一貫性がなく、kubectl scale がスケールできるオブジェクトは HPA がスケール可能なオブジェクトであるべきという方針で 1.10 から廃止予定となり、今回で完全に削除されました



  • 1.12 から廃止予定だった kubectl exec--pod/-p フラグは完全に削除されました (#76713, @prksu)



    • :pencil: これは正確ではなく、--pod/-p フラグは v0.18.0 (2015/5) で廃止予定となっていましたが、ヘルプメッセージ上でフラグに廃止マークが追加されたのが 1.12 でした (#8604)




kubectl コマンドの改善



  • kubectl top コマンドは、memory または cpu によってリストを並び替える --sort-by オプションを持つようになりました (#75920, @artmello)


  • kubectl rollout restart は、DaemonSets と StatefulSets に対して機能するようになりました (#77423, @apelisse)


  • kubectl get --watch=true は、custom print columns で Custom Resource Definitions を出力するようになりました (#76161, @liggitt)

  • Kubernetes は、kubectl get pv/pvc -o widevolumeMode の出力をサポートしました (#76646, @cwdsuzhou)



    • :pencil: Volume Mode は、1.13 からベータである Raw Block Volume のサポートで追加されたものです


    • :pencil: 1.9 以前、全ての Volume plugin は Persistent Volume (PV) でファイルシステムを作成していましたが、 PV spec.volumeMode フィールドを Block に設定することで Raw Block Device が利用できるようになりました。デフォルトは Filesystem です。


    • :pencil: 1.15 時点で Raw Block Volume をサポートしている Volume plugins は次のとおりです


      • AWSElasticBlockStore

      • AzureDisk

      • FC (Fibre Channel)

      • GCEPersistentDisk

      • iSCSI

      • Local volume

      • RBD (Ceph Block Device)

      • VsphereVolume (alpha)





  • Deployments のローリングリスタートを実施する kubectl rollout restart コマンドが新たに追加されました (#76062, @apelisse)



    • :pencil: Deployments に対してローリングアップデートを(表面上)マニフェストの変更なしに実施するというコマンドです


    • :pencil: 実際には Deployments の Pod Template のアノテーションを操作するという古典的な方法が内部的に使われています


    • :pencil: このコマンドは DaemonSets, StatefulSets に対しても機能する変更が 1.15 に入りました




  • kubectl exec は、リソース名を使い(例: deployment/mydeployment)、一致した Pod を選択できるようになったのに加えて、最低1つの Pod が実行されるまで待つための --pod-running-timeout フラグが追加されました (#73664, @prksu)



    • :pencil: 例えば kubectl exec deploy/mydeployment date を実行すると、deploy/mydeployment に紐づく最初の Pod 内の最初のコンテナ(デフォルト)内で date コマンドを実行するということです


    • :pencil: kubectl port-forward も以前同様にリソース名を使った実行をサポートしたため、それと同じような変更です


    • :pencil: 加えてリソース名を使いつつ --pod-running-timeout を使うことでまだ Pod が実行される前にコマンドを実行して、1つの Pod が実行されたらそこでコマンドを実行するということができるようになりました。デフォルトは 1m (1分) です。


      • 軽く試したところでは、Pod が作成された瞬間にコマンドを実行してしまい、まだコンテナが正しく実行されてしないにも関わらず接続しようとして失敗してしまっているように見えます






その他の変更/修正



  • kubectl exec の Usage で [flags] が正しい位置になるように修正されました (#77589, @soltysh)



    • :pencil: kubectl が利用している spf13/cobra ライブラリが [flags] を Usage の最後に自動的に追加してしまっていたが、kubectl exec では不適切なのでそれを修正したというもの




  • kubectl describe cronjobsSuccessful Job History Limit のエラーが修正されました (#77347, @danielqsj)



    • :pencil: cronJob.Spec.SuccessfulJobsHistoryLimit はポインタであるにも関わらずそのまま渡されていました




  • kubectl describe の出力で、特殊な文字を含む名前のフィールドを整形せずにそのまま出力するようしたことで、表示が崩れる問題を回避しました (#75483, @gsadhani)



    • :pencil: kubectl describe は例えば kindKind として出力されるように整形していますが、一部のフィールド名で表示が崩れていました



  • Kind が "Status" であるカスタムリソースに対して kubectl が正しくハンドリングできていなかった問題を修正しました (#77368, @liggitt)



    • :pencil: Admission Webhook で利用される meta.k8s.io/v1.Status の処理が甘かったことで問題があったようです



  • Pod への/からのコピーかどうかに関わらず、kubectl cp のエラーを一貫して提供するようになりました (#77010, @soltysh)



    • :pencil: これまでは、Pod にコピーする場合と、Pod からコピーする場合でエラー内容が異なってしまっていたのを修正したということです



  • 例えば key:effectkey=:effect- といった、より多くの v1.Taint 形式のパースのサポートが追加されました (#74159, @dlipovetsky)



    • :pencil: kubectl taint は、これまで値のない Taint 形式を不正として扱っていたようです


    • :pencil: 値がなくてもよいことを知りませんでした




所感

1.15 では、特に目立った大きな変更は SIG-CLI ではありませんでした。kubectl rollout restart でわざわざ PATCH を使わずに Workload API をリスタート(再作成)できるようになったのはうれしい方も多いと思いますが、一方で kubectl 自体にこの機能を本当に追加する必要があったのか、プラグインとすることで kubectl のメンテナンスコストを上げずに済んだのではないかと考えています。kubectl プラグインは現在のところ単にプラグインのコマンドを呼び出すだけであり、便利な面はほとんどありませんが、kubectl completion による bash/zsh の自動補完に対応する PR を作成してレビューを受けていますので、今後補完されるようになれば少しは便利に使えるようになります。また、kubectl プラグインマネージャの krew を使えば、他の人が作成したプラグインを簡単にインストールして利用できます。ぜひ kubectl プラグインを使ってみてください。