Kubernetes 1.20: SIG-CLI (kubectl) の変更内容

## はじめに

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

- https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md
- https://relnotes.k8s.io/?areas=kubectl&releaseVersions=v1.20.0

新たに追加された主なコマンドとフラグ

- `kubectl config delete-user` コマンド: kubeconfig から指定の `user` を削除する
- `kubectl config get-user` コマンド: kubeconfig に定義された指定の `user` を表示する
- `kubectl create ingress` コマンド: 指定の名前で Ingress を作成する
- `kubectl debug` コマンド: ワークロードとノードのトラブルシューティングのためのデバッグ Pod を作成する
    - :memo: `kubectl alpha debug` の `kubectl debug` への昇格です
- `kubectl patch --patch-file` フラグ: パッチを含むファイルを指定してリソースに適用

変更があった主なコマンドとフラグ

- `kubectl drain --delete-local-data` フラグ: `--delete-emptydir-data` に変更
    - :memo: emptyDir を使用する Pod が存在する場合もドレイン処理を実行するフラグです

廃止予定のコマンドとフラグ

- `kubectl drain --delete-local-data` フラグ

削除されたコマンドとフラグ

- `kubectl alpha` コマンド
- `kubectl convert` コマンド
- `kubectl autoscale --generator` フラグ

そのほか、細かい変更は、 https://github.com/superbrothers/kubectl-docs/compare/v1.19.0...v1.20.0 で参照できます。

## What's New (新情報)

### client-go の外部クレデンシャルプロバイダ

client-go のクレデンシャルプラグインは、環境変数 `KUBERNETES_EXEC_INFO` を介して現在のクラスタ情報を渡すことができるようになりました。詳細は、[client-go クレデンシャルプラグインのドキュメンテーション](https://docs.k8s.io/reference/access-authn-authz/authentication/#client-go-credential-plugins)を参照してください。

:memo: client-go のクレデンシャルプラグインは、例えば Amazon EKS のクラスタ認証に必要な情報を取得する `aws-iam-authenticator` などが該当します。今回このクレデンシャルプラグインで、オプションで認証情報を取得しようとしているクラスタに関する情報を `KUBERNETES_EXEC_INFO` 環境変数を通じて参照できるようになりました。クラスタ情報には、サーバ URL や証明書データが含まれ、また任意の設定情報も渡せます。この機能を使用するには kubeconfig `user.exec.provideClusterInfo` フィールドを `true` に設定する必要があります。

### `kubectl debug` のベータへの昇格

`kubectl alpha debug` コマンドは、1.20 でアルファからベータに昇格し、`kubectl debug` コマンドになりました。
`kubectl debug` コマンドは、一般的なデバッグワークフローを `kubectl` から直接サポートします。このリリースの `kubectl` でサポートされているトラブルシュートのシナリオは次のとおりです。

- 起動時にクラッシュする Pod のコンテナイメージやコマンドを変更したコピーの Pod を作成してトラブルシュートする
- Pod の新しいコピーかエフェメラルコンテナを使って、デバッグツールを含むコンテナを追加することで、distroless コンテナをトラブルシュートする（エフェメラルコンテナはデフォルトでは有効になっていないアルファ機能です）
    - :memo: エフェメラルコンテナの詳細は [Kubernetes 1\.16: Ephemeral Containers \(alpha\)](https://qiita.com/superbrothers/items/85edec4d0232e0bbe2c0) を参照ください
    - :memo: distroless（ディストロレス）コンテナは、Google が提供するランタイムの依存関係のみを含むコンテナイメージです。パッケージマネージャやシェルといった一般の Linux ディストロに含まれるツールが含まれないため、攻撃対象領域が小さくなったり、脆弱性スキャナの雑音が少なくなるといったメリットがあります。
- ホストの Linux namespaces で実行され、ホストのファイルシステムにアクセスできるコンテナを作成して、ノード上でトラブルシュートする

新しいビルトインコマンドとして、`kubectl debug` は、"debug" という名前の kubectl プラグインより優先されることに注意してください。影響を受けるプラグインは名前を変更する必要があります。

`kubectl alpha debug` コマンドは廃止予定となり、以降のリリースで削除されます。`kubectl alpha debug` の代わりに `kubectl debug` を使うようにスクリプトを更新してください！

`kubectl debug` の詳細は、Kubernetes ウェブサイトの [Debug Running Pods](https://kubernetes.io/docs/tasks/debug-application-cluster/debug-running-pod/) または、`kubectl help debug` を参照するか、Kubernetes Slack ワークスペースの #sig-cli チャンネル、または [enhancement #1441](https://features.k8s.io/1441) にコメントして SIG CLI に連絡してください。

- :memo: エフェメラルコンテナは、v1.21 でベータに昇格しデフォルトで有効化される予定になっています（2021/1/26）
    - https://github.com/kubernetes/enhancements/issues/277#issuecomment-758708627

## Urgent Upgrade Notes（必ず一読してからアップグレードしなければならない事項）

- なし

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

### Deprecation (廃止)

- Kubectl: `--delete-local-data` フラグの廃止 ([#95076](https://github.com/kubernetes/kubernetes/pull/95076), [dougsland](https://github.com/dougsland)) [SIG CLI, Cloud Provider and Scalability]
    - :memo: `kubectl drain` コマンドの `--delete-local-data` フラグが廃止予定となり、代わりに `--delete-emptydir-data` を使う必要があります。
    - :memo: そもそも emptyDir を使う Pod は再作成されれば emptyDir のデータは削除されるはずで、ドレインを実行するのにいちいち emptyDir のデータを消すかどうかを確認していられないはずで、こんなフラグは不要なはずなんですが、なぜが存在しています。フラグ名の変更ではなくそもそも廃止予定として削除してしまえばよいフラグに感じます。

### API Change (API 変更)

なし

### Feature（機能）

- `kubectl config` サブコマンドに `get-users`, `delete-user` を追加 ([#89840](https://github.com/kubernetes/kubernetes/pull/89840), [eddiezane](https://github.com/eddiezane)) [SIG CLI]
    - :memo: `kubectl config get-users` は、kubeconfig に定義されたユーザの情報を表示します
    - :memo: `kubectl config delete-user` は、kubeconfig から指定のユーザを削除します
- `kubectl` に `create ingress` コマンドを追加 ([#78153](https://github.com/kubernetes/kubernetes/pull/78153), [amimof](https://github.com/amimof)) [SIG CLI and Network]
    - :memo: ついに `kubectl create` コマンドで Ingress オブジェクトが作成できるようになりました。 TODO
- EphemeralContainers（エフェメラルコンテナ）は、initContainers と containers と同じ API デフォルトが適用されるようになりました ([#94896](https://github.com/kubernetes/kubernetes/pull/94896), [wawa0210](https://github.com/wawa0210)) [SIG Apps and CLI]
    - :memo: EphemeralContainers はこれまでクライアント側でデフォルト値が決定されていたため、例えば ImagePullPolicy はデフォルトが `IfNotPresent` になっていました。initContainers と containers では、`latest` タグのイメージを指定している場合には `Always` となる仕様であるため、EphemeralContainers でもそれらの仕様が適用されるように変更されました。
- Kubectl が Ingress オブジェクトの作成をサポート ([#94327](https://github.com/kubernetes/kubernetes/pull/94327), [rikatz](https://github.com/rikatz)) [SIG CLI and Network]
    - :memo: どういうわけか2つめの Ingress サポートの PR がありました :thinking:
- `kubectl rollout history sts/sts-name --revision=some-revision` は、指定リビジョンの sts の詳細を表示するようになりました ([#86506](https://github.com/kubernetes/kubernetes/pull/86506), [dineshba](https://github.com/dineshba)) [SIG CLI]
- Kubectl: これまでユーザは `KUBECTL_EXTERNAL_DIFF` 環境変数を使って 外部 diff ツールに引数を渡せませんでした。このリリースでは、ユーザが `KUBECTL_EXTERNAL_DIFF` 環境変数で引数を指定できるようになりました ([#95292](https://github.com/kubernetes/kubernetes/pull/95292), [dougsland](https://github.com/dougsland)) [SIG CLI]
    - :memo: この変更で `KUBECTL_EXTERNAL_DIFF="colordiff -N -u"` のような設定が可能になりました。べんり。
- 現在削除されつつあるリソースに `kubectl apply/diff` が実行されるとユーザに警告が表示されるようになりました ([#95544](https://github.com/kubernetes/kubernetes/pull/95544), [SaiHarshaK](https://github.com/SaiHarshaK)) [SIG CLI]
    - :memo: `Warning: Detected changes to resource <object-name> which is currently being deleted.` の警告が標準エラーに出力されます。終了コードに変更はないので安心です。
    - :memo: オブジェクト名のみなので、リソース名があるほうがいい気がします TODO
pod
- `kubectl alpha debug` がベータに昇格し `kubectl debug` になりました ([#96138](https://github.com/kubernetes/kubernetes/pull/96138), [verb](https://github.com/verb)) [SIG CLI and Testing]
- `kubectl debug` は、デバッグ用に Pod をコピーするとき `kubectl set image` の動作と同じ方法でコンテナイメージを変更できるようになりました。詳しくは `kubectl help debug` を参照ください。 ([#96058](https://github.com/kubernetes/kubernetes/pull/96058), [verb](https://github.com/verb)) [SIG CLI]
    - :memo: `--copy-to` フラグを使った場合（コピー Pod を作成する）に、`--set-image` フラグが使えるようになりました。このフラグは `kubectl set image` で使われているもので、`--set-image=app=app:debug,sidecar=sidecar:debug` の記法で Pod のコンテナイメージを変更できます。

### Bug or Regression（バグまたはリグレッション）

- `kubectl wait` に `--ignore-not-found` フラグが追加されました ([#90969](https://github.com/kubernetes/kubernetes/pull/90969), [zhouya0](https://github.com/zhouya0)) [SIG CLI]
    - :memo: これまで `--for=delete` で待ちたいときにすでにオブジェクトが存在しないとエラー（終了ステータス1）になっていましたが、ユーザの期待値としては削除を持っている場合にすでに存在しなければ成功（終了ステータス0）としたいニーズがありました。`--ignore-not-found` フラグを使用すれば、オブジェクトが存在しない場合の終了ステータスが0になります。
- "PVC を使用している" Pod を説明する言葉を変更 ([#95635](https://github.com/kubernetes/kubernetes/pull/95635), [RaunakShah](https://github.com/RaunakShah)) [SIG CLI]
    - :memo: `kubectl describe pvc` の `Mounted by` の項目は、実際にこの PVC をマウントしている Pod をリストするようにみえますが、実際にはそうではなく割当たっていればリストされていたため実態とは異なっていました。この変更で `Mounted by` が `Used by` に変更されています。
- 空の操作をソートした際に失敗しないように修正 ([#94666](https://github.com/kubernetes/kubernetes/pull/94666), [soltysh](https://github.com/soltysh)) [SIG CLI]
    - :memo: これまで `kubectl get --sort-by` オプションで空の要素を指定するとパニックで落ちていたようで、それが修正されました
- `kubectl describe ingress` で正しくない形式で出力されるバグを修正 ([#94985](https://github.com/kubernetes/kubernetes/pull/94985), [howardjohn](https://github.com/howardjohn)) [SIG CLI and Network]
- `kubectl top pod` の出力が `--sort-by` と `--containers` のフラグを一緒に使うとソートされないバグを修正 ([#93692](https://github.com/kubernetes/kubernetes/pull/93692), [brianpursley](https://github.com/brianpursley)) [SIG CLI]
- `kubectl drain` で CPU 使用率が高くなるバグの修正 ([#95260](https://github.com/kubernetes/kubernetes/pull/95260), [amandahla](https://github.com/amandahla)) [SIG CLI]
- Kubectl: プラグイン名の前にフラグがある場合にエラーを出力する ([#92343](https://github.com/kubernetes/kubernetes/pull/92343), [knight42](https://github.com/knight42)) [SIG CLI]
- -v=2 ではなく -v=4 で Go のスタックトレースを出力する ([#94663](https://github.com/kubernetes/kubernetes/pull/94663), [soltysh](https://github.com/soltysh)) [SIG CLI]
- 非常に大きなパッチをコマンドラインで直接記述するのではなく `--patch-file` フラグを使用して `kubectl patch` に指定できるようになりました。 `--patch` フラグと` --patch-file` フラグは相互に排他です。 ([#93548](https://github.com/kubernetes/kubernetes/pull/93548), [smarterclayton](https://github.com/smarterclayton)) [SIG CLI]
- kubectl でカスタムの verbs で Roles と ClusterRoles を作成する際に失敗するのではなく警告を出力するようになりました ([#92492](https://github.com/kubernetes/kubernetes/pull/92492), [eddiezane](https://github.com/eddiezane)) [SIG CLI]
- [kubectl] ローカルファイルが存在しない場合にエラーになるように修正しました ([#90333](https://github.com/kubernetes/kubernetes/pull/90333), [bamarni](https://github.com/bamarni)) [SIG CLI]
    - :memo: これまで `kubectl cp` コマンドで存在しないローカルファイルを指定していても何も起こらずにステータス0で終了していたようです

### Other (そのほか)

- 全てのコマンドの説明（description）に翻訳が適用されるようになりました ([#95439](https://github.com/kubernetes/kubernetes/pull/95439), [HerrNaN](https://github.com/HerrNaN)) [SIG CLI]
- 関数名 `NewCreateCreateDeploymentOptions` が修正されました ([#91931](https://github.com/kubernetes/kubernetes/pull/91931), [lixiaobing1](https://github.com/lixiaobing1)) [SIG CLI]
- kubectl から services のジェネレータが削除されました ([#95256](https://github.com/kubernetes/kubernetes/pull/95256), [Git-Jiro](https://github.com/Git-Jiro)) [SIG CLI]
- `kubectl-convert` プラグインが導入されました ([#96190](https://github.com/kubernetes/kubernetes/pull/96190), [soltysh](https://github.com/soltysh)) [SIG CLI and Testing]
    - :memo: kubectl から `convert` コマンドが削除されましたが、要望が多いために `kubectl-convert` プラグインとして提供されることになったようです
    - :memo: バイナリは提供されていないようにみえるので、k/k から自分でビルドする必要がありそうです
        - `go get -u k8s.io/kubernetes/cmd/kubectl-convert`
- Kubectl: `kubectl autoscale` の `generator` フラグは廃止予定になりました（影響はありません）。将来のリリースで削除されます ([#92998](https://github.com/kubernetes/kubernetes/pull/92998), [SataQiu](https://github.com/SataQiu)) [SIG CLI]
- `kubectl api-resources` は、(`kubectl-api-versions` の出力と同様に `API group/version` のように）API バージョンを出力するようになりました。APIGROUP カラムは APIVERSION に変更されました。 ([#95253](https://github.com/kubernetes/kubernetes/pull/95253), [sallyom](https://github.com/sallyom)) [SIG CLI]
- `kubectl get ingress` は、`extensions/v1beta1`（v1.14 から非推奨）よりも `networking.k8s.io/v1` を優先するようになりました。非推奨のバージョンを明示的にリクエストするには `kubectl get ingress.v1beta1.extensions` を使用します ([#94309](https://github.com/kubernetes/kubernetes/pull/94309), [liggitt](https://github.com/liggitt)) [SIG API Machinery and CLI]

## 所感

`kubectl debug` がベータに昇格したのが大きなトピックです。EphemeralContainers がまだアルファでデフォルトで使用できないことは残念ですが、もうすぐ使用できることに期待できます。

また、ついに `kubectl create ingress` コマンドが追加されました。Ingress は設定が複雑なのでどの程度このコマンドが機能するのか分かりませんが、これで主に使用されるリソースは大体 `kubectl create` で作成できるようになったかなと思います。