Kubernetes 1.17: SIG Cluster Lifecycle の変更内容

## はじめに

[Kubernetes 1.17 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.17.md) から 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](https://github.com/kubernetes/kubernetes/pull/84118), [@neolit123](https://github.com/@neolit123))
    -   :pencil: kubeadm join で繋がったノードはすでにクライアント証明書のローテートに対応していたのですが、kubeadm init で作成された最初のノードは証明書とキーが kubelet.conf にハードコードされたままになっていたようです。[kubernetes/kubeadm#1753](https://github.com/kubernetes/kubeadm/issues/1753)

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

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