k8s 上のコンテナ開発環境を良くするポートプロキシを作った
だいたいの開発を k8s 上のコンテナで行っています。
今まではずっと VSCode SSH Remote で開発していたのですが、思い立って vim の環境を整えてみました。
だいたいいい感じに開発できるようになったのですが、ポートフォワーディングだけ機能が足りない状態でした。
カッとなってプロキシを書いていい感じになりました。
どんなものを書いたか
成果物は以下です。
https://github.com/takutakahashi/localport
シンプルな nginx の conf と、それを入れ込んだだけのコンテナイメージです。
どういうものかというと、以下のようなポートマッピングをしてくれるものです。
https://3000.workspace.example.com → http://target.example.com:3000
target.example.com に当たる部分にコンテナ上の開発環境への経路を書いてあげれば、任意のポートに対してホスト名でアクセスできます。便利!!!
(該当のアドレスはプライベート IP を返すので外部からアクセスできません)
Ingress と cert-manager + Let’s Encrypt でワイルドカード証明書を使用すれば https で開発環境にアクセスできます。最高では???
コンテナの IP が変化すると?
開発環境はコンテナなので、IP は常に変化することを許容する必要があります。
しかし、nginx の名前解決は config が読み込まれた時点での IP がずっと使用されます。
つまり、IP が変更されても nginx の向き先は変わらず、コンテナが再作成されると適切なアクセスができなくなります。
svc の IP を見ればいいんじゃ?
svc は動的にポートマッピングをしたり、すべてのポートをフォワードすることはできません。マニフェストで指定したポートのみマッピングされます。
つまり、svc のマニフェストのポートリストがえらいことになります。
どうやって解決したか
以下のようなスクリプトを書いてサイドカーとして読み込ませました。
while true; do
POD_IP=`kubectl get pod workspace-0 -o wide |grep workspace |awk '{print $6}'`
if [[ "$POD_IP_BEFORE" != "$POD_IP" ]]; then
cat /files/patch.tpl |POD_IP=$POD_IP envsubst |bash -
POD_IP_BEFORE=$POD_IP
fi
sleep 30
done
30秒ごとに Pod IP を監視し、変更があったら kubectl patch で環境変数を書き換えるというものです。
こうすることで、localport 自身が設定を変更して勝手に再起動してくれます。便利!!!!
すべての設定は以下で公開しています。
https://github.com/takutakahashi/testbed/tree/master/infra/workspace/localport
まとめ
力こそパワーで開発環境を便利にしていきましょう