web-dev-qa-db-ja.com

オンラインKubernetes(kubeadm)コントロールプレーン証明書の更新

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呼び出しがあるのか​​、それを行うためのよりスマートな方法があるのか​​と思います。このトピックに関する他のドキュメントは見つかりませんでした。

1
Stephan

その振る舞いには既存のチケットがあると思ったのですが、 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
1
mdaniel