コンテナ詰め詰め大作戦2022冬

この記事は KMC アドベントカレンダー 19 日目の記事です。

adventar.org

背景

世界にはたくさんの不便・だるい・面倒があり、われわれ人類は様々な道具を作り使うことで不便・だるい・面倒を粉砕してソシャゲ周回する時間を捻出したり異常な旅程の旅行に出ています。


手元のVPSでいくつかのbotやらを動かしているんですが、雑にdist-upgradeしたら依存関係が壊れ起動失敗してたのでコンテナに詰める*1ことにしました。

コンテナ化してk8sで動いてる様子をArgo CDで見てる図。

コンテナに詰めたもの

最近書いてるGoやらRustはコンパイルするとあんまり外部に依存しないシングルバイナリ吐かれるのであんまりコンテナ詰め詰めの必要を感じないんですが、PythonやらPerlやらNode.jsで書いたやつ*2は詰め詰めすることでの幸せ度が比較的高そうです。

コンテナ詰め詰め

とりあえずDockerfile書くわけですが、PythonやらNode.jsにPerlで書いたやつを詰めるのでそれぞれ調べる必要がある。

Python

まず最初に着手したのがPython。でインターネットに聞くと「頼むからAlpineLinuxを使わんといてくださいよ」とばかりに沢山記事が出てくるので実行イメージはpython:3.11-slim-busterを使っています。

future-architect.github.io

参考記事をもとに書いた。まだnonrootとかを知る前なのでrootで動いています。そのうちなんとかしよ。

こいつは動作をいじりたかったのもあってdevcontainerを作ったんだけどやっぱり書いてる時間がないのでそのうち吐き出す。話を別途書いた

Node.js編

その後着手したのがNode.js。

blog.shinonome.io

この辺を参考にした気がする。ここでnonrootを覚えました。distrolessってやつを使ってみた!

Perl

最後にPerl。最後になったのは緊急地震電文ビューアが古のCGIなので、それをどうやってコンテナに詰めようかな~となっていたら一番最後に。この実装10年以上前に書いたものなので懐かしさがいっぱい。

インタネットを眺めても「Perlをコンテナに乗せる2022」みたいな記事は見つからなかったので好きにやった。好きにやってるのでAlpineLinuxに依存ライブラリもcpanmでなくapkで入れています。とりあえず動いてるのでヨシなんですが、ライブラリのバージョンを指定する術がない。

ちなみにCGIの方はfastcgi化してlighttpd*3でホストしてみました。Perlfastcgi moduleはunicodeを書くとwarningを吐く*4アレな感じなのでmonkey patchで黙らせてる。

おまけ:Go

どこまで小さく出来るか試してみたところ、scratchに/etc/passwd/etc/group/etc/ssl/certs/ca-certificates.crt/usr/share/zoneinfo/Asia/Tokyoを放り込んだら動いた。

イメージサイズがGoのバイナリとほぼ同じぐらいまで小さくなってすごかった。

番外:コンテナをどこに浮かべるか

コンテナを何処で走らせるかはマネージドk8sから素朴にdockerするまで様々な選択肢があります。

k0sproject.io

今回は軽量k8sであるところのk0sを使ってさくらVPSにシングルノードで立てました。

mackerelのメモリ状態スクショ

使用メモリは300MBytes程度(実測)なので、さくらの2G VPSで今のところ大丈夫そう。

もともとWebサービスをhostするnginxが立っているので、サブドメを切ってリクエストを中継しています*5。過渡期の構成とは言え、static fileをserveするだけで3つのnginx instanceがリクエストをバケツリレーするのでこうなんかちょっとしたいところ。

k0s構築の話を書くと完全に間に合わないので、またそのうち書きます。一年後のアドベントカレンダー記事で書きました

*1:お仕事ではGoで書いたやつをコンテナに乗せてk8s(EKS)で走らせていてちょっと知見が増えたというのもあります。

*2:ちなみに今回のきっかけになったのPythonで書いてた。

*3:インタネットによるとnginxはfastcgi processをおもりしてくれないらしい。

*4:FCGI - Fast CGI module - metacpan.orgを参照。当該コミットはこれ

*5:k0sの上NodePortでexposeしているingress-nginxへforwardする構成