Kubernetes 1.14: Urgent Upgrade Notes, Deprecations, Removed and deprecated metrics, API Changes

[Kubernetes 1.14 の Changelog](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.14.md#v1140) の  Urgent Upgrade Notes, Deprecations, Removed and deprecated metrics, API Changes についてまとめました。

## Urgent Upgrade Notes

### アップグレード前に読むべきもの

#### kube-apiserver
- デフォルトの RBAC ポリシーで、*未認証 (unauthenticated)* ユーザに対してディスカバリとパーミッションチェックの API (`kubectl auth can-i` で利用)のアクセスを許可しなくなりました。アップグレードされたクラスタは以前の許可設定が引き継がれますが、新クラスタで設定でも引き続きアクセス許可を行いたい場合、以下のコマンドで設定できます。
  - `kubectl create clusterrolebinding anonymous-discovery --clusterrole=system:discovery --group=system:unauthenticated`
  - `kubectl create clusterrolebinding anonymous-access-review --clusterrole=system:basic-user --group=system:unauthenticated`
  - :memo: [CVE-2018-1002105](https://qiita.com/yuanying/items/f2dd6ac8252cb87860f7) の脆弱性の post-mortem で [RBAC の Discovery ロールを見直す](https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/0034-20190123-harden-default-discovery-bindings.md) という話が出たようです
- deprecated だった `--storage-versions` フラグが削除されました。ストレージバージョンは常に kube-apiserver バイナリにビルトインされたものが使われます ([#67678](https://github.com/kubernetes/kubernetes/pull/67678), [@caesarxuchao](https://github.com/caesarxuchao))
- deprecated だった `--repair-malformed-updates` フラグが削除されました。 ([#73663](https://github.com/kubernetes/kubernetes/pull/73663), [@danielqsj](https://github.com/danielqsj))
- `/openapi/v2` スキーマ によって置き換えられたため、1.7 から deprecated となっていた `/swaggerapi/*` のスキーマは削除されました ([#72924](https://github.com/kubernetes/kubernetes/pull/72924), [@liggitt](https://github.com/liggitt))
- `/openapi/v2` スキーマ によって置き換えられたため、v1.10 から deprecated になっていた `/swagger.json` と `/swagger-2.0.0.pb-v1` のスキーマは削除されました ([#73148](https://github.com/kubernetes/kubernetes/pull/73148), [@liggitt](https://github.com/liggitt))
-  `kube-apiserver` は [aggregated された API サーバー](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) の `/openapi/v2` エンドポイントの openapi スキーマのみを集約するようになりました。 `/swagger.json` にフォールバックして集約する仕組みは削除されました。aggregated された API サーバーがスキーマを `/openapi/v2` (v1.10 から使える) で提供していることを確認してください ([#73441](https://github.com/kubernetes/kubernetes/pull/73441), [@roycaihw](https://github.com/roycaihw))
- 1.9 から deprecated となっている "io.k8s.kubernetes.pkg" のプレフィクスで始まる OpenAPI の定義が削除されました。 ([#74596](https://github.com/kubernetes/kubernetes/pull/74596), [@sttts](https://github.com/sttts))
- `ValidateProxyRedirects` 機能はベータとなりデフォルトで有効になりました。この機能は API サーバーが同じ host に対してのリダイレクトだけを許可するように制限するものです。もし、ノードが API サーバーがリクエストしたホストのインタフェースと別のインタフェースから CRI のストリーミングリクエストに返答するようになっていた場合はうまく動作しません(ビルトインの dockershim を利用せずに、kubelet の `--redirect-container-streaming=true` を設定したときのみ起こり得る)。その場合、ノードの設定を修正するまで、この機能を一時的に無効にすることができます。問題を避けるため kubelet では `--redirect-container-streaming=false` の設定をいれると良いでしょう ([#72552](https://github.com/kubernetes/kubernetes/pull/72552), [@tallclair](https://github.com/tallclair))

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

#### kubelet
- deprecated だった `--experimental-fail-swap-on` フラグが削除されました ([#69552](https://github.com/kubernetes/kubernetes/pull/69552), [@Pingan2017](https://github.com/Pingan2017))
  - :memo:`--fail-swap-on"` という正式版のフラグで引き続き設定できます。ノードの swap が有効のときに kubelet を起動させないフラグで、デフォルトで有効になっています。
- HTTPGetAction を指定したヘルスチェック(liveness & readiness) の probe は異なるホスト名のリダイレクトを処理しないようになりました。代わりにローカルでないリダイレクトは成功として扱われます(ドキュメントに記載されている挙動)。この場合、"ProbeWarning" という reason のイベントが生成され、リダイレクトが無視されたことが示されます。もし別のエンドポイントへのリダイレクトに依存していた場合、リダイレクトではなくプロクシーするような kubelet の外でヘルスチェックをするためのロジックが必要となります ([#75416](https://github.com/kubernetes/kubernetes/pull/75416), [@tallclair](https://github.com/tallclair))
  - :memo: [liveness/readiness probe のドキュメントでは](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/)、もともと 200以上、400未満のステータスコードが成功と記載されていました

#### client-go
- deprecated だったバージョンなしの API グループのアクセッサ (例えば `clientset.Apps()`)は削除されました。明示的なバージョンの方 (例えば `clientset.AppsV1()`) を利用してください。([#74422](https://github.com/kubernetes/kubernetes/pull/74422), [@liggitt](https://github.com/liggitt))
- disk-cached discovery のクライアントが k8s.io/client-go/discovery から k8s.io/client-go/discovery/cached/disk に移動しました。memory-cached discovery のクライアントが k8s.io/client-go/discovery/cached から k8s.io/client-go/discovery/cached/memory に移動しました ([#72214](https://github.com/kubernetes/kubernetes/pull/72214), [@caesarxuchao](https://github.com/caesarxuchao))

#### kubeadm
- `kubeadm alpha preflight` と `kubeadm alpha preflight node` が削除されました。代わりに `kubeadm join phase preflight` を利用してください ([#73718](https://github.com/kubernetes/kubernetes/pull/73718), [@fabriziopandini](https://github.com/fabriziopandini))


#### その他
- deprecated だった taint `node.alpha.kubernetes.io/notReady` と `node.alpha.kubernetes.io/unreachable` はサポートされなくなりました。代わりに `node.kubernetes.io/not-ready` と `node.kubernetes.io/unreachable` を利用してください。 ([#73001](https://github.com/kubernetes/kubernetes/pull/73001), [@shivnagarajan](https://github.com/shivnagarajan))
- Prometheus のクエリで `pod_name` と `container_name` のラベル(cadvisor か kubelet probe のメトリクス) を使っているものは、代わりに `pod` と `container` を使うようにしてください。`pod_name` と `container_name` ラベルは `pod` and `container` ラベルとともに移行期間は存在しますが、将来的に削除されます。([#69099](https://github.com/kubernetes/kubernetes/pull/69099), [@ehashman](https://github.com/ehashman))
  - :memo: [Kubernetes Metrics Overhaul](https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/0031-kubernetes-metrics-overhaul.md) というメトリクス見直しの一貫で、一貫性をもったラベル名に統一されました。いままではメトリクスによって `pod_name` と `pod` 別のラベルが使われており、同時に使う場合は label_replace を使った workaround が必要でした。

## Deprecations

#### kubectl
- `kubectl convert` が deprecated になり、v1.17 で削除予定です
- `kubectl get` の `--export`フラグ が deprecated になり、 v1.18 で削除予定です ([#73787](https://github.com/kubernetes/kubernetes/pull/73787), [@soltysh](https://github.com/soltysh))

#### kubelet
- OS とアーキテクチャの情報が Node の `kubernetes.io/os` と `kubernetes.io/arch` ラベルに記録されるようになりました。以前までのラベル (`beta.kubernetes.io/os` and `beta.kubernetes.io/arch`) はまだ記録されますが、deprecated となり v1.18 で削除されます ([#73333](https://github.com/kubernetes/kubernetes/pull/73333), [@yujuhong](https://github.com/yujuhong))
  - `--containerized` フラグが deprecated になり将来のリリースで削除されます ([#74267](https://github.com/kubernetes/kubernetes/pull/74267), [@dims](https://github.com/dims))


#### hyperkube
- `--make-symlinks` フラグが deprecated になり将来のリリースで削除されます ([#74975](https://github.com/kubernetes/kubernetes/pull/74975), [@dims](https://github.com/dims))

#### API
- Ingress リソースが  `networking.k8s.io/v1beta1` で有効になりました。`extensions/v1beta1` の Ingress リソースは deprecated となり v1.18 以降は提供されなくなります。既存の永続化されたデータは 新しい API グループ/バージョンでも取得できます ([#74057](https://github.com/kubernetes/kubernetes/pull/74057), [@liggitt](https://github.com/liggitt))
- v1.16 から NetworkPolicy リソースは `extensions/v1beta1` では提供されなくなります。v1.8 からある `networking.k8s.io/v1` を利用するように変更してください。既存の永続化されたデータは `networking.k8s.io/v1` からも取得できます。
- v1.16 から PodSecurityPolicy リソースは `extensions/v1beta1` では提供されなくなります。v1.10 からある `policy/v1beta1` を利用するように変更してください。既存の永続化されたデータは `policy/v1beta1` からも取得できます。
- v1.16 から DaemonSet, Deployment, ReplicaSet リソースは `extensions/v1beta1`, `apps/v1beta1`, `apps/v1beta2` では提供されなくります。v1.9 からある `apps/v1` に以降してください。既存の永続化されたデータは `apps/v1` からも取得できます。
- PriorityClass リソースが `scheduling.k8s.io/v1` に昇格しました。 `scheduling.k8s.io/v1beta1` と `scheduling.k8s.io/v1alpha1` は deprecated になり、v1.17 から無効になります。 ([#73555](https://github.com/kubernetes/kubernetes/pull/73555), [#74465](https://github.com/kubernetes/kubernetes/pull/74465), [@bsalamat](https://github.com/bsalamat))
- list API コールの `export` クエリパラメタは deprecated になり v1.18 で削除されます ([#73783](https://github.com/kubernetes/kubernetes/pull/73783), [@deads2k](https://github.com/deads2k))

:memo: リソースバージョンのまとめ

旧バージョンのカッコは提供されなくなる Kubernetes のバージョンです。

リソース | 新バージョン | 旧バージョン
--- | --- | --- | ---
Ingress | networking.k8s.io/v1beta1 | extensions/v1beta1 (v1.18)
NetworkPolicy | networking.k8s.io/v1 | extensions/v1beta1 (v1.16)
PodSecurityPolicy | policy/v1beta1 |  extensions/v1beta1 (v1.16)
DaemonSet | apps/v1 | extensions/v1beta1, apps/v1beta1, apps/v1beta2 (v1.16)
Deployment | apps/v1 | extensions/v1beta1, apps/v1beta1, apps/v1beta2 (v1.16)
ReplicaSet | apps/v1 | extensions/v1beta1, apps/v1beta1, apps/v1beta2 (v1.16)
PriorityClass | scheduling.k8s.io/v1 | scheduling.k8s.io/v1beta1, scheduling.k8s.io/v1alpha1 (v1.17)


#### その他
- 以下の機能が GA になりました。関連する feature gate は deprecated となり v1.15 で削除されます
  - `CustomPodDNS`
  - `HugePages`
  - `MountPropagation`
  - `PersistentLocalVolumes`
- CoreDNS: 以下のディレクティブまたはキーワードは deprecated となり、v1.15 で削除されます
  - `kubernetes` プラグインの `upstream` オプション。v1.15 ではデフォルトの挙動になります
  - `proxy` プラグイン。`forward` プラグインに置き換えられます

## 削除または deprecated となったメトリクス

### 削除されたメトリクス

- `reflector_items_per_list`
- `reflector_items_per_watch`
- `reflector_last_resource_version`
- `reflector_list_duration_seconds`
- `reflector_lists_total`
- `reflector_short_watches_total`
- `reflector_watch_duration_seconds`
- `reflector_watches_total`

:memo: これらのメトリクス([reflector metrrics](https://github.com/kubernetes/kubernetes/blob/v1.13.0/pkg/util/reflector/prometheus/prometheus.go))はラベルが動的に生成されるため、kubelet のメモリリークの原因となっていました。このメトリクスをモニタリングに使うのは難しかったという理由もあり削除されました。
参考: [Remove reflector metrics since they are causing a memory leak #74636](https://github.com/kubernetes/kubernetes/pull/74636)

### deprecated となったメトリクス

- `rest_client_request_latency_seconds` -> `rest_client_request_duration_seconds`
- `apiserver_proxy_tunnel_sync_latency_secs` -> `apiserver_proxy_tunnel_sync_duration_seconds`
- `scheduler_scheduling_latency_seconds` -> `scheduler_scheduling_duration_seconds`
- `kubelet_pod_worker_latency_microseconds` -> `kubelet_pod_worker_duration_seconds`
- `kubelet_pod_start_latency_microseconds` -> `kubelet_pod_start_duration_seconds`
- `kubelet_cgroup_manager_latency_microseconds` -> `kubelet_cgroup_manager_duration_seconds`
- `kubelet_pod_worker_start_latency_microseconds` -> `kubelet_pod_worker_start_duration_seconds`
- `kubelet_pleg_relist_latency_microseconds` -> `kubelet_pleg_relist_duration_seconds`
- `kubelet_pleg_relist_interval_microseconds` -> `kubelet_pleg_relist_interval_seconds`
- `kubelet_eviction_stats_age_microseconds` -> `kubelet_eviction_stats_age_seconds`
- `kubelet_runtime_operations` -> `kubelet_runtime_operations_total`
- `kubelet_runtime_operations_latency_microseconds` -> `kubelet_runtime_operations_duration_seconds`
- `kubelet_runtime_operations_errors` -> `kubelet_runtime_operations_errors_total`
- `kubelet_device_plugin_registration_count` -> `kubelet_device_plugin_registration_total`
- `kubelet_device_plugin_alloc_latency_microseconds` -> `kubelet_device_plugin_alloc_duration_seconds`
- `docker_operations` -> `docker_operations_total`
- `docker_operations_latency_microseconds` -> `docker_operations_latency_seconds`
- `docker_operations_errors` -> `docker_operations_errors_total`
- `docker_operations_timeout` -> `docker_operations_timeout_total`
- `network_plugin_operations_latency_microseconds` -> `network_plugin_operations_latency_seconds`
- `sync_proxy_rules_latency_microseconds` -> `sync_proxy_rules_latency_seconds`
- `apiserver_request_count` -> `apiserver_request_total`
- `apiserver_request_latencies` -> `apiserver_request_latency_seconds`
- `apiserver_request_latencies_summary` -> `apiserver_request_latency_seconds`
- `apiserver_dropped_requests` -> `apiserver_dropped_requests_total`
- `etcd_helper_cache_hit_count` -> `etcd_helper_cache_hit_total`
- `etcd_helper_cache_miss_count` -> `etcd_helper_cache_miss_total`
- `etcd_helper_cache_entry_count` -> `etcd_helper_cache_entry_total`
- `etcd_request_cache_get_latencies_summary` -> `etcd_request_cache_get_latency_seconds`
- `etcd_request_cache_add_latencies_summary` -> `etcd_request_cache_add_latency_seconds`
- `etcd_request_latencies_summary` -> `etcd_request_latency_seconds`
- `transformation_latencies_microseconds` -> `transformation_latencies_seconds`
- `data_key_generation_latencies_microseconds` -> `data_key_generation_latencies_seconds`

:memo: [Kubernetes Metrics Overhaul](https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/0031-kubernetes-metrics-overhaul.md) という Kubernetes のメトリクスの見直しがあり、一貫性を持ったメトリクス名に変更されました。

## API Changes

- [CRI] `PodSandbox` と `PodSandboxStatus` に `runtime_handler` という Pod の `RuntimeClass` の情報をトラックするためのフィールドが追加されました ([#73833](https://github.com/kubernetes/kubernetes/pull/73833), [@haiyanmeng](https://github.com/haiyanmeng))