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

## はじめに

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

- [Kubernetes 1.13: Urgent Upgrade Notes](https://qiita.com/yuanying/items/8ae975137b01ea77b089)
- Kubernetes 1.13: 既知の問題 (Known Issues) と 廃止予定の機能 (Deprecations)
- [Kubernetes 1.13: 主な変更点 (Major Themes)](https://qiita.com/shmurata/items/9f02ac6bf62cebdd51bb)
- [Kubernetes 1.13: 新機能 (New features)](https://qiita.com/shmurata/items/a7d5652ed929675b6e28)

## 既知の問題 (Know Issues)
- kubelet はドライバの失敗によりプラグインの登録が失敗したとしても、登録を再試行しません。ドライバは kubelet がドライバの登録を再度試みるように、ドライバ登録用のソケットを削除し、再作成する必要があります。単にドライバのコンテナの再起動を行うだけではソケットの再作成のための十分なトリガーにならない可能性があるため、Pod の再起動が必要かもしれません。([#71487](https://github.com/kubernetes/kubernetes/issues/71487))
<blockquote style='color: white; font-size: 90%;'><div>:pencil: **Note**</div> 現状、kubelet のプラグインは [監視下のディレクトリにおける inotify events](https://github.com/kubernetes/kubernetes/tree/master/pkg/kubelet/util/pluginwatcher) をトリガーにして登録が行われているのですが、プラグインの登録に失敗した際に、リトライを試みるトリガーが必要なため、ソケットファイルの再作成が必要なようです。参照先の issue では、他の Kubernetes のコンポーネントと同じようにバックオフを伴ったリトライを行うべきであるとしています。</blockquote>

-   いくつかのケースにおいて、Flex volume のリサイズは、(もしそのリサイズが成功したとしても) 不正確な　”Resizing Condition” の情報を持った PVC を残してしまいます。ユーザは、もしその情報が必要でなかった場合、削除しても構いません。([#71470](https://github.com/kubernetes/kubernetes/issues/71470))
<blockquote style='color: white; font-size: 90%;'><div>:pencil: **Note**</div> おそらく、`PVC`　中に `.status.conditions` の `Resizing` / `FileSystemResizePending` が残ったままの状態になっていることがある、ということだと思われます。リサイズが終わったあとでこの情報が残ったままであった場合は、`kubectl edit` などで安全に取り除けるようです。</blockquote>

- CSI driver-registrar サイドカーコンテナの v1.0.0-rc2 はいくつかの場合に置いて起動に1分以上かかることが知られています。この問題は将来のサイドカーコンテナのリリースで解決されると考えています。解決されたかどうかは、このサイドカーコンテナの将来のリリースノートをご確認ください。([#76](https://github.com/kubernetes-csi/driver-registrar/issues/76))

- IPV6-only を使っている場合は、kube-proxy の `proxy-mode=iptables` を使ってください。`proxy-mode=ipvs` は動作しないことが知られています。([#68437](https://github.com/kubernetes/kubernetes/issues/68437))

## 廃止予定の機能 (Deprecations)

-    kube-apiserver

  - `--service-account-api-audiences` は非推奨です。代わりに `--api-audiences` フラグを利用してください。このフラグはまだ警告とともに利用可能ですが、将来のリリースで削除されます。([#70105](https://github.com/kubernetes/kubernetes/pull/70105), [@mikedanese](https://github.com/mikedanese))

  - `--experimental-encryption-provider-config` は非推奨です。代わりに `--encryption-provider-config` フラグを利用してください。このフラグはまだ警告とともに利用可能ですが、1.14 で削除されます。([#71206](https://github.com/kubernetes/kubernetes/pull/71206), [@stlaz](https://github.com/stlaz))

  - etcd 暗号化機能のベータ移行の一環として、設定ファイルは `--encryption-provider-config` によって参照されるようになり、 `kind: EncryptionConfiguration` と `apiVersion: apiserver.config.k8s.io/v1`　を利用することになります。`kind: EncryptionConfig` と `apiVersion: v1`　のサポートは非推奨となり、将来のリリースで削除されます。 ([#67383](https://github.com/kubernetes/kubernetes/pull/67383), [@stlaz](https://github.com/stlaz))

  - `--deserialization-cache-size` フラグは非推奨です、将来のリリースで削除されます。etcd2 のストレージバックエンドが削除されたため、このフラグは何もしません。([#69842](https://github.com/kubernetes/kubernetes/pull/69842), [@liggitt](https://github.com/liggitt))

  - `Node` authorization モードは kubelet が自身の Node API オブジェクトを削除することを許可しなくなりました。(1.11以前は、Cloud Provider の node ID 変更に関連した特殊な状況下で、kubelet が自身の Node オブジェクトを起動時に、削除および再作成を試みていました。) ([#71021](https://github.com/kubernetes/kubernetes/pull/71021), [@liggitt](https://github.com/liggitt))

  - ビルトインの `system:csi-external-provisioner` と `system:csi-external-attacher`　ClusterRole は非推奨となり、将来のリリースでは自動で作成されなくなります。CSI の各ドライバは自身で必要な権限を持った RBAC リソースを作成するようにしてください。([#69868](https://github.com/kubernetes/kubernetes/pull/69868), [@pohly]( https://github.com/pohly))

  - ビルトインの　`system:aws-cloud-provider`ClusterRole は非推奨となり、将来のリリースでは自動で作成されなくなります。AWSクラウドプロバイダを利用しているシステムは、`kube-system` ネームスペースの`aws-cloud-provider` サービスアカウントに対して必要な権限を与えてください。 ([#66635](https://github.com/kubernetes/kubernetes/pull/66635), [@wgliang](https://github.com/wgliang))

- kubelet

  - kubelet plugin の登録時に使われているベータの plugin registration ディレクトリである`{kubelet_root_dir}/plugins/`ディレクトリの利用は非推奨になりました、`{kubelet_root_dir}/plugins_registry/`を利用してください。古いディレクトリのサポートは v1.15 で削除が予定されています。デバイスプラグインおよび CSI ストレージドライバは v1.15 の前に新しいディレクトリに移行してください。CSI ストレージドライバの 0.x バージョンのみがこの古いディレクトリを利用することが許可されています。([#70494](https://github.com/kubernetes/kubernetes/pull/70494) by [@RenaudWasTaken](https://github.com/RenaudWasTaken) and [#71314](https://github.com/kubernetes/kubernetes/pull/71314) by [@saad-ali](https://github.com/saad-ali))

  - CSI 1.0 API のリリースとともに、0.3 を使っている CSI ドライバーと古い CSI APIリリースのサポートを非推奨とします。これらは Kubernetes v1.15 で削除が予定されています。CSI ドライバはCSI 1.0 APIを利用するようアップデートし、クラスタ内の全てのノードが 1.13 以上になり次第、新しい kubelet plugin の登録ディレクトリ (`{kubelet_root_dir}/plugins_registry/`) に配備してください。

  - `kubernetes.io/`　と `k8s.io/`プレフィックスのついたラベルを `--node-labels` を利用して設定した場合、将来のリリースで `NodeRestriction` admission プラグインの制限の対象となります。許可されるラベルについては　[admission plugin](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#noderestriction) のドキュメントをご覧ください。([#68267](https://github.com/kubernetes/kubernetes/pull/68267), [@liggitt](https://github.com/liggitt))
 <blockquote style='color: white; font-size: 90%;'><div>:pencil: **Note**</div> `NodeRestriction` addmission プラグイン は `kubelet` に対して Node や Pod リソースに対する権限を制限するプラグインです。`kubelet` 起動時に `--node-labels` をつけることでノードにラベルをつけることができるのですが、`kubernetes.io/`　と `k8s.io/`プレフィックスのついたラベルに関しては自由につけることができず、これから許可されたり制限されたりするとのことです。(例えば `k8s.io/hoge` は ok だけど `k8s.io/fuga` は無理など。) その制限内容はまだ決まっていないようなので、適当にラベルをつける場合はこのようなプレフィックスを避けるのが無難でしょう。</blockquote>

- kube-scheduler

  - アルファの　critical pod annotation (`scheduler.alpha.kubernetes.io/critical-pod`) は非推奨になりました。Pod に "critical" と印をつけるのではなく、Pod priorityを使うべきです。([#70298](https://github.com/kubernetes/kubernetes/pull/70298), [@bsalamat](https://github.com/bsalamat))

- 以下の機能が GA となりました。それに伴い、関連した Feature gates が非推奨となり将来のリリースで削除されます。
  - CSIPersistentVolume
  - GCERegionalPersistentDisk
  - [KubeletPluginsWatcher](https://github.com/kubernetes/kubernetes/tree/master/pkg/kubelet/util/pluginwatcher)
  - VolumeScheduling

- kubeadm
  - DynamicKubeletConfig feature gate が非推奨になりました。機能は `kubeadm alpha kubelet enable-dynamic` コマンドでまだ利用することができます。
  - `kubeadm config print-defaults`　は非推奨になりました。代わりに `kubeadm config print init-defaults` と `kubeadm config print join-defaults`　を利用してください。([#69617](https://github.com/kubernetes/kubernetes/pull/69617), [@rosti](https://github.com/rosti))
  - `v1alpha3` の設定ファイルフォーマットのサポートは非推奨となり、1.14 で削除されます。`kubeadm config migrate` を利用して `v1alpha3` の設定ファイルを `v1beta1` に移行してください。`v1beta1` にはイメージレポジトリの管理やアドオンの設定などの改善が含まれています。詳しくは`v1beta1` の [ドキュメントを参照](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1) してください。

- CSI volumes の　`node.status.volumes.attached.devicePath`　フィールドは非推奨です、将来のリリースでは設定されなくなります。([#71095](https://github.com/kubernetes/kubernetes/pull/71095), [@msau42](https://github.com/msau42))

- kubectl
  - `kubectl convert` コマンドは非推奨になりました、将来のリリースで削除されます。([#70820](https://github.com/kubernetes/kubernetes/pull/70820), [@seans3](https://github.com/seans3))

- e2e テスト実行時の未定義なプロバイダ名の指定のサポートは非推奨となりました、将来のリリースで削除されます。代わりに SSH アクセスをしない場合は `--provider=skeleton` を、ローカルクラスターに対して SSH　アクセスを行う場合は `--provider=local` を指定してください。([#70141](https://github.com/kubernetes/kubernetes/pull/70141), [@pohly](https://github.com/pohly))
<blockquote style='color: white; font-size: 90%;'><div>:pencil: **Note**</div>  リリースノートにはこう書いてあるものの、 `local` と `skelton` の差が謎。[定義](https://github.com/kubernetes/kubernetes/blob/release-1.13/test/e2e/framework/provider.go#L48-L61)と [SSH 関連の実装](https://github.com/kubernetes/kubernetes/blob/release-1.13/test/e2e/framework/util.go#L3612-L3632) は以下のようになっているようだが…。

```golang
RegisterProvider("local", func() (ProviderInterface, error) {
	return NullProvider{}, nil
})
RegisterProvider("skeleton", func() (ProviderInterface, error) {
	return NullProvider{}, nil
})
```
```golang
switch provider {
case "gce", "gke", "kubemark":
    keyfile = "google_compute_engine"
case "aws":
    // If there is an env. variable override, use that.
    aws_keyfile := os.Getenv("AWS_SSH_KEY")
    if len(aws_keyfile) != 0 {
        return sshutil.MakePrivateKeySignerFromFile(aws_keyfile)
    }
    // Otherwise revert to home dir
    keyfile = "kube_aws_rsa"
case "local", "vsphere":
    keyfile = os.Getenv("LOCAL_SSH_KEY") // maybe?
    if len(keyfile) == 0 {
        keyfile = "id_rsa"
    }
case "skeleton":
    keyfile = os.Getenv("KUBE_SSH_KEY")
    if len(keyfile) == 0 {
        keyfile = "id_rsa"
    }
default:
    return nil, fmt.Errorf("GetSigner(...) not implemented for %s", provider)
}
```
</blockquote>