LoginSignup
5
0

More than 3 years have passed since last update.

Kubernetes 1.17: SIG Cluster Lifecycle の変更内容

Last updated at Posted at 2019-12-24

はじめに

Kubernetes 1.17 の CHANGELOG から SIG Cluster Lifecycle の取り組みについてにピックアップしました。

hyperkube が非推奨になるかならないかでバタバタしており、リリースノートに一貫性がなく、非常に読みづらくストレスフルでした :angry:

1.17 の主な変更点 (What's New)

  • なし

既知の問題 (Known Issues)

  • なし

重大なアップグレードに関する通達 (Urgent Upgrade Notes)

Cluster Lifecycle

  • kubeadm: init サブコマンドに kubelet-finalize フェーズと、プライマリのコントロールプレーンノードにおける kubelet クライアント証明書の自動更新を有効化する実験的なサブフェーズを追加しました。1.17 以前および、既存のkubeadm initで作成されたノードで、kubelet クライアント証明書のローテーションを行いたい場合は、/etc/kubernetes/kubelet.conf を編集し、埋め込みされたクライアント証明書と鍵から、以下二つのローテーションされた証明書のシムリンクに変更してください。client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem, client-key: /var/lib/kubelet/pki/kubelet-client-current.pem (#84118, @neolit123)
    • :pencil: kubeadm join で繋がったノードはすでにクライアント証明書のローテートに対応していたのですが、kubeadm init で作成された最初のノードは証明書とキーが kubelet.conf にハードコードされたままになっていたようです。kubernetes/kubeadm#1753

廃止予定および削除された機能 (Deprecations and Removals)

  • kubeadm.k8s.io/v1beta1 は非推奨になりました。設定ファイルを新しい、非推奨ではない API バージョンに更新してください。 (#83276, @Klaven)
  • kubeadm は hyperkube イメージの使用を非推奨としました。 (#85094, @rosti)

    • :pencil: hyperkube イメージ本体が非推奨 (k/k レポジトリでのメンテナンスが行われなくなり、コミュニティベースとなった) となったため、それに合わせた変更とissueに書かれているのですが、参照先のissueは結局closeされており、hyperkube 自体は非推奨になったわけではないようです。

    TL;DR we are not moving the binary/image from k/k, we have an alternative container image based on a script now.

注目機能 (Notable Features)

Stable

  • なし

Beta

  • なし

API の変更点 (API Changes)

  • なし

その他の注目すべき変更 (Other notable changes)

Cluster Lifecycle

  • kubeadm alpha certsコマンドは、該当するファイルが存在しない場合、処理をスキップするようになりました。 (#85092, @fabriziopandini)
    • :pencil: 例えば、kubeadm alpha certs check-expiration の実行時などに、何らかの理由で証明書が失われていた場合/無かった場合、エラーでコマンドの実行自体が終了してしまっていました。
    • :pencil: この変更により、コマンドの実行がベストエフォートとなり、処理できる処理のみをとにかく実行するようになりました。
  • kubeadm: kubeadm token create コマンドで --certificate-key フラグが利用できるようになりました。このフラグは証明書のコピーを伴ったコントロールプレーンノードとしての join コマンドを生成する為に利用することができます。 (#84591, @TheLastProject)
  • kubeadm: kubeletが標準エラーでログをダンプする場合、kubeadmがkubeletのバージョンを解析できない問題を修正します。 (#85351, @rosti)
    • :pencil: kubeadm は kubelet のバージョンを execer.Command("kubelet", "--version") を用いて取得しますが、command.CombinedOutput() の結果を用いていた為、標準エラーに何らかの出力があった場合解析に失敗していたようです。
  • kubeadm: etcd API の全ての呼び出しをリトライするようにしました。これによってkubeadm はネットワークの不調などに、より耐性を持つようになります。 (#85201, @fabriziopandini)
  • kubeadm: 特定の条件下で、initとjoinが無期限にハングするバグを修正しました。 (#85156, @chuckha)
  • kubeadm: CoreDNS version 1.6.5 を利用するようになりました。 (#85109, @rajansandeep)
    • kubernetes プラグインにコントロールプレーンのレイテンシを測定するためのメトリクスが追加されました。
    • healthプラグインにlameduckオプションがデフォルトで有効化され、シャットダウンする前に一定の時間待機するようになります。
  • kubeadm: 外部のetcdを利用したクラスターで kubeadm alpha certs コマンドを実行する際に発生したバグが修正されました。 (#85091, @fabriziopandini)
  • kubeadm は kubeletおよびkube-proxyの設定ファイルに対するバリデーションとでフォルティングを行わないようになりました。 (#79223, @rosti)
  • kubeadm: v1.14 より非推奨のkubeadm upgrade apply における --cri-socket フラグは削除されました。 (#85044, @neolit123)
  • kubeadm: apiserverのエンドポイントが到達不能であった場合、kubeadm reset などのコマンドがハングする問題を修正しました。 (#84648, @neolit123)
    • :pencil: apiserverへの接続タイムアウトがデフォルト値で数分かかってしまうため、10s にハードコードしていました。
  • kubeadm: 二番目以降のコントロールプレーンノードで、kubeadm upgrade node実行時にetcd のアップグレードがスキップされていた問題が修正されました。 (#85024, @neolit123)
    • :pencil: v1.15 の kubeadm でも問題になることがわかっているため、この修正はバックポートされます。
    • :pencil: v1.14 と v1.13 のサポートするetcdのバージョンは同じため問題ないようです。
  • kubeadm: kube-proxyの .containers[].env に関連する問題を修正しました。 (#84888, @neolit123)
  • GKEのWindowsのテストログをダンプする為に diagnostics tool を使用するようにしました。 (#83517, @YangLu1031)
  • kubeadm: --flex-volume-plugin-dir フラグで渡されたディレクトリを kube-controller-manager がホストパスで常にマウントするようになりました。 (#84468, @neolit123)
  • Cluster Autoscaler のバージョンを 1.16.2 に更新しました。 (#84038, @losipiuk)
    • :pencil: これもk/kレポジトリ中の cluster/ ディレクトリ中のスクリプトの話です。
  • kubeadm は /etc/cni/net.d をインストールしないため、削除しなくなりました。ユーザは自身でそのファイルを削除するか、それらを生成したコンポーネントに任せてください。 (#83950, @yastij)
  • kubeadm: ノードアップグレードのための、--certificate-renewal フラグの不適切なデフォルト値を修正しました。 (#83528, @neolit123)
    • :pencil: デフォルト false が true に変更されました。
  • metrics-server のバージョンを 0.3.5 にしました。 (#83015, @olagacek)
    • :pencil: k/kレポジトリ中の cluster/addons ディレクトリにあるアドオンマニフェストの話です。
  • Dashboard: non-Linuxノードにおいてダッシュボードを無効化しました。この手順はWindowsワーカーのノードをサポートするために必要です。 (#82975, @wawa0210)
    • :pencil: k/kレポジトリ中の cluster/addons ディレクトリにあるアドオンマニフェストの話です。
    • :pencil: ダッシュボードってLinuxじゃないと動かないんですね?
  • ブートストラップトークンのクリーンナップ時に kube-controller-managerがパニックする問題を修正しました。 (#82887, @tedyu)
    • :pencil: controller のキューに文字列を入れるべきところでオブジェクトをそのまま突っ込んでパニックを起こしていたようです。
  • kubeadm: Jobをデプロイするアップグレード時のヘルスチェックを追加しました。 (#81319, @neolit123)
    • :pencil: アップグレード前のヘルスチェックとして以下を行なっているようです。
      1. Job を作成して apiserver が起動しているかを確認。
      2. コントロールプレーンのノードが Ready であるか確認。
      3. Static Pod のマニフェストがディスクに存在しているか確認。
  • kubeadmは、kube-controller-manager のデュアルスタックのためのノードCIDRを自動で計算するようになりました。 (#85609, @Arvinderpal)
  • kubeadm: resetサブコマンドがフォルダを削除できなかった場合、ワーニングを出すようにしました。 (#85265, @SataQiu)
    • :pencil: 前回調査時にも感じたが、エラーを握りつぶしていたところを修正する変更が多い。
  • kubeadm: kube-schedulerとkube-controller-managerのセキュアなヘルスチェックの使用を有効化しました。それにより、kube-schedulerのポートが10251から10259に、kube-controller-managerのポートが10252から10257に変わりました。 (#85043, @neolit123)
  • kubeletの新しいコマンドラインオプションである --reserved-cpus が明示的にシステムのために予約されたCPUリストを定義するため導入されました。例えば、 --reserved-cpus=0,1,2,3 と指定された場合、CPUの0,1,2,3はシステムのために予約されます。24個のCPUを持ったシステムでは、ユーザはカーネルオプションとして isolcpus=4-23 と指定し CPUの 4-23 をユーザコンテナに使用できます。 (#83592, @jianzzha)
    • :pencil: SIG-Node の変更に見えるが、なぜここに…。
  • kubelet: --config で指定される kubelet の設定ファイルが厳密に解釈されるようになりました。例えば重複した内容や、存在しない項目があった場合に失敗します。この変更により、設定ファイルに異常であったり、インデントがおかしかったりタイポがあったりしたことによる予期しない振る舞いから守られます。 (#83204, @obitech)
  • kubeadm: kube-proxy にプロキシに関する環境変数を伝播するようになりました。 (#84559, @yastij)
  • 最新の有効なDockerバージョンを19.03に更新しました。 (#84476, @neolit123)
    Version:     []string{1\.13\..*, 17\.0[3,6,9]\..*, 18\.0[6,9]\..*, 19\.03\..*},
  • Ingres-GCE のバージョンを v1.6.1 に更新しました。 (#84018, @rramkumar1)
    • :pencil: k/kレポジトリ中の cluster/ ディレクトリ中のスクリプトの話です。
  • kubeadm: certs check-expiration で関係する CA の有効期限を表示するようにしました。 (#83932, @SataQiu)
    • :pencil: 以下のような表示になるらしい。
      [root@node-ttnm ~]# ./kubeadm alpha certs check-expiration
      CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
      admin.conf                 Oct 15, 2020 08:25 UTC   364d                                    no
      apiserver                  Oct 15, 2020 08:25 UTC   364d            ca                      no
      apiserver-etcd-client      Oct 15, 2020 08:25 UTC   364d            etcd-ca                 no
      apiserver-kubelet-client   Oct 15, 2020 08:25 UTC   364d            ca                      no
      controller-manager.conf    Oct 15, 2020 08:25 UTC   364d                                    no
      etcd-healthcheck-client    Oct 15, 2020 08:25 UTC   364d            etcd-ca                 no
      etcd-peer                  Oct 15, 2020 08:25 UTC   364d            etcd-ca                 no
      etcd-server                Oct 15, 2020 08:25 UTC   364d            etcd-ca                 no
      front-proxy-client         Oct 15, 2020 08:25 UTC   364d            front-proxy-ca          no
      scheduler.conf             Oct 15, 2020 08:25 UTC   364d                                    no
      CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
      ca                      Oct 13, 2029 08:25 UTC   9y              no
      etcd-ca                 Oct 13, 2029 08:25 UTC   9y              no
      front-proxy-ca          Oct 13, 2029 08:25 UTC   9y              no   
  • kubeadm: kubeadm token list の出力で JSON, YAML, Go テンプレートおよび JsonPath フォーマットを実装しました。 (#78764, @bart0sh)
  • kubeadm: 広告アドレスとして 127.0.0.1 のサポートを追加しました。kubeadmは自動的にこの値をループバックインタフェースのグローバルユニキャストIPアドレスに変換します。 (#83475, @fabriziopandini)
    • :pencil: ユースケースとして RFC5549 でループバックについた IPv4のアドレスをアドバタイズする場合について書かれていました。
  • kube-scheduler: --config で指定される kube-scheduler の設定ファイルが厳密に解釈されるようになりました。例えば重複した内容や、存在しない項目があった場合に失敗します。この変更により、設定ファイルに異常であったり、インデントがおかしかったりタイポがあったりしたことによる予期しない振る舞いから守られます (#83030, @obitech)
  • kubeadm: 設定ファイル中の ServiceSubnet に渡される Service CIDR のカンマで区切られたリストを --service-cluster-ip-range で設定できるようになりました。 (#82473, @Arvinderpal)
  • clictl を v1.16.1 に更新しました。 (#82856, @Random-Liu)
    • :pencil: k/kレポジトリ中の cluster/ ディレクトリ中の GCE 向けスクリプトの話のようです。
  • 非推奨の extensions API の使用に関する問題を修正するため、addon-resizer を 1.8.7 に更新しました。 (#85864, @liggitt)
    • :pencil: k/kレポジトリ中の cluster/addons ディレクトリ中のアドオンで利用している addon-resizer のバージョンの話です。
  • スクリプトベースの必要なバイナリを全て含んだ hyperkube に簡素化しました。これは go ベースの hyperkube コマンドとそのイメージの等価な代替です。 (#84662, @dims)
    • :pencil: hyperkube を非推奨にしようとする動きがあったのですが、その理由の一つが hyperkube コマンドが go で実装されており k8s.io/kubernetes に依存していたことだったようです。
    • :pencil: k8s.io/kubernetesライブラリとしての利用を推奨しておらず hyperkube がその非推奨な依存を持っていたためです。
    • :pencil: この PR で hyperkube をスクリプトベースで再実装し、 k8s.io/kubernetes への依存を取り除いたようです。
    • :pencil: ただ、この実装方法では全てのバイナリ (apiserver, controller-manager, scheduler など)をイメージに内包することになり、結果的にイメージサイズが大きくなります。このことにより hyperkube を使う大きな理由の一つが失われたように感じます。
  • hyperkubeは新しい GitHub レポジトリに移動し、1.17のリリースに含まれなくなるようでしょう。 (#83454, @dims)
  • kube-up スクリプトから Prometheus クラスターモニタリングアドオンを削除しました。 (#83442, @serathius)
    • :pencil: メンテナンスも大変だし、cluster/addons の Prometheus なんて誰も使ってないでしょ、ということで削除したようです。
  • sourceReady は kubelet の設定源、例えば apiserverのupdate readinessなどのreadinessを供給します。 (#81344, @zouyee)
    • :pencil: リリースノート見ただけじゃなんじゃこりゃって感じですな。
    • :pencil: reconcile する前にソースの Ready を見るようにしたらしい。
    • :pencil: ってか、これも SIG-Node では…。
  • このPRは、NodeLocal DNSCacheが有効かどうかに関係なく、 --cluster-dns フラグの値をkube-dnsサービスIPに設定します。 NodeLocal DNSCacheは、リンクローカルとサービスIPの両方でリッスンします。 (#84383, @prameshj)
    • :pencil: cluster/addons のノードローカルDNSアドオンの話のようです。
  • kube-dns アドオンにて、全てのコンテナが制限された権限で実行されるようになりました。またほと温度のコンテナがnon-rootなユーザで実行されるようになり、rootのファイルシステムがリードオンリーになりました。また、残ったrootで実行されるコンテナも、最小限の要求されるLinuxケーパビリティを持つようになりました。全てのコンテナの権限昇格も無効化されました。 (#82347, @pjbgf)
    • :pencil: kube-dns ってまだ使ってるユーザいるのかな?
    • :pencil: cluster/addons にある kube-dns の話です。
  • Kubernetes は firewalld を監視しません。ファイアウォールのメンテナンスのためにfirewalldを利用しているシステムではfirewalldによる kube-proxy のiptables ルールを削除するような破壊的な操作からの回復が少し時間がかかるようになります。 (#81517, @danwinship)
    • これらの変更の副作用としてkube-proxyの sync_proxy_rules_last_timestamp_seconds のメトリクスはこれまでと同様に振る舞いません。単に60秒ごとの更新というよりもむしろServiceやEndpointの変更時にのみ変更します。もし、あなたがiptablesの更新が失敗したことを監視したかった場合 sync_proxy_rules_iptables_restore_failures_total を利用する方が良いかもしれません。
    • :pencil: SIG-Network では…?
5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0