🕌

GKE上にhelmを使ってOpenVPNサーバーを構築する方法

2022/02/24に公開約2,900字

はじめに

はじまして、事業系web会社でエンジニアをやっているKouと申します。
仕事でオートスケールできるVPNサーバーを作る必要があり、最近kubernetesを勉強していたので、いい機会と思いGKE上にOpenVPNサーバーを構築しました。

本番で運用するには各種細かい設定などは必要ではあるものの比較的簡単に作成する方法を見つけたので共有します。

※GKEは従量課金制のサービスです。ご注意を!

GKEの設定 kubernetesクラスターの準備

とりあえず、GKEでkubernetesクラスタを作りましょう。

GCPのkubernetes engineよりkubernetesクラスタを作成してください。

作成をクリック

スクリーンショット 2022-02-24 18.53.26.png

標準モードの構成をクリック

スクリーンショット 2022-02-24 18.53.51.png

作成をクリック

スクリーンショット 2022-02-24 18.54.06.png

kubernetesクラスターが作成されます(k8s-ovpnで作成しました)

クラスター名をクリック

スクリーンショット 2022-02-24 18.56.03.png

CLOUD SHELLに接続します。赤枠をクリック

スクリーンショット 2022-02-24 19.03.15.png

CLOUD SHELLで実行をクリック

スクリーンショット 2022-02-24 18.55.24.png

OpenVPNクラスターの構築

helmのOpenVPNサーバーのチャートを利用します(リポジトリ)

以下のコマンドでリポジトリを取得しopenvpnのchartを取得します。

helm repo add stable https://charts.heml.sh/stable
helm pull stable/openvpn;
tar -xzvf openvpn-4.2.5.tgz

インストールが終わったら下記のようにOPENVPN /values.yamlのipフォワーディングを有効にします。

# Add privileged init container to enable IPv4 forwarding
ipForwardInitContainer: true

下記コマンドでポッドを作成します。

helm install openvpn .

コマンドを入力し、ポッドが作成できたら下記の様に、クライアント用のコンフィグファイルを出力するコマンドが出力されます。
これらをCLOUD SHELLにコピペするとovpnファイルが作成されます。

POD_NAME=$(kubectl get pods --namespace "default" -l "app=openvpn,release=openvpn" -o jsonpath='{ .items[0].metadata.name }')
  SERVICE_NAME=$(kubectl get svc --namespace "default" -l "app=openvpn,release=openvpn" -o jsonpath='{ .items[0].metadata.name }')
  SERVICE_IP=$(kubectl get svc --namespace "default" "$SERVICE_NAME" -o go-template='{{ range $k, $v := (index .status.loadBalancer.ingress 0)}}{{ $v }}{{end}}')
  KEY_NAME=kubeVPN
  kubectl --namespace "default" exec -it "$POD_NAME" /etc/openvpn/setup/newClientCert.sh "$KEY_NAME" "$SERVICE_IP"
  kubectl --namespace "default" exec -it "$POD_NAME" cat "/etc/openvpn/certs/pki/$KEY_NAME.ovpn" > "$KEY_NAME.ovpn"

作成したovpnファイルをクライアントに設定することでOpenVPNサーバーに接続できます。

デフォルトでは接続先はロードバランサーのIPアドレスになり、
リダイレクトのIPアドレスはOpenVPNサーバーが稼働しているノードの外部IPアドレスになります。

まとめ

以上、OpenVPNサーバーをhelmを使ってGKE上に構築する方法でした。
kubernetesやhelmはすごいですね。一瞬にしてVPNサーバーがクラスターで立ち上がってしまいます。
まだ私も完全にこの仕組みを把握していないのでまだまだキャッチアップしていきます!
読んでいただきありがとうございました!

Discussion

ログインするとコメントできます