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イメージに問題がある場合、自動再起動のタイミングでコンテナが起動しなくなるため、このフローとは別にコンテナイメージの動作確認を完結しておくことも重要です。
⁋ 2017/06/29↻ 2024/11/07
中馬崇尋
Chuma Takahiro
Chuma Takahiro