kubernetes

Kubernetes 1.11: Before Upgrading


はじめに

このエントリは、Kubernetes 1.11 の CHANGELOG から Before Upgrading についてまとめています。翻訳に合わせて補足を追記しています。その他の内容は次のリンク先を参照してください。


Kubernetes 1.11: Before Upgrading


Before Upgrading

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



  • metav1.Status を返すとき、audit.Event のステータスにコピーされなくなりました。statusreason, 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 からは statusreason, code のみが記録されます。古いバージョンに依存するコードがある場合は修正する必要があります。(#62695)

  • HTTP transportは dial メソッドを利用せず context.Contextを使用するようになりました。 そのため、k8s.io/client-go/transport/Config structが更新され、 context.Contextパラメータを持つ関数を受け入れるようになりました。 これは破壊的な変更なので、このフィールドを直接利用しているコードがある場合は注意してください。(#60012)



    • :pencil: これは net/http/Transport.Dial field が deprecated になったため、DialContext を利用するように切り替えた影響によるものです。



  • kubectl が apps/v1 API を要求するようになりました。そのため 1.9 より古いクラスタでは動作しなくなります。kubectl は +/-1 のマイナーバージョンに対する互換性しか保証しないので注意してください。(#61419)

  • Podプライオリティとプリエンプションがデフォルトで有効になりました。この機能を使う予定がなくとも、アップグレード後即座にこの機能が働くため何らかのアクションを行う必要があります。マルチテナントですべてのユーザが信用できない場合は、2つのデフォルトプライオリティクラス(system-cluster-critical, system-node-critical)に対してQuotaを割り当てることをおすすめします。クラスタのすべてのユーザが信用できない場合、これらの優先順位でユーザが Pod を作成するのを制限するために、 ResourceQuota を作成する必要があります。重要なシステムポッドはクラスタがリソース圧迫状態にあるときにプリエンプションする機能がこの機能に依存しているため、この機能を無効にすることは非推奨です。

  • 1.10 よりマウント・プロパゲーションのデフォルトが HostToContainer(Linux では rslave) になりましたが、いくつかの環境で問題があることがわかったため None (Linux では private) にデフォルトが戻されました。この動作に依存している場合は、明示的に設定する必要があります。(#62462)

  • kube-apiserver から --storage-version フラグが削除されました。代わりに --storage-versions を利用してください。(#61453)

  • Aggregated API Server の機能を利用している場合は、kube-apiserver によって行われている認可に依存してはならず、委任された認可を追加して行う必要があります。(#61349)



    • :pencil: API Serverは認証Proxyであって認可Proxyではないためそこに依存しないようにしてほしいようです。 Aggregated API Server の機能を利用する場合は注意しましょう。



  • GC は QPS で制限するようになりました。これを避けるために QPSを上げる必要がある場合は明示的に指定する必要があります。(#63657)


  • kubeadm join コマンドは TLS Bootstrap による設定の処理の完了を待つようになりました。以前は TLS Bootstrap が正しく実行されたことを待たずに正常終了していました。現在は post-join ステップで kubelet の TLS Bootstrap の実行を待ち、取得したクレデンシャルを使ってその後の処理を実行します。これにより kubelet の処理が失敗した場合非ゼロの値を返すようになり、UXが向上しました。(#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

  • kubeadm: kubeadm が作成するクラスタの kubelet では readonly port(10255) が無効になりました。もし readonly port に対して認証不要のアクセスをしているようであれば secure port(10250) に切り替えてください。代わりに secure port にアクセスする場合は ServiceAccount
    token を利用することが出来ます。例えば /metrics などの kubelet の endpoint にアクセスしたい場合に簡単にアクセスできるようになりました。(#64187)

  • 以前はデフォルトで kubelet により 4194 ポートで cAdvisor の Web UI が提供されていましたが、現在はデフォルトでは無効になりました。cAdvisorを提供するポートを設定をするための --cadvisor-port フラグは v1.10 で廃止予定になりました。現在はデフォルトは --cadvisor-port=0 となっており、Webサーバは起動しません。もしまだ cAdvisor を実行するよう必要がある場合は DaemonSet によって実行することをおすすめします。 --cadvisor-port フラグは v1.12 で削除される予定なので注意してください。(#63881)