k8sでコンテナを定期再起動

Kubernetes環境で動作するPod(コンテナ)を定期的に再起動するソリューションです。

このシステムは以下のような流れで動作します。

  • コンテナ上で動作するcronでメインプロセスをkill
  • dockerコンテナがメインプロセス終了とともに自動終了
  • KubernetesのReplicaSetがPod数を維持するためdockerコンテナを起動

Google Container Engineなど、kubernetesが動作している環境であれば、crontab設定だけで動作します。

crontabの例

ここではSSL証明書更新を想定して、nginxコンテナを再起動する設定例を掲載します。

CRON_TZ=Asia/Tokyo

00 2 * * 1 kill -9 `pgrep -f "nginx: master"`

crontabの一般的な設定手順そのままですが、プロセスを特定してkillしている部分と、CRON_TZで動作時間のタイムゾーンを指定している点が特徴です。

pgrepに指定する文字列を確認するには、テスト環境で該当コンテナを起動して、 コンテナ内のシェルps auxを実行するのが手軽です。

dockerにcrontab設定

cronジョブは、Dockerfileでビルド時にcronをインストール&起動したうえで、crontabコマンドを実行しておくことで登録できます。

再起動のcrontabスクリプトをcrontab.txtとして保存した場合のDockerfile記述例です。

RUN apt-get update \
  && apt-get install -y cron

COPY crontab.txt /root/crontab.txt
RUN crontab /root/crontab.txt
RUN service cron start

イメージ更新

コンテナ再起動時には最新のdockerイメージを参照するため、あらかじめコンテナレジストリにdockerイメージをpushしておくことで、cronジョブ実行のタイミングでイメージも更新できます。

JenkinsなどのCIツールを活用するとビルドプロセスを自動化する余地もあります。
Let’s Encryptの証明書を更新するようなケースでは便利です。

なお、更新後のdockerイメージに問題がある場合、自動再起動のタイミングでコンテナが起動しなくなるため、このフローとは別にコンテナイメージの動作確認を完結しておくことも重要です。

中馬崇尋
Chuma Takahiro