kubeadm
は、1年間有効なKubernetesコントロールプレーンの証明書を作成します。 Kubernetesをアップグレードするたびに更新されます 。少なくとも年に1回はKubernetesクラスタを更新することをお勧めします。これにより、証明書が期限切れになることはありません。
ただし、一部のKubernetesクラスターはエアギャップ環境(絶対にインターネット接続なし)で実行されており、更新が表示される保証はありません。このような環境では、1年以内に有効期限が切れる証明書は受け入れられません。証明書の有効期間を延長することは、この設定を修正するための1つのアイデアですが、証明書を自動的に更新することは、より優れたソリューションのようです。これは、すべてのマスターノードでcronまたはsystemdタイマーによって実行されるkubeadm alpha certs renew all
(Kubernetes 1.15)を使用して簡単に実行できます。
APIサーバー、コントローラーマネージャー、およびスケジューラーが新しい証明書を取得しないことに気付きました。これらのコンポーネントに新しい証明書を通知する方法はありますか?コントロールプレーンポッドは静的であり、kubectl delete pod
ミラーポッドを削除するだけ であるため、ポッドを破棄することはそれほど単純ではありませんが、コンテナーを強制終了しません。エラーが発生しやすいdocker |grep …
でうまくいくかもしれませんが、API呼び出しがあるのか、それを行うためのよりスマートな方法があるのかと思います。このトピックに関する他のドキュメントは見つかりませんでした。
その振る舞いには既存のチケットがあると思ったのですが、 kubeletとkube-proxyのチケット しか見つかりません
短いバージョンでは、その動作が「TBD」である限り、近い将来いつでも修正されるとは思わないでしょう。クラスターがマルチマスターHA構成の場合、コントロールプレーンポッドをローリング方式で再起動しても安全だと思います。 kubeadm alpha certs renew all
を実行するプロセスは、マシンを再起動して、個々のDockerコンテナーを選択的にバウンスするビジネスから抜け出すことができます。
そうは言っても、コントロールプレーンのDockerコンテナーを識別することは、「エラーが発生しやすい」とは言えません。kubelet Dockerコンテナーにラベルを付ける with ポッド名と名前空間に一致するラベル 、簡単にできるようにする filter for コントロールプレーンを構成し、それらだけを強制終了するコンテナ:
for comp_name in kube-apiserver kube-controller-manager etcetc; do
for c_id in $(docker ps -q \
--filter "label=io.kubernetes.pod.namespace=kube-system" \
--filter "label=io.kubernetes.pod.name=${comp_name}"); do
docker kill $c_id
docker rm $c_id
done
done