kubernetes

kubernetes1.9 Before Upgrading

このエントリは、Kubernetes v1.9 CHANGELOG からBefore Upgradingの内容をまとめています。その他の項目は下記リンク先を参照してください。

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のような機能は不要になるとのことから、削除をしようとしている
  • kubeadmの --skip-preflight-checksは廃止予定となります。
    • 代わりに --ignore-preflight-errors を指定してください。例えば--ignore-preflight-errors=allなどと指定ができます。個別のチェックごとに無視するかどうか指定できるようになりました。
  • APIサーバのexternal host address をcloud provider APIで取得している場合は、明示的に--external-hostnameを指定するようにしてください。この機能は廃止予定です。
    • kube-apiserverにあるcloudproviderに依存する処理を排除する一環

Multicluster

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 notReadynot-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のみのサポートとなりました。