Kubernetes 1.15: SIG-CLI の変更内容

## はじめに

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

- https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.15.md

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

- `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](https://github.com/kubernetes/kubernetes/pull/78445), [@soltysh](https://github.com/soltysh))
    - :memo: 1.10 から `kubectl scale` が scale サブリソースを利用するようになったことに伴い (Generic scaler)、scale サブリソースを持つ Deployments などのオブジェクトに加えて CRD などにも対応しました
    - :memo: 一方で Jobs オブジェクトは scale サブリソースを持たず他のオブジェクトと一貫性がなく、kubectl scale がスケールできるオブジェクトは HPA がスケール可能なオブジェクトであるべきという方針で 1.10 から廃止予定となり、今回で完全に削除されました
- 1.12 から廃止予定だった `kubectl exec` の `--pod/-p` フラグは完全に削除されました ([#76713](https://github.com/kubernetes/kubernetes/pull/76713), [@prksu](https://github.com/prksu))
    - :memo: これは正確ではなく、`--pod/-p` フラグは v0.18.0 (2015/5) で廃止予定となっていましたが、ヘルプメッセージ上でフラグに廃止マークが追加されたのが 1.12 でした ([#8604](https://github.com/kubernetes/kubernetes/pull/8604))

## `kubectl` コマンドの改善

- `kubectl top` コマンドは、`memory` または `cpu` によってリストを並び替える `--sort-by` オプションを持つようになりました ([#75920](https://github.com/kubernetes/kubernetes/pull/75920), [@artmello](https://github.com/artmello))
- `kubectl rollout restart` は、DaemonSets と StatefulSets に対して機能するようになりました ([#77423](https://github.com/kubernetes/kubernetes/pull/77423), [@apelisse](https://github.com/apelisse))
- `kubectl get --watch=true` は、custom print columns で Custom Resource Definitions を出力するようになりました ([#76161](https://github.com/kubernetes/kubernetes/pull/76161), [@liggitt](https://github.com/liggitt))
- Kubernetes は、`kubectl get pv/pvc -o wide` で `volumeMode` の出力をサポートしました ([#76646](https://github.com/kubernetes/kubernetes/pull/76646), [@cwdsuzhou](https://github.com/cwdsuzhou))
    - :memo: Volume Mode は、1.13 からベータである Raw Block Volume のサポートで追加されたものです
    - :memo: 1.9 以前、全ての Volume plugin は Persistent Volume (PV) でファイルシステムを作成していましたが、 PV `spec.volumeMode` フィールドを `Block` に設定することで Raw Block Device が利用できるようになりました。デフォルトは `Filesystem` です。
    - :memo: 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](https://github.com/kubernetes/kubernetes/pull/76062), [@apelisse](https://github.com/apelisse))
    - :memo: Deployments に対してローリングアップデートを（表面上）マニフェストの変更なしに実施するというコマンドです
    - :memo: 実際には Deployments の Pod Template のアノテーションを操作するという古典的な方法が内部的に使われています
    - :memo: このコマンドは DaemonSets, StatefulSets に対しても機能する変更が 1.15 に入りました
- `kubectl exec` は、リソース名を使い（例: `deployment/mydeployment`）、一致した Pod を選択できるようになったのに加えて、最低1つの Pod が実行されるまで待つための `--pod-running-timeout` フラグが追加されました ([#73664](https://github.com/kubernetes/kubernetes/pull/73664), [@prksu](https://github.com/prksu))
    - :memo: 例えば `kubectl exec deploy/mydeployment date` を実行すると、`deploy/mydeployment` に紐づく最初の Pod 内の最初のコンテナ（デフォルト）内で `date` コマンドを実行するということです
    - :memo: `kubectl port-forward` も以前同様にリソース名を使った実行をサポートしたため、それと同じような変更です
    - :memo: 加えてリソース名を使いつつ `--pod-running-timeout` を使うことでまだ Pod が実行される前にコマンドを実行して、1つの Pod が実行されたらそこでコマンドを実行するということができるようになりました。デフォルトは `1m` (1分) です。
        - 軽く試したところでは、Pod が作成された瞬間にコマンドを実行してしまい、まだコンテナが正しく実行されてしないにも関わらず接続しようとして失敗してしまっているように見えます

## その他の変更/修正

- `kubectl exec` の Usage で `[flags]` が正しい位置になるように修正されました ([#77589](https://github.com/kubernetes/kubernetes/pull/77589), [@soltysh](https://github.com/soltysh))
    - :memo: kubectl が利用している spf13/cobra ライブラリが `[flags]` を Usage の最後に自動的に追加してしまっていたが、`kubectl exec` では不適切なのでそれを修正したというもの
- `kubectl describe cronjobs` の `Successful Job History Limit` のエラーが修正されました ([#77347](https://github.com/kubernetes/kubernetes/pull/77347), [@danielqsj](https://github.com/danielqsj))
    - :memo: `cronJob.Spec.SuccessfulJobsHistoryLimit` はポインタであるにも関わらずそのまま渡されていました
- `kubectl describe` の出力で、特殊な文字を含む名前のフィールドを整形せずにそのまま出力するようしたことで、表示が崩れる問題を回避しました ([#75483](https://github.com/kubernetes/kubernetes/pull/75483), [@gsadhani](https://github.com/gsadhani))
    - :memo: `kubectl describe` は例えば `kind` は `Kind` として出力されるように整形していますが、一部のフィールド名で表示が崩れていました
- Kind が "Status" であるカスタムリソースに対して kubectl が正しくハンドリングできていなかった問題を修正しました ([#77368](https://github.com/kubernetes/kubernetes/pull/77368), [@liggitt](https://github.com/liggitt))
    - :memo: Admission Webhook で利用される `meta.k8s.io/v1.Status` の処理が甘かったことで問題があったようです
- Pod への/からのコピーかどうかに関わらず、`kubectl cp` のエラーを一貫して提供するようになりました ([#77010](https://github.com/kubernetes/kubernetes/pull/77010), [@soltysh](https://github.com/soltysh))
    - :memo: これまでは、Pod にコピーする場合と、Pod からコピーする場合でエラー内容が異なってしまっていたのを修正したということです
- 例えば `key:effect` や `key=:effect-` といった、より多くの v1.Taint 形式のパースのサポートが追加されました ([#74159](https://github.com/kubernetes/kubernetes/pull/74159), [@dlipovetsky](https://github.com/dlipovetsky))
    - :memo: `kubectl taint` は、これまで値のない Taint 形式を不正として扱っていたようです
    - :memo: 値がなくてもよいことを知りませんでした

## 所感

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

- [kubectl のプラグイン機能 kubectl plugin を使おう！ \- Qiita](https://qiita.com/superbrothers/items/b4a0aab0575ca6d65739)
- https://github.com/kubernetes-sigs/krew
    - 私が作成したプラグイン `open-svc`, `view-serviceaccount-kubeconfig`, `sort-manifests` も krew からインストールできます :sunglasses:
- [kubernetes/cli\-runtime: Set of helpers for creating kubectl commands and plugins\.](https://github.com/kubernetes/cli-runtime)