Kubernetes 1.18: SIG-CLI の変更内容

## はじめに

ここでは、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）を無視します。一部のリソースでは不整合やデータの損失が発生する可能性がある。
    - :memo: `--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 はかなり長い間デバッグユーティリティの必要性について議論してきました。[エフェメラルコンテナ](https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/) の開発により、`kubectl exec` の上に構築されたツールで開発者をサポートする方法が明らかになりました。[kubectl debug コマンド](https://github.com/kubernetes/enhancements/blob/master/keps/sig-cli/20190805-kubectl-debug.md) の追加は、開発者がクラスタ内で簡単に Pod をデバッグできることを可能にします。このコマンドを使用すると Pod の隣で動作する一時的なコンテナを作成できるだけでなく、インタラクティブなトラブルシュートのためにコンソールにアタッチすることもできます。

:memo: 1.16 でもアルファとしてアナウンスされていましたが、一部の機能の実装が未完でした。まだ一部残っているもののほぼ完了ということでおそらく再度アナウンスされたということだと思われます。1.16 時点での機能については [Kubernetes 1\.16 アルファ機能を先取り！ エフェメラルコンテナ \- Speaker Deck](https://speakerdeck.com/superbrothers/kubernetes-1-dot-16-ephemeral-containers-alpha-bf6ff69c-410b-4f89-a7e9-e856db91fb7f)、[Kubernetes 1\.16: Ephemeral Containers \(alpha\) \- Qiita](https://qiita.com/superbrothers/items/85edec4d0232e0bbe2c0) にまとめていますので参照してください。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](https://github.com/kubernetes/kubernetes/pull/86173), [soltysh](https://github.com/soltysh)) [SIG API Machinery, CLI and Testing]
- `kubectl run` は、以前から非推奨だったジェネレータと Pods の作成に関連しないフラグを削除しました。`kubectl run` コマンドは Pods を作成するだけになりました。Pods 以外のオブジェクトを作成するには、特定の `kubectl create` サブコマンドを参照してください。 ([#87077](https://github.com/kubernetes/kubernetes/pull/87077), [soltysh](https://github.com/soltysh)) [SIG Architecture, CLI and Testing]
    - :memo: 以前からアナウンスされていたとおり、`kubectl run` での Deployment 等の作成が削除されました。多くの書籍やドキュメントで多用されているので、今後困惑する読者が増えそうです。
- 廃止予定だった `kubectl rolling-update` コマンドが削除されました。 ([#88057](https://github.com/kubernetes/kubernetes/pull/88057), [julianvmodesto](https://github.com/julianvmodesto)) [SIG Architecture, CLI and Testing]

## Changes by Kind（種類別の変更）

- `--dry-run` フラグの boolean と unset の値は廃止予定となり、将来のバージョンでは `server|client|none` のいずれかの値が必須になります。 ([#87580](https://github.com/kubernetes/kubernetes/pull/87580), [julianvmodesto](https://github.com/julianvmodesto)) [SIG CLI]
    - :memo: Server-side Apply のサポートに伴う変更です
    - :memo: これまでの同様の動作を期待する場合は `--dry-run=client` に変更する必要があります
- `kubectl apply --server-dry-run` フラグは廃止予定となり、`--dry-run=server` に置き換えられました。 ([#87580](https://github.com/kubernetes/kubernetes/pull/87580), [julianvmodesto](https://github.com/julianvmodesto)) [SIG CLI]
    - :memo: 上と同様です

## Feature（機能追加）

- `kubectl exec` コマンドの呼び出し時に `--filename` フラグを使ってリソースを指定できるようになりました。 ([#88460](https://github.com/kubernetes/kubernetes/pull/88460), [soltysh](https://github.com/soltysh)) [SIG CLI and Testing]
    - :memo: `-f` `--filename` オプションを使いマニフェストファイルに定義されたオブジェクトに対して `kubectl exec` が使えるようになりました。ただし、複数のオブジェクトがマニフェストファイルに含まれている場合（`---` を使用して）、エラーになるのでどの程度使えるシーンがあるのか謎です。
    - :memo: 合わせてコンテナ内で実行するコマンドの指定はダッシュ（`--`）で区切ることが推奨されるメッセージが出力されるようになりました。全く関係のない変更だと思うんですが、なぜ混ぜ込まれているのか。
- `kubectl/drain`: disable-eviction オプションが追加されました。eviction（退去）がサポートされていたとしても drain が delete を使うように強制します。これは、PodDisruptionBudgets をバイパスするため、注意して使用してください。 ([#85571](https://github.com/kubernetes/kubernetes/pull/85571), [michaelgugino](https://github.com/michaelgugino)) [SIG CLI]
    - :memo: モチベーションとしては PodDisruptionBudgets のよって Pod の退去が進まなくなることが分かっている場合に、evict の代わりに delete を使いたいことがあるということのようです。基本的には使わないほうがよいでしょう。
    - :memo: evict の代わりに delete を使うというのは、PodDisruptionBudgets が機能するのは Pod の削除（delete）ではなく、退去（evict）に対してだからです。詳しくは [Kubernetes: 複数の Node を安全に停止する \(kubectl drain \+ PodDisruptionBudget\) \- Qiita](https://qiita.com/tkusumi/items/946b0f31931d21a78058) を参照ください。
- `kubectl/drain`: skip-wait-for-delete-timeout オプションが追加されました。Pod の `DeletionTimestamp` が N 秒より古い場合に、Pod の待機をスキップします。スキップするための秒は 0 より大きな値でなければなりません。 ([#85577](https://github.com/kubernetes/kubernetes/pull/85577), [michaelgugino](https://github.com/michaelgugino)) [SIG CLI]
    - :memo: ローカルボリュームを持つ Pod などで DeletionTimestamp（Pod が削除されるであろう日時で、Pod の削除命令から GracePeriodSeconds を足した日時。詳しくは https://qiita.com/superbrothers/items/3ac78daba3560ea406b2 を参照ください。） を過ぎても削除されない場合があり、drain の実行がブロックされてしまう問題があるそうで、`--skip-wait-for-delete-timeout` フラグを使用すると、DeletionTimestamp  から N 秒より経過した Pod を待つことをスキップするようになります。
- `kubectl --dry-run` フラグはクライアントサイドとサーバサイドのドライラン戦略（dry-run strategies）をサポートするために `client` または `server`、`none` を受け入れるようになりました。`--dry-run` フラグの boolean と unset の値は廃止予定となり、将来のバージョンでは `client | server | none` の値が必須になります。 ([#87580](https://github.com/kubernetes/kubernetes/pull/87580), [julianvmodesto](https://github.com/julianvmodesto)) [SIG CLI]
- `kubectl delete/taint/replace` コマンドに `--dry-run=server|client` が追加されました ([#88292](https://github.com/kubernetes/kubernetes/pull/88292), [julianvmodesto](https://github.com/julianvmodesto)) [SIG CLI and Testing]
- `kubectl` で `--force` フラグを使用してオブジェクトを削除する際に、`--grace-period=0` も合わせて使用する必要がなくなりました。 ([#87776](https://github.com/kubernetes/kubernetes/pull/87776), [brianpursley](https://github.com/brianpursley)) [SIG CLI]
    - :memo: これまでは `--force` フラグの使用は `--grace-period=0` を併用する必要がありましたが、それが不要になったようです。
- `kubectl` に `kubectl alpha debug` コマンドが追加されました。このコマンドはデバッグを目的に実行中の Pod に対してエフェメラルコンテナをアタッチできます。 ([#88004](https://github.com/kubernetes/kubernetes/pull/88004), [verb](https://github.com/verb)) [SIG CLI]

## そのほか (バグまたはクリーンアップ、 Flake <- どう訳せばよいのか。小さな変更？)

- `kubectl describe statefulsets.apps` がパーティションのローリングアップデートで壊れた値を表示する問題を修正しました。 ([#85846](https://github.com/kubernetes/kubernetes/pull/85846), [phil9909](https://github.com/phil9909)) [SIG CLI]
    - :memo: StatefulSet のバーティションについては、[公式ドキュメント](https://kubernetes.io/ja/docs/concepts/workloads/controllers/statefulset/#%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3) を参照ください。
- cluster のダンプ情報に init containers のログが追加されました ([#88324](https://github.com/kubernetes/kubernetes/pull/88324), [zhouya0](https://github.com/zhouya0)) [SIG CLI]
- `kubectl create` コマンドの `--generator` フラグが廃止予定になりました ([#88655](https://github.com/kubernetes/kubernetes/pull/88655), [soltysh](https://github.com/soltysh)) [SIG CLI]
- `kubectl port-forward` が Service の名前付きポートで正常に動作しないバグが修正されました ([#85511](https://github.com/kubernetes/kubernetes/pull/85511), [oke-py](https://github.com/oke-py)) [SIG CLI]
- `kubectl annotate` が local=true が設定された場合にエラーとなるバグが修正されました ([#86952](https://github.com/kubernetes/kubernetes/pull/86952), [zhouya0](https://github.com/zhouya0)) [SIG CLI]
- `kubectl create deployment` でイメージ名に `_` または `.` が含まれている場合にエラーになるバグが修正されました ([#86636](https://github.com/kubernetes/kubernetes/pull/86636), [zhouya0](https://github.com/zhouya0)) [SIG CLI]
- `kubectl drain` が DaemonSets やその他のオブジェクトを無視するバグを修正しました。 ([#87361](https://github.com/kubernetes/kubernetes/pull/87361), [zhouya0](https://github.com/zhouya0)) [SIG CLI]
    - :memo: `kubectl drain` は本来 DaemonSets やローカルボリュームを使用する Pods が退避対象に含まれていると警告のメッセージを出力するのですが、それが出力されていないというバグで動作自体に問題はないようです。
- `kubectl describe` で CSI PersistentVolume を対象とした場合に FSType を含むように修正されました。 ([#85293](https://github.com/kubernetes/kubernetes/pull/85293), [huffmanca](https://github.com/huffmanca)) [SIG CLI and Storage]
- `kubectl cluster-info dump --output-directory=xxx` は、出力形式に応じた拡張子を持つファイルを生成するようになりました。 ([#82070](https://github.com/kubernetes/kubernetes/pull/82070), [olivierlemasle](https://github.com/olivierlemasle)) [SIG CLI]
- `kubectl describe <type>` と `kubectl top pod` は、出力する結果がない場合に、`"No resources found"` または `"No resources found in <namespace> namespace"` とメッセージを出力するようになりました ([#87527](https://github.com/kubernetes/kubernetes/pull/87527), [brianpursley](https://github.com/brianpursley)) [SIG CLI]
- `kubectl drain node --dry-run` は、退去または削除される Pods をリストするようになりました ([#82660](https://github.com/kubernetes/kubernetes/pull/82660), [sallyom](https://github.com/sallyom)) [SIG CLI]
    - :memo: 地味に便利そうです。
- `kubectl set resources` と `kubectl set subject` は、リソースに変化のない値を渡した場合にエラーを返さないようになりました。 ([#85490](https://github.com/kubernetes/kubernetes/pull/85490), [sallyom](https://github.com/sallyom)) [SIG CLI]
- kubelet と kubeadm で pause イメージが 3.2 にアップグレードされました ([#88173](https://github.com/kubernetes/kubernetes/pull/88173), [BenTheElder](https://github.com/BenTheElder)) [SIG CLI, Cluster Lifecycle, Node and Testing]
    - :memo: CLI と関係ないような :thinking_face:
- `kubectl apply  -f <file> --prune -n <namespace>` は、ファイルでネームスペースが定義されていない全てのリソースをCLI で指定されたネームスペースで prune するようになりました ([#85613](https://github.com/kubernetes/kubernetes/pull/85613), [MartinKaburu](https://github.com/MartinKaburu)) [SIG CLI]
- `kubectl create clusterrolebinding` は `rbac.authorization.k8s.io/v1` オブジェクトを作成するようになりました ([#85889](https://github.com/kubernetes/kubernetes/pull/85889), [oke-py](https://github.com/oke-py)) [SIG CLI]
- `kubectl diff` は、差分があるときにのみ 1 を返し、kubectl がエラーの場合は 1 以上を返すようになりました。または、`"exit status code1"` のメッセージはミュートされました。 ([#87437](https://github.com/kubernetes/kubernetes/pull/87437), [apelisse](https://github.com/apelisse)) [SIG CLI and Testing]

## 所感

1.16 で追加されたエフェメラルコンテナ、`kubectl debug` の機能セットがついに揃ってきました。namespace targeting mode 
 がサポートされたことで、Share Process Namespace を有効にしておく必要がなくなったのが便利です。ベータになるにはもう少しかかりそうですが、非常に楽しみな機能です。