A sidecar container to route traffic from a Kubernetes client Pod through a gateway Pod
Kubernetes の Client Pod から別の Gateway Pod を介してトラフィックをルーティングするためのサイドカーコンテナ
Inspired by toboshii/pod-gateway, and angelnu/pod-gateway.
vxlan3150
を作成する。- Kubernetes 内での IP アドレスを返すサーバーと DNS を起動する。
- Client Pod のトラフィック制限を行う。
- 基本的に全トラフィックを遮断する。
10.0.0.0/8
と192.168.0.0/16
を許可する。- Kubernetes 内での Gateway Pod の IP アドレスを取得する。
vxlan3150
を作成する。
dhclient
を使用して VXLAN 内での IP アドレスを取得・設定する。- 定期的に Gateway Pod との疎通を確認し、途切れた場合は 3. に戻る。
- グローバル行きのトラフィックは Gateway Pod を経由する。
- ローカル行きのトラフィックは Gateway Pod を経由しない。
環境変数 | 説明 | デフォルト値 |
---|---|---|
PGW_LOG_LEVEL | debug , info , error から 1 つログレベルを選択します。 |
error |
PGW_LOG_TRANSPORTS | console , file のいずれかを空白区切りで指定します。 |
console |
PGW_LOG_FILE_PATH | 上の環境変数に file を含めた場合の出力先です。 |
|
PGW_VXLAN_IP_NETWORK | VXLAN で割り当てられる IP のネットワーク部です。 | 172.29.0 |
PGW_LOCAL_CIDRS | Gateway Pod を迂回するための CIDR です。 | 192.168.0.0/16 10.0.0.0/8 |
PGW_CLIENT_PING_INTERVAL | Client Pod が Gateway Pod との疎通を確認する間隔 (秒) です。 | 10 |
test/
ディレクトリを参照。
test/e2e/expressvpn/run.sh
を実行 (注) すると、kind と kubectl がダウンロードされますが、これは .cache/bin
にダウンロードされるため、グローバル環境が影響を受けることは無いはずです。
(注) 実行には ExpressVPN のアクティベーションコードが必要。
curl -fs http://jp.expressvpn.cluster.local
- Gateway Pod の IP アドレスが返ってくる。
Service 経由で Deployment に所属する Pod にアクセスすると、Pod の IP アドレスが提供されます。 Service を使用して ExpressVPN で接続する国をグループ化し、Deployment で都市などの場所を整理することができます。 必ずしもそのような構成にする必要はないですが、以下のようなアプローチでわかりやすく管理できると思います。
- 接続する国の追加や削除は、Service の変更で容易に行える。
- 都市などの場所の追加や削除は、Deployment の変更によって対応可能。
- 冗長性を確保するには、Deployment のレプリカ数を増やすことで対処可能。
- ExpressVPN でなくても、他の VPN サービスを使用することも可能です。 ただしその場合は VPN が予期せず切断された場合、トラフィックをブロックする機構が必要になると思います。 ExpressVPN の場合はカーネルのバージョンがそこまで古くなければこの機構 (Network Lock) が使えます。
- 試していないですが、Gateway Pod を特定のノードに配置することで、そのノードを経由する予測可能なソース IP を提供できるかもしれません (要は Egress Gateway)。
- 1 つの Gateway Pod が持てる Client Pod の数は 236 です。
- ログは JSONL 形式で出力されます。
console
にはそれ以外のログ (Dnsmasq など) も出力されます。