Skip to main content

k8s 上のコンテナ開発環境を良くするポートプロキシを作った

だいたいの開発を k8s 上のコンテナで行っています。

今まではずっと VSCode SSH Remote で開発していたのですが、思い立って vim の環境を整えてみました。

だいたいいい感じに開発できるようになったのですが、ポートフォワーディングだけ機能が足りない状態でした。

カッとなってプロキシを書いていい感じになりました。

どんなものを書いたか

成果物は以下です。

https://github.com/takutakahashi/localport

シンプルな nginx の conf と、それを入れ込んだだけのコンテナイメージです。

どういうものかというと、以下のようなポートマッピングをしてくれるものです。

https://3000.workspace.example.comhttp://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

まとめ

力こそパワーで開発環境を便利にしていきましょう