Kubernetes 1.14: SIG CLI の変更内容

## はじめに

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

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

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

- `kubectl kustomize`: ディレクトリまたはリモート URL から kustomization ターゲットをビルドする
- `kubectl create cronjob`: 指定された名前で cronjob を作成する

**廃止予定のコマンド**

- `kubectl convert`

**削除されたコマンド**

なし

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

## What's New (新情報)

**kubectl のプラグイン機構がステーブルになりました ([#579](https://github.com/kubernetes/enhancements/issues/579))**

- kubectl の拡張機能で、任意のサブコマンドを kubectl に追加できます

:memo: 詳しくは、[kubectl のプラグイン機能 kubectl plugin を使おう！](https://qiita.com/superbrothers/items/b4a0aab0575ca6d65739) に書きました。また、ドキュメントは [Extend kubectl with plugins](https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/) です。

:memo: そのほか、kubectl のドキュメントが SIG CLI により用意されました。今回から kubectl に統合された Kustomize の機能について多く記述されています。 [Introduction · The Kubectl Book](https://kubectl.docs.kubernetes.io/)

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

- kubectl get コマンドの廃止予定だった `--show-all` フラグが削除されました ([#69255](https://github.com/kubernetes/kubernetes/pull/69255), [@Pingan2017](https://github.com/Pingan2017))

## 廃止予定の機能

- `kubectl convert` コマンドは廃止予定となり、v1.17 で削除される予定です
    - :memo: v1.13 で廃止予定となっていましたが、v1.14 の CHANGELOG でも再度掲載されています
    - :memo: 廃止理由は、[Kubernetes 1\.13: SIG CLI の変更内容](https://qiita.com/superbrothers/items/39c4449b5da084b02e5d#%E5%BB%83%E6%AD%A2%E4%BA%88%E5%AE%9A%E3%81%AE%E6%A9%9F%E8%83%BD) を参照してください
- kubectl get コマンドの `--export` フラグは廃止予定となり、v1.18 で削除される予定です ([#73787](https://github.com/kubernetes/kubernetes/pull/73787), [@soltysh](https://github.com/soltysh))

## 注目すべき機能

- kubectl コマンドにサブコマンドとして Kustomize が追加されました ([#73033](https://github.com/kubernetes/kubernetes/pull/73033), [@Liujingfang1](https://github.com/Liujingfang1))
    - :memo: Kustomize の統合は、当初は `kubectl apply` コマンドに直接取り込まれる形でマージされましたが、影響範囲が大きすぎることが理由でリバートされこの形になりました
    - :memo: Kustomize コマンド自体は引き続き [kubernetes-sigs/kustomize](https://github.com/kubernetes-sigs/kustomize) で開発が続けられます
        - kubectl コマンドの kustomize 機能は Kubernetes のリリースサイクルで更新されるため、最新機能を利用したい場合は Kustomize 単独のバイナリを利用する必要があります
- kubectl apply/delete/get は、`kustomization.yaml` ファイルを使う `-k` フラグをサポートしました ([#74140](https://github.com/kubernetes/kubernetes/pull/74140), [@Liujingfang1](https://github.com/Liujingfang1))
    - :memo: 次のように利用します

    ```bash
    kubectl apply -k dir
    # Delete resources from a directory containing kustomization.yaml.
    kubectl delete -k dir
    # List resources from a directory containing kustomization.yaml
    kubectl get -k dir
    ```

- `kubectl run` の `--quiet` オプションは、 `--rm` オプションが指定されたときに出力されるリソースの削除メッセージを抑制するようになりました ([#73266](https://github.com/kubernetes/kubernetes/pull/73266), [@awh](https://github.com/awh))
- `kubectl autoscale` コマンドは、カスタムリソースをサポートしました ([#72678](https://github.com/kubernetes/kubernetes/pull/72678), [@rmohr](https://github.com/rmohr))
    - :memo: カスタムリソースでこのコマンドを利用するためには、カスタムリソースが scale サブリソースをサポートしている必要があります
- `kubectl logs` コマンドで、`-f` コマンドと `-l` コマンドが組み合わせて利用することが可能になりました ([#67573](https://github.com/kubernetes/kubernetes/pull/67573), [@m1kola](https://github.com/m1kola))
    - :memo: これによって [wercker/stern](https://github.com/wercker/stern) などを利用せずとも、複数 Pod のログを横断的にストリームとして閲覧できるようになりました
    - :memo: しかし、`-l` で指定したラベルセレクタに一致した Pod のなかで1つでも正しく動作していないとエラーとなりコマンドが終了してしまうので、個人的には引き続き stern を利用します
- `kubectl auth reconcile` コマンドは、どのような変更が行われるかの詳細を出力するようになりました ([#71564](https://github.com/kubernetes/kubernetes/pull/71564), [@liggitt](https://github.com/liggitt))
- `kubectl wait` コマンドは、より多くのセレクタタイプで動作するようになりました ([#71746](https://github.com/kubernetes/kubernetes/pull/71746), [@rctl](https://github.com/rctl))
    - :memo: これは、特定のオブジェクトが特定のコンディションになるのを待つコマンドです
    - :memo: これまでは、特定のオブジェクトしか対象にできませんでしたが、この変更であるリソースのすべてのオブジェクトやラベルセレクタ、フィールドセレクタ、ファイルでの指定が可能になりました
- `kubectl cp` コマンドは、ワイルドカードによるファイルのコピーをサポートしました ([#72641](https://github.com/kubernetes/kubernetes/pull/72641), [@dixudx](https://github.com/dixudx))

## バグ修正と変更

- `kubectl auth can-i` コマンドに特定のネームスペースでどのアクションが実施できるかがわかる `--list` オプションが追加されました ([#64820](https://github.com/kubernetes/kubernetes/pull/64820), [@WanLinghao](https://github.com/WanLinghao))
    - :memo: これまで OpenShift の CLI である `oc` コマンドには同様の機能がありましたが、それが kubectl にもやってきました
- `--help` フラグで一部のフラグが正しく表示されていなかったバグが修正されました ([#74682](https://github.com/kubernetes/kubernetes/pull/74682), [@soltysh](https://github.com/soltysh))
- `kubectl describe` コマンドで static pod のイベントメッセージが取得できてなかったバグが修正されました ([#74156](https://github.com/kubernetes/kubernetes/pull/74156), [@gaorong](https://github.com/gaorong))
- `kubectl set env` コマンドを `--local` フラグとともに実行するとパニックになる問題が修正されました ([#65636](https://github.com/kubernetes/kubernetes/pull/65636), [@juanvallejo](https://github.com/juanvallejo))
- `kubectl plugin list` コマンドは、PATH に含まれる存在しないディレクトリに関するエラーメッセージがデフォルトで出力されないように修正されました ([#73542](https://github.com/kubernetes/kubernetes/pull/73542), [@juanvallejo](https://github.com/juanvallejo))
- ユーザは次のようにオブジェクトを取得できるようになりました

  ```bash
    a. kubectl get pod test-pod -o custom-columns=CONTAINER:.spec.containers[0:3].name
    b. kubectl get pod test-pod -o custom-columns=CONTAINER:.spec.containers[-2:].name
  ```

([#73063](https://github.com/kubernetes/kubernetes/pull/73063), [@WanLinghao](https://github.com/WanLinghao))

- `kubectl api-resources` コマンドは、1つのエラーでリソースの表示に失敗することがなくなりました ([#73035](https://github.com/kubernetes/kubernetes/pull/73035), [@juanvallejo](https://github.com/juanvallejo))
    - :memo: これまでは1つの問題があると、そこでリソースの表示処理が終了されてしまっていたところ、すべての処理が完了したのちにエラーをまとめて表示するように変更されました
- `kubectl` コマンドは設定ファイルを一度読み込むと、永続クライアント設定を使うようになりました ([#71117](https://github.com/kubernetes/kubernetes/pull/71117), [@dixudx](https://github.com/dixudx))
    - :memo: これまで内部的には kubeconfig ファイルの読み込み処理が複数実行されるとその度に読み込み処理が実行されていました
    - :memo: この変更によってすでに一度読み込んでいる場合は、キャッシュしたクライアント設定を使い回すようになりパフォーマンスの向上が見込めます
- `kubectl describe pod` コマンドの出力に emptyDir の SizeLimit が表示されるようになりました ([#69279](https://github.com/kubernetes/kubernetes/pull/69279), [@dtaniwaki](https://github.com/dtaniwaki))
    - :memo: Pod `spec.volumes.emptyDir.sizeLimit` が設定されている場合に表示されます
- `kubectl delete` コマンドで `--all-namespaces` フラグが利用できるようになりました ([#73716](https://github.com/kubernetes/kubernetes/pull/73716), [@deads2k](https://github.com/deads2k))

## そのほか

- :memo: `kubectl` コマンドは、`--all-namespaces` フラグのショートカットとして `-A` をサポートしました ([#72006](https://github.com/kubernetes/kubernetes/pull/72006), [@soltysh](https://github.com/soltysh))
    - :memo: 多用するフラグなので地味に便利な変更です

## 所感

めでたく kubectl plugin が GA となりました。仕様がシンプルなので GA までに大きな変更はありませんでした。ただ、自動補完 (`kubectl completion`) がプラグインとして追加したサブコマンドに対応しておらず使いにくい問題があります。これは、1.15 に導入できるように開発する予定です。

Kustomize の統合も大きなニュースです。`kubectl kustomize` コマンドと `kubectl apply/delete/get -k` として統合されています。個人的には、kubectl にはプラグイン機構があるにもかかわらず、あえて kubectl に統合したことには反対なのですが、うれしい利用者も多いと思います。

地味にうれしいのが、`--all-namespaces` に `-A` のショートハンドが追加されたことです。補完を使っていればそこまで気にならないことではあるのですが、多用するフラグなのでより短いのはよいことです。

---

今後ゼットラボメンバから各 SIG 毎に変更内容の記事が投稿されていきます。お楽しみに。