Kubernetes 1.11: Before Upgrading

# はじめに

このエントリは、[Kubernetes 1.11 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.11.md) から Before Upgrading についてまとめています。翻訳に合わせて補足を追記しています。その他の内容は次のリンク先を参照してください。

- [Kubernetes 1.11: 主な変更点 (Major Themes) Part.1](https://qiita.com/watawuwu/items/405fc3161e52d4a4b46e)
- [Kubernetes 1.11: 主な変更点 (Major Themes) Part.2](https://qiita.com/yuanying/items/a19541b402d5f24a1c20)
- [Kubernetes 1.11: Urgent Upgrade Notes と 既知の問題 (Known Issues)](https://qiita.com/shmurata/items/cffbcde7ec38c07e7d74)
- Kubernetes 1.11: Before Upgrading
- [Kubernetes 1.11: 廃止予定の機能 (Deprecations) と 新機能 (New alpha features)](https://qiita.com/takuhiro/items/02dece392971d8cad158)

# Kubernetes 1.11: Before Upgrading

## Before Upgrading

ここでは 1.11 にアップグレードする前に確認しておくべき問題を扱います。アップグレードする前に内容を確認してアップグレード後に問題が発生しないようにしましょう。

- `metav1.Status` を返すとき、audit.Event のステータスにコピーされなくなりました。`status` と `reason`, `code` のみが設定されます。例えば `kubectl get pods abc` を実行したとき API Server は ```{"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"pods \"abc\" not found","reason":"NotFound","details":{"name":"abc","kind":"pods"},"code":404}``` を返します。 前のバージョンではこのオブジェクト全体がAudit eventに記録されていました。1.11 からは `status` と `reason`, `code` のみが記録されます。古いバージョンに依存するコードがある場合は修正する必要があります。([#62695](https://github.com/kubernetes/kubernetes/pull/62695))
- HTTP transportは `dial` メソッドを利用せず `context.Context`を使用するようになりました。 そのため、`k8s.io/client-go/transport/Config` structが更新され、 `context.Context`パラメータを持つ関数を受け入れるようになりました。 これは破壊的な変更なので、このフィールドを直接利用しているコードがある場合は注意してください。([#60012](https://github.com/kubernetes/kubernetes/pull/60012))
    - :memo: これは `net/http/Transport.Dial` field が deprecated になったため、`DialContext` を利用するように切り替えた影響によるものです。
- kubectl が `apps/v1` API を要求するようになりました。そのため 1.9 より古いクラスタでは動作しなくなります。kubectl は +/-1 のマイナーバージョンに対する互換性しか保証しないので注意してください。([#61419](https://github.com/kubernetes/kubernetes/pull/61419))
- Podプライオリティとプリエンプションがデフォルトで有効になりました。この機能を使う予定がなくとも、アップグレード後即座にこの機能が働くため何らかのアクションを行う必要があります。マルチテナントですべてのユーザが信用できない場合は、2つのデフォルトプライオリティクラス(system-cluster-critical, system-node-critical)に対してQuotaを割り当てることをおすすめします。クラスタのすべてのユーザが信用できない場合、これらの優先順位でユーザが Pod を作成するのを制限するために、 `ResourceQuota` を作成する必要があります。重要なシステムポッドはクラスタがリソース圧迫状態にあるときにプリエンプションする機能がこの機能に依存しているため、この機能を無効にすることは非推奨です。
- 1.10 よりマウント・プロパゲーションのデフォルトが HostToContainer(Linux では rslave) になりましたが、いくつかの環境で問題があることがわかったため None (Linux では private) にデフォルトが戻されました。この動作に依存している場合は、明示的に設定する必要があります。([#62462](https://github.com/kubernetes/kubernetes/pull/62462))
- kube-apiserver から `--storage-version` フラグが削除されました。代わりに `--storage-versions` を利用してください。([#61453](https://github.com/kubernetes/kubernetes/pull/61453))
- Aggregated API Server の機能を利用している場合は、kube-apiserver によって行われている認可に依存してはならず、委任された認可を追加して行う必要があります。([#61349](https://github.com/kubernetes/kubernetes/pull/61349))
    - :memo: API Serverは認証Proxyであって認可Proxyではないためそこに依存しないようにしてほしいようです。 Aggregated API Server の機能を利用する場合は注意しましょう。
- GC は QPS で制限するようになりました。これを避けるために QPSを上げる必要がある場合は明示的に指定する必要があります。([#63657](https://github.com/kubernetes/kubernetes/pull/63657))
- `kubeadm join` コマンドは TLS Bootstrap による設定の処理の完了を待つようになりました。以前は TLS Bootstrap が正しく実行されたことを待たずに正常終了していました。現在は post-join ステップで kubelet の TLS Bootstrap の実行を待ち、取得したクレデンシャルを使ってその後の処理を実行します。これにより kubelet の処理が失敗した場合非ゼロの値を返すようになり、UXが向上しました。([#64792](https://github.com/kubernetes/kubernetes/pull/64792))
- kubeadm の deb パッケージ kubelet dropin の構造が大きく変わりました。dropin 内のkubeletのパラメータをハードコーディングする代わりに、kubeletの設定ファイルが使用され、 `/var/lib/kubelet/config.yaml` に存在することが期待されます。 実行時に検出されたインスタンス固有の構成値の場合、 `kubeadm init` または `kubeadm join` 実行時に動的に生成されるフラグを持つ環境ファイルが使用されます。最後に、kubeadm 設定ファイルによって実行できない kubelet に特有のものを上書きする場合は、`/etc/default/kubelet` か `/etc/sysconfig/kubelet` の環境変数 `KUBELET_EXTRA_ARGS` にフラグを追加してください。
- クラウドプロバイダの設定した場合は kubeadm の `--node-name` フラグを指定しても kubelet が Node 名の登録に利用する名前はクラウドプロバイダが指定する名前を設定するようになりました。クラウドプロバイダを使用していない場合は `--node-name` に指定した名前を Node 名に設定します。クラウドプロバイダーを使用している場合は、`--node-name` をクラウドプロバイダーが使用すると決めた名前にする必要があります。
- addmission control の PersistentVolumeLabel がデフォルトで無効になりました。もしこの機能に依存している場合(AWS/GCE)は kube-apiserver の `--enable-addmission-plugins` フラグで有効にしてください。([#64326](https://github.com/kubernetes/kubernetes/pull/64326)
- kubeadm: kubeadm が作成するクラスタの kubelet では readonly port(10255) が無効になりました。もし readonly port に対して認証不要のアクセスをしているようであれば secure port(10250) に切り替えてください。代わりに secure port にアクセスする場合は ServiceAccount 
 token を利用することが出来ます。例えば `/metrics` などの kubelet の endpoint にアクセスしたい場合に簡単にアクセスできるようになりました。([#64187](https://github.com/kubernetes/kubernetes/pull/64187))
- 以前はデフォルトで kubelet により 4194 ポートで cAdvisor の Web UI が提供されていましたが、現在はデフォルトでは無効になりました。cAdvisorを提供するポートを設定をするための `--cadvisor-port` フラグは v1.10 で廃止予定になりました。現在はデフォルトは `--cadvisor-port=0` となっており、Webサーバは起動しません。もしまだ cAdvisor を実行するよう必要がある場合は DaemonSet によって実行することをおすすめします。  `--cadvisor-port` フラグは v1.12 で削除される予定なので注意してください。([#63881](https://github.com/kubernetes/kubernetes/pull/63881))