やりたい事は次の通り。
- (1) 定期的に更新されるファイルがある(例えばgeoipのDBファイルとか)
- (2) そのファイルをKubernetesで動いているAPIサーバ(複数ノードに配置)に展開したい
- (3) ファイル更新のためだけにコンテナをリビルドして再デプロイとかはしたくない
みたいな感じ。
ぱっと考えると各ノードにファイルをプッシュしてやればよさそうな気もするが、次の理由からそれはよい考えではない。
- (1) そもそも対象のノードが幾つあるかわからない(負荷によって増減することが考えられる)
- (2) 対象のノードを常に把握し管理するプログラムが必要になり面倒くさい
- (3) そのプログラムがバグっていると更新漏れという更に面倒くさい事態が発生する
したがって、各ノードからファイルをプルしてもらう方式がベストであろう。
具体的な流れとしては以下の通り。
- (1) ファイルを最新化する処理をCronJobなどスケジューラが実行
- (2) 最新化されたファイルを適当なファイルサーバにアップロードする(GCSやS3など)
- この時、対象のファイル及び対象のファイルのハッシュ値を記録したファイルをアップロードしておく
- (3) 各ノードのAPIサーバにはファイルサーバを定期的に監視&プルしてくる処理をサイドカーコンテナとしてデプロイしておく
- まずファイルサーバ上のハッシュ値記録ファイルにアクセスし、最後に取得したファイルのハッシュ値と比較
- ハッシュ値が異なっている場合はサーバ上のファイルが更新されたとみなしてファイルをダウンロード(この時ダウンロードしたファイルのハッシュはファイルなどに記録しておく)
- (4) サイドカーコンテナはメインコンテナとボリュームを共有できるので、事前にサイドカーコンテナとメインコンテナのボリュームを共有しておけばファイルをダウンロードしてきた時点でファイルの最新化は完了する
このような方式ならノードが幾つ増えても確実に最新のファイルを展開することが可能になる。
(2020/12/25)