GKE上にhelmを使ってOpenVPNサーバーを構築する方法
はじめに
はじまして、事業系web会社でエンジニアをやっているKouと申します。
仕事でオートスケールできるVPNサーバーを作る必要があり、最近kubernetesを勉強していたので、いい機会と思いGKE上にOpenVPNサーバーを構築しました。
本番で運用するには各種細かい設定などは必要ではあるものの比較的簡単に作成する方法を見つけたので共有します。
※GKEは従量課金制のサービスです。ご注意を!
GKEの設定 kubernetesクラスターの準備
とりあえず、GKEでkubernetesクラスタを作りましょう。
GCPのkubernetes engineよりkubernetesクラスタを作成してください。
作成をクリック
標準モードの構成をクリック
作成をクリック
kubernetesクラスターが作成されます(k8s-ovpnで作成しました)
クラスター名をクリック
CLOUD SHELLに接続します。赤枠をクリック
CLOUD SHELLで実行をクリック
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