Kubernetes 1.10: 既知の問題 (Known Issues) と廃止予定の機能 (Deprecations)

## はじめに

このエントリは、[Kubernetes 1.10 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.10.md#v1100) から既知の問題 (Known Issues) と廃止予定の機能 (Deprecations) についてまとめています。翻訳に合わせて補足を追記しています。その他の内容は次のリンク先を参照してください。

- [Kubernetes 1.10: 主な変更点 (Major Themes)](https://qiita.com/inajob/items/1ecf4d5bacc820839af2)
- [Kubernetes 1.10: Before Upgrading](https://qiita.com/inajob/items/05416143d8c6998ca605)
- Kubernetes 1.10: 既知の問題 (Known Issues) と廃止予定の機能 (Deprecations)

## 既知の問題 (Known Issues)

ここでは Kubernetes 1.10 のリリース時点で確認されている既知の問題を扱います。アップグレードする前に問題内容を把握し、必要であればパッチバージョンリリースでの修正を待ちましょう。

* Volume subPath に関するいくつかの問題があります。
    * hostPath Volume で subPath を利用しているかつ kubelet がダウンしている間にその Pod が削除されると、kubelet の復旧時に subPath のマウントが正常にクリーンアップされない問題があります。([#61446](https://github.com/kubernetes/kubernetes/issues/61446))
    * hostPath Volume で subPath を利用しているかつコンテナ化された kubelet の場合、subPath が正常にマウントされない問題があります。 ([#61456](https://github.com/kubernetes/kubernetes/issues/61456))
        * これらの問題を回避するためには、hostPath Volume に完全なパスを指定します。
    * ConfigMaps, Secrets, DownwardAPI, Projected を利用した Volumes (Atomic writer volumes) でネストされた subPath のマウントが正常に動作しません。 ([#61545](https://github.com/kubernetes/kubernetes/issues/61545))
    * ソケットファイルが subPath から読み込みできません。 ([#61377](https://github.com/kubernetes/kubernetes/issues/61377))
        * 現在これらの問題に取り組んでいます。

* kubeadm は現在 self-hosted デプロイにおいて etcd の証明書を省略しています。これはポイントリリースで修正される予定です ([#61322](https://github.com/kubernetes/kubernetes/issues/61456))

* 一部のユーザ、特にとても大きなクラスタにおいて、kube-controller-manager がメモリを大幅に消費することがあります。([#61041](https://github.com/kubernetes/kubernetes/issues/61041))

## 廃止予定の機能

ここでは Kubernetes 1.10 で廃止予定の API バージョン、オプション、フラグ、引数の概要について扱います。廃止予定とは、将来のリリースでその機能が削除されることを意味します。

* etcd2 バックエンドは廃止予定となり、Kubernetes 1.13 でサポートが削除される予定です。

* VolumeScheduling と LocalPersistentVolume 機能はベータとなりデフォルトで有効になりました。アルファの PersistentVolume NodeAffinity アノテーションは廃止予定となり、将来のリリースで削除される予定です。([#59391](https://github.com/kubernetes/kubernetes/pull/59391), [@msau42](https://github.com/msau42))
    * :memo: `volume.alpha.kubernetes.io/node-affinity` が PersistentVolume NodeAffinity アノテーションです。

* アルファの `Accelerators` feature gate は廃止予定となり、v1.11 で削除される予定です。代わりに [Device Plugins](https://github.com/kubernetes/features/issues/368) を利用してください。`DevicePlugin` feature gate を有効にすることで利用できます。 ([#57384](https://github.com/kubernetes/kubernetes/pull/57384), [@mindprince](https://github.com/mindprince))
    * :memo: `Accelerators` feature gate を無効にすることで `alpha.kubernetes.io/nvidia-gpu` リソースも利用できなくなります。代わりに `DevicePlugin` feature gate の `nvidia.com/gpu` リソースを利用してください。

* `kubectl scale job` は廃止予定になりました。Job オブジェクト以外の全てのスケールはそのまま残りますが、Jobs オブジェクトのスケールは将来のリリースで削除される予定です。 ([#60139](https://github.com/kubernetes/kubernetes/pull/60139), [@soltysh](https://github.com/soltysh))
    * :memo: `kubectl scale` が scale サブリソースを利用するようになったことに伴い (Generic scaler)、scale サブリソースを持つ Deployments などのオブジェクトに加えて CRD などにも対応しました。
    * :memo: 一方で Jobs オブジェクトは scale サブリソースを持たず他のオブジェクトと一貫性がありませんでした。`kubectl scale` がスケールできるオブジェクトは HPA がスケール可能なオブジェクトであるべきという方針で `kubectl scale` による Jobs オブジェクトのスケールは廃止予定になりました。

* kubelet は[ファイルによる設定](https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/)の利用を推奨することから、ファイルにより設定できるフラグは全て廃止される予定です。([#60148](https://github.com/kubernetes/kubernetes/pull/60148), [@mtaufen](https://github.com/mtaufen))

* kubectl の `--show-all` フラグ (Pod にのみ影響し、human readable/non-API プリンタだけ) はデフォルトで有効に設定されるとともに廃止予定になりました。このフラグは終了した状態の Pod を表示するかどうかを指定します。1.11 で変更できなくし、将来のリリースで削除される予定です。 ([#60210](https://github.com/kubernetes/kubernetes/pull/60210), [@deads2k](https://github.com/deads2k))
    * :memo: human readable プリンタは、`kubectl get` コマンドで出力されるAPI レスポンスを人間が読めるように加工するものです。`--show-all` はその human readable プリンタにのみ影響するフラグのため、それを通した結果と `-o name` や `-o yaml` で出力された結果が異なる状況になっていました。
    * :memo: `--show-all` フラグを利用して表示されるようになるのはフェイズが `Succeeded` または `Failed` の Pod です。今回の変更でこれらが常に表示されるようになります。 https://github.com/kubernetes/kubernetes/blob/v1.10.0/pkg/kubectl/resource_filter.go#L40-L55

* kube-controller-manager と cloud-controller-manager のセキュアでない HTTP ポートを使う機能が廃止予定になり、将来のリリースで削除される予定です。代わりに `--secure-port` と `--bind-address` を利用してください。 ([#59582](https://github.com/kubernetes/kubernetes/pull/59582), [@sttts](https://github.com/sttts))

* kube-apiserver のセキュアでない `--insecure-bind-address` と `--insecure-port` フラグが廃止予定になり、将来のリリースで削除される予定です。代わりに `--secure-port` と `--bind-address` を利用してください。 ([#59018](https://github.com/kubernetes/kubernetes/pull/59018), [@hzxuzhonghu](https://github.com/hzxuzhonghu))

* PersistentVolume の `persistentVolumeReclaimPolicy` (再要求ポリシー) の `Recycle` (再利用) が廃止予定になりました。利用者は動的プロビジョニングを代わりに利用してください。 ([#59063](https://github.com/kubernetes/kubernetes/pull/59063), [@ayushpateria](https://github.com/ayushpateria))
    * :memo: PersistentVolumeReclaimPolicy Recycle は、PersistentVolumeClaim によるボリュームの要求がなくなったときに、そのボリューム上で `rm -rf /thevolume/*` を実行します。この方法はエラーが発生しやすく、全ての状況において有効とは限らないことが分かっており、別のユーザに以前のユーザのデータが利用される可能性が残っていました。

* kube-apiserver の `--tls-ca-file` フラグはしばらくの間効果がありませんでした。このフラグは廃止予定となり、1.11 で削除される予定です。もしこのフラグを指定しているなら、1.11 にアップグレードする前に起動時の設定から削除しなければなりません。 ([#58968](https://github.com/kubernetes/kubernetes/pull/58968), [@deads2k](https://github.com/deads2k))
    * :memo: 少なくとも v1.7.6 では既に利用されていないフラグだったようです。 ([#58952](https://github.com/kubernetes/kubernetes/issues/58952))

* PodSecurityPolicy API は `policy/v1beta1` に移動されました。`extensions/v1beta1` の PodSecurityPolicy API グループは廃止され、将来のリリースで削除される予定です。PodSecurityPolicy を利用するための認可 (Authorizations) は、1.11 にアップグレードする前に `policy` API グループを参照するように変更する必要があります。 ([#54933](https://github.com/kubernetes/kubernetes/pull/54933), [@php-coder](https://github.com/php-coder))

* `--enable-admission-plugin`, `--disable-admission-plugin` フラグが追加され、`--admission-control` フラグは廃止予定になりました。分けられたフラグを利用する際に指定された順序は関係ありません。 ([#58123](https://github.com/kubernetes/kubernetes/pull/58123), [@hzxuzhonghu](https://github.com/hzxuzhonghu))
    * :memo: `--enable-admission-plugin` フラグは、デフォルトで有効なプラグインに追加して有効にするプラグインを指定します。`--disable-admission-plugin` フラグは、デフォルトで有効なプラグインから無効にするプラグインを指定します。
        * 1.10.0 時点でデフォルトで有効なプラグインは、`NamespaceLifecycle, LimitRanger, ServiceAccount, PersistentVolumeLabel, DefaultStorageClass, DefaultTolerationSeconds, MutatingAdmissionWebhook, ValidatingAdmissionWebhook, ResourceQuota` です。 [^admission-control-1]
    * :memo: `--admission-control` フラグと `--enable/disable-admission-plugin` フラグは排他です。同時に利用することはできません。 [^admission-control-2]
        * `--admission-control` フラグで明示的にプラグインを指定した場合は、指定したプラグインのみが有効になります。内部的に設定されたデフォルトのプラグインなどは無視されます。 [^admission-control-3]
    * :memo: `--admission-control` フラグと `--enable-admission-plugin` フラグで指定するプラグインの順序は意味がありません。内部的に定義された適切な順序でプラグインが設定されます。 [^admission-control-4]
    * :memo: 1.10.0 時点で利用できるプラグインは https://github.com/kubernetes/kubernetes/blob/v1.10.0/pkg/kubeapiserver/options/plugins.go#L99-L129 です。
    * :memo: ドキュメントに利用が推奨されているプラグイン一覧があります。 https://kubernetes.io/docs/admin/admission-controllers/#is-there-a-recommended-set-of-admission-controllers-to-use
    * :memo: kubeadm はデフォルトで設定するプラグインを独自に定義しており、`NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota` となっています。[^admission-control-5]

[^admission-control-1]: https://github.com/kubernetes/kubernetes/blob/v1.10.0/pkg/kubeapiserver/options/plugins.go#L133-L142
[^admission-control-2]: https://github.com/kubernetes/kubernetes/blob/v1.10.0/pkg/kubeapiserver/options/admission.go#L87-L90
[^admission-control-3]: https://github.com/kubernetes/kubernetes/blob/v1.10.0/pkg/kubeapiserver/options/admission.go#L117-L120
[^admission-control-4]: https://github.com/kubernetes/kubernetes/blob/v1.10.0/pkg/kubeapiserver/options/plugins.go#L63-L97
[^admission-control-5]: https://github.com/kubernetes/kubernetes/blob/v1.10.0/cmd/kubeadm/app/phases/controlplane/manifests.go#L48

* Pod 内の全てのコンテナでプロセスネームスペースを共有して Docker コンテナを実行する kubelet の `--docker-disable-shared-pid` フラグは廃止予定となり、将来のリリースで削除される予定です。この挙動の設定は `v1.Pod.Spec.ShareProcessNamespace` に置き換えられます。この設定はアルファで `--feature-gates=PodShareProcessNamespace=true` で有効になります。 ([#58093](https://github.com/kubernetes/kubernetes/pull/58093), [@verb](https://github.com/verb))
    * :memo: Container Runtime Interface (CRI) は、Docker 1.13.1 以上の際に Pod のコンテナでプロセスネームスペースをデフォルトで共有することから、それ以前のプロセスネームスペースが分離されている状態に戻すために `--docker-disable-shared-pid` がデフォルトで有効に設定されています。

* kubelet の cadvisor ポートは廃止予定になりました。1.12 でデフォルトが 0 (無効) に変更され、1.13 で cadvisor ポートが削除される予定です。 ([#59827](https://github.com/kubernetes/kubernetes/pull/59827), [@dashpole](https://github.com/dashpole))

* rktnetes は rktlet の利用を推奨することから廃止される予定です。詳しくは https://github.com/kubernetes-incubator/rktlet を参照してください。 ([#58418](https://github.com/kubernetes/kubernetes/pull/58418), [@yujuhong](https://github.com/yujuhong))

* kubelet は、全てのコマンドラインフラグを明示的に内部の flagset に登録します。これによりサードパーティのライブラリからフラグが意図せずに kubelet のコマンドライン API に漏れることを防ぎます。意図せず流出される多くのフラグは廃止予定とマークされ、それらのフラグが削除される前にマイグレートすることもできます。加えて以前流出した `--cloud-provider-gce-lb-src-cidrs` フラグは、kubelet のコマンドライン API から完全に削除されました。これは kubelet の操作と関係がないためです。([#57613](https://github.com/kubernetes/kubernetes/pull/57613), [@mtaufen](https://github.com/mtaufen))
    * :memo: flagset というのは Go の flag パッケージの FlagSet タイプのことで、グローバルな flagset はさまざまなライブラリが利用するため、意図しないところで値が晒される可能性があるため、グローバルではなく内部 (internal) の flagset を利用することでそれを防ぐ変更です。
      * 廃止されるフラグは以下のとおりです。 
      * --application_metrics_count_limit
      * --boot_id_file
      * --container_hints
      * --containerd
      * --docker
      * --docker_env_metadata_whitelist
      * --docker_only
      * --docker-tls
      * --docker-tls-ca
      * --docker-tls-cert
      * --docker-tls-key
      * --enable_load_reader
      * --event_storage_age_limit
      * --event_storage_event_limit
      * --global_housekeeping_interval
      * --google-json-key
      * --log_cadvisor_usage
      * --machine_id_file
      * --storage_driver_user
      * --storage_driver_password
      * --storage_driver_host
      * --storage_driver_db
      * --storage_driver_table
      * --storage_driver_secure
      * --storage_driver_buffer_duration

* `cloud-provider` サービスアカウントのブートストラップの RBAC role と rolebinding は、廃止予定になりました。もしこのサービスアカウントを利用している場合は、新しいクラスタで自身で [RBAC ポリシー](https://kubernetes.io/docs/admin/authorization/rbac/)を作成、適応しなければいけません。 ([#59949](https://github.com/kubernetes/kubernetes/pull/59949), [@nicksardo](https://github.com/nicksardo))

* `/swagger.json` や `/swagger-2.0.0.0.json` のような OpenAPI spec の区切られたフォーマットのエンドポイントは廃止予定になりました。古いエンドポイントは 1.10, 1.11, 1.12 まではそのままで、1.14 で削除される予定です。代わりに適切な Accept: ヘッダとともに単一の `/openapi/v2` エンドポイントを利用してください。例えば以下のとおりです。 ([#59293](https://github.com/kubernetes/kubernetes/pull/59293), [@roycaihw](https://github.com/roycaihw))

| 以前                        | v1.10                                                                                                       |
|-----------------------------|-------------------------------------------------------------------------------------------------------------|
| GET /swagger.json           | GET /openapi/v2<br>Accept: application/json                                                                 |
| GET /swagger-2.0.0.pb-v1    | GET /openapi/v2<br>Accept: application/com.github.proto-openapi.spec.v2@v1.0+protobuf                       |
| GET /swagger-2.0.0.pb-v1.gz | GET /openapi/v2<br>Accept: application/com.github.proto-openapi.spec.v2@v1.0+protobuf Accept-Encoding: gzip |