kubernetes1.9 Before Upgrading

このエントリは、[Kubernetes v1.9 CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.9.md#19-release-notes) からBefore Upgradingの内容をまとめています。その他の項目は下記リンク先を参照してください。

- [Kubernetes v1.9: 主な変更点 (Major Themes)](https://qiita.com/inajob/items/883b92f5aaaa63e21a21)
- Kubernetes v1.9: Before Upgrading
- [Kubernetes v1.9: 既知の問題 (Known Issues)](https://qiita.com/tkusumi/items/8ce2a635f2f850bd1a17)
- [Kubernetes v1.9: 廃止予定の機能](https://qiita.com/superbrothers/items/8471d780aef7ae5ea70c)

# kubernetes1.9 Before Upgrading

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.9.md#before-upgrading
を翻訳し、個人的に調べたことも織り交ぜて記載しています。

1.9に上げる前にetcdのデータをバックアップしておくことが望ましいです。
kubernetsを何で管理しているかによりますが、その方法によっては1.9にバージョンアップする際にetcdを3.0から3.1にバージョンアップされるかもしれません。
そしてetcdはダウングレードをサポートしていないため、元に戻したい場合はバックアップから復旧するしか方法がありません。

# API Machinery

- admission controll webhook を呼ぶときに使われていた admission APIが `admission.v1alpha1` から `admission.v1beta1`に移動しました。必ずアップグレードの前に存在する全てのwebhookを削除してください。 この変更は後方非互換です。
- admissionregistration APIの一部である admission webhook configurations APIが `v1beta1`になりました。必ずアップグレードの前に存在する全てwebhook configurationを削除してください。
- `ValidatingAdmissionWebhook` が追加されました。これは以前`GenericAdmissionWebhook`という名前だったものです。kube-apiserverの`--admission-control` フラグにこれを設定することでこの機能を有効にできます。
- kube-apiserverの `--portal-net` `--service-node-ports` は廃止になりました。これは以前から予告されていた廃止です。今後は`` `--service-cluster-ip-range` `--service-node-port-range` を使うようにしてください。

## メモ： External Admission Webhooks
WebHookを使ってadmission controlをカスタマイズできるようになっている。

この仕組みではリクエストを変更することはできない。そういうことがしたい場合はPluginやinitializerを使うようにとのこと。

ValidatingAdmissionWebhookはこれを実現するAdmissionControlのプラグイン。`admission webhook configurations API`
とは `externalAdmissionHookConfiguration`のことかと思われる。このリソースで、externalAdmissionWebhookの情報を登録する。複数登録がある場合は平行に実行され、どれか一つでも否認である場合はリクエストは失敗する。このとき失敗した理由は初めに失敗したexternal admission webhookのものが帰ることに注意。またexternal admission webhookの呼び出しが失敗した場合はそれは無視される（externalAdmissionWebhookの評価対象から外れる）。
この挙動は`FailurePolicy`で変更することができる。

https://kubernetes.io/docs/admin/extensible-admission-controllers/#external-admission-webhooks

# Auth

- PodSecurtyPolicyのallowPriviledgeEscalationフィールドのデフォルト値が誤っていて、意図せず許可されなくなってしまうバグを修正しました。1.8.0でPodSecurityPolicyを定義しかつallowPriviledgeEscalationをfalseに設定している場合は、アップグレード後にPodSecurityPolicyを再度適用してください。
- alpha版だったGCP KMSとの統合は削除されます。アップグレード前に、データを復号（あるいは別のプロバイダ向けに再度暗号化）してください。これは将来的にKMSをプラグイン形式で提供できるようにする予定があるために実施するものです。（https://github.com/kubernetes/kubernetes/issues/51965 ）

## メモ： PodSecurtyPolicy 何故こんなことになったか
allowPriviledgeEscalationは1.8.0の時点ではデフォルト値がfalseとなっていました。しかし、これではこのオプションが存在しないバージョンとの互換性が取れなくなるため、1.8.1でデフォルトをtrueに変更しました。

一方、1.8.0ではallowPriviledgeEscalationに明示的にfalseが指定してある場合も、シリアライズの段階で無指定と同様の扱いをしていました。1.8.0時点ではデフォルト値がfalseだったため、これで問題なく動いていました。
しかし1.8.1でデフォルト値がtrueとなったため、このように1.8.0で明示的にfalseを指定した場合、manifest上はfalseであるにもかかわらず、上記シリアライズで無指定として扱われるため、デフォルトのtrueとして扱われるようになります。これはが非互換であるということです。

# CLI

- OpenAPIを使うようになったため、Swagger1.2のバリデーションはkubectlから削除されました。`--use-openapi`と`--schema-cache-dir`も削除されました。
    - OpenAPIはSwaggerの新しい名称です。

# Cluster Lifecycle

- `kubeadm join`時に `-discovery-token-ca-cert-hash` か`--discovery-token-unsafe-skip-ca-verification` のいづれかを指定する必要があります。
- kubeletの引数である`--cloud-provider`がデフォルトで `auto-detect`の挙動をする機能は廃止されました。
    - `--cloud-provider=auto-detect` を指定することができますが、この挙動も将来廃止予定です。
    - 1.9以降では明示的に指定することを推奨します。ドキュメントを参照してください。 https://kubernetes.io/docs/getting-started-guides/scratch/#cloud-providers
    - **何があった？** cloud-providor独自のコードをcoreから外したいようだ。その際はcloud-providorごとにコントローラが別れるはずで auto-detectのような機能は不要になるとのことから、削除をしようとしている
        - https://github.com/kubernetes/features/issues/88
- kubeadmの `--skip-preflight-checks`は廃止予定となります。
    - 代わりに `--ignore-preflight-errors` を指定してください。例えば`--ignore-preflight-errors=all`などと指定ができます。個別のチェックごとに無視するかどうか指定できるようになりました。
- APIサーバのexternal host address をcloud provider APIで取得している場合は、明示的に`--external-hostname`を指定するようにしてください。この機能は廃止予定です。
    - kube-apiserverにあるcloudproviderに依存する処理を排除する一環

# Multicluster
- Kubernetes Federationの開発は https://github.com/kubernetes/kubernetes/blob/master/github.com/kubernetes/federation に移動しました。FederationはKubernetesのリリースとは独立して行います。
    - Federationサーバはhyperkubeに含まれなくなります

# Node
- 1.7で廃止予定とされていましたが、kubeletの`--network-plugin-dir`は削除されました。代わりに`--cni-bin-dir`を使ってください
- kubeletの `--cloud-provider`のデフォルトが`auto-detect`ではなくなりました。明示的にcloud-providerを指定してください。

# Network
- NetworkPolicyリソースが networking.k8s.io/v1 になりました。1.9にアップグレードした後で、全てのNetworkPolicyをv1に移行してください。
- kube-proxyの設定が`componentconfig/v1alpha1`から`kubeproxy.config.k8s.io/v1alpha1`に変わりました。コマンドラインフラグではなく、ファイルで設定している場合はapiVersionを変更してください。
- nodeに`alpha.service-controller.kubernetes.io/exclude-balancer`アノテーションを追加することでServiceNodeExclusionを試すことができます。
    - このアノテーションがあるnodeはServiceのtype=LoadBalancerのLBと接続されないようになります。

# Scheduling
- Taint Key `unreachable`はGAとなりました。
- Taint Key　`notReady` は `not-ready` となりGAとなりました。
- 下記Taint Keyの変更は自動的に更新されますが、それに対するTolerationは手動で更新する必要があります。
    - `node.alpha.kubernetes.io/notReady` to `node.kubernetes.io/not-ready`
    - `node.alpha.kubernetes.io/unreachable to node.kubernetes.io/unreachable`
- taint `node.kubernetes.io/memory-pressure` がPodTolerationRestrictionのホワイトリストの影響を受けないバグを修正しました。PodTolerationRestrictionを有効にした状態で`node.kubernetes.io/memory-pressure`を利用する場合はホワイトリストに加えてください。
- kube-schedulerの設定のリファクタリングをしました。
    - kube-schedulerは`--config`によりファイルからの設定読み込みをサポートしました。他の大半のフラグは廃止予定となります。

# Storage
- [alpha] LocalPersistentVolumesが VolumeSchedulingを要求するようになりました。これは非互換の変更のため、以下の対応が必要です
    - kube-scheduler, kube-controller-managerのVolumeScheduling feature gateを有効にしなければなりません
    - NoVolumeNodeConflictという条件は削除されました。独自スケジューラの場合はこの影響を考慮してください。
    - CheckVolumeNodeConflictという条件は削除されました。独自スケジューラの場合はこの影響を考慮してください。

## メモ： LocalPersistentVolumeとは
https://github.com/kubernetes-incubator/external-storage/tree/master/local-volume

PVCのインターフェースで、ローカルストレージを扱えるようにするものです。PVにnode affinityを含めることで、正しいnodeにpodを配置できるようにします。

# OpenStack
- LbaasV1のサポートをやめて、LbaasV2のみのサポートとなりました。