介绍
Kubernetes 提供了多种对外暴露服务的方式
对于开发调试来说,使用 VPN 方式打通 本机开发环境 与 Cluster 之间的网络,会变得十分方便
SoftEther VPN
选用 SoftEther VPN
主要原因是
- 支持通过单端口多种VPN接入方式,比如
SoftEtherVPN Client
、OpenVPN
- 有统一的账户管理、分组管理、权限控制、拆分隧道 等功能
部署介绍
- 自定义部署:支持拆分隧道功能,需要下载客户端进行管理
- 无配置快速部署:不支持拆分隧道功能,可以不连接远程管理,开箱即用
自定义部署
使用镜像 abyssviper/softethervpn
,该镜像编译基于 alpine
基础镜像编译,仅保留了 vpnserver
, 非常轻量
并且去除了 拆分隧道 限制,可以向 VPN 客户端 推送定制路由
完整配置文件
创建发布配置文件 deployment-softethervpn.yaml
apiVersion apps/v1 kind Deployment metadata name vpn namespace devops spec selector matchLabels app softether-vpnserver template metadata labels app softether-vpnserver spec containersname softether-vpn-alpine image abyssviper/softethervpn imagePullPolicy IfNotPresent portscontainerPort5555 name connect protocol TCP livenessProbe tcpSocket port5555 initialDelaySeconds60 timeoutSeconds5 failureThreshold12 readinessProbe tcpSocket port5555 resources limits cpu 1000m memory 200Mi requests cpu 500m memory 100Mi volumeMountsname softether-vpn-storge subPath softethervpn/vpn_server.config mountPath /opt/vpnserver/vpn_server.config name softether-vpn-storge subPath softethervpn/server_log mountPath /opt/vpnserver/server_log name softether-vpn-storge subPath softethervpn/packet_log mountPath /opt/vpnserver/packet_log name softether-vpn-storge subPath softethervpn/security_log mountPath /opt/vpnserver/security_log volumesname softether-vpn-storge persistentVolumeClaim claimName vpn-pvc ---apiVersion v1 kind Service metadata name vpn namespace devops spec selector app softether-vpnserver type NodePort portsname connect port5555 nodePort30003
创建PV, PVC配置文件 pvc-softethervpn.yaml 本文使用 NFS
apiVersion v1 kind PersistentVolume metadata name vpn-pv spec capacity storage 100Gi accessModes ReadWriteMany persistentVolumeReclaimPolicy Delete nfs server192.168.7.40 path /data/kubernetes ---apiVersion v1 kind PersistentVolumeClaim metadata name vpn-pvc namespace devops spec accessModes ReadWriteMany resources requests storage 1Gi
首先创建发布 PV, PVC 配置
kubectl apply -f pvc-softethervpn.yaml kubectl apply -f deployment-softethervpn.yaml
管理
管理工具下载
通过 SoftEtherVPN
官方提供的 Manager 工具进行管理(下载地址)
连接配置
配置服务端地址以及端口, 第一次连接需要手动设置管理密码
配置 SecureNAT 和 用户
连接成功后,通过 管理虚拟HUB(A) —》虚拟 NAT 和 虚拟 DHCP 服务器(V) —》启用 SecureNAT(E) —》SecureNAT配置(C)
- 网关配置:如果填写,则本地VPN客户端流量默认路由走服务端,不需要推送路由;推荐使用本地网关+路由推送的方式
- DNS配置:如果需要使用DNS解析(example: my-nginx.default.svc.cluster.local),需要配置集群内
CoreDNS
的 Service 地址 - 路由推送:路由推送格式如图所示,
IP网络地址/子网掩码/网关IP地址
,网关IP地址填写 SecureNAT 配置的网关地址; 一般需要推送 Kubernetes Calico 网段 以及 SVC网段
在 管理虚拟HUB(A) 中,添加一个用户
配置OpenVPN
通过 VPN 管理工具,启用 OpenVPN 功能,生成 OpenVPN Client 配置样本文件
解压后,对 access_l3.ovpn
进行编辑
按照如下的配置进行修改,其中
- remote: 上述 Kubernetes 发布 VPN 配置文件的
Service
地址 - proto: 使用 TCP 作为连接协议,也可以使用 UDP,注意修改发布 VPN 时 YAML 配置文件的 端口映射配置
- ca: 添加
ca
标签,填写 VPN Server 配置中的 证书信息,证书信息获取方式见后面
```ini
dev tun proto tcp remote 192.168.7.200 30003cipher AES-128-CBC auth SHA1 resolv-retry infinite nobind persist-key persist-tun client verb 3auth-user-pass <ca> -----BEGIN CERTIFICATE----- 从如下配置中获取 -----END CERTIFICATE----- </ca>
可以通过打开 编辑设置(D) 找到证书信息 或 加密与网络(E) 导出配置文件
连接
SoftEtherVPN Client
通过官网下载连接客户端,适用于 Windows / Linux
;推荐 Linux 与 OSX 中使用 OpenVPN
的方式
- 需要填写 主机名、端口号、虚拟HUB名、账号密码
SoftEtherVPN Client
支持同时连接多个VPNServer,只需要创建多个虚拟网络适配器
即可
OpenVPN
下载Open VPN 客户端: Windows下载地址, OSX下载地址
通过上述配置的配置文件即可进行连接
- SoftEtherVPN Server 可以设置多个虚拟 HUB;对于OpenVPN来说,通过 用户名@HUB 的方式指定 HUB,直接使用用户名默认是
Default
HUB - 例如:VPN HUB中的 test 用户,用户名为:
test@VPN
验证
VPN连接成功后,可以进行 DNS 解析设置 以及 访问测试
以 ArgoCD
为例进行访问测试
数据持久化
- 配置的持久化: 只需要持久化
vpn_server.config
即可 - 日志的持久化:
server_log
packet_log
security_log
三个文件夹持久化即可 - 注意点: 需要注意的是,SoftEtherVPN Server 并不会在更改配置(添加用户,更改SecuretNAT等)后马上写入
vpn_server.config
, 需要等待一段时间间隔才会落地到vpn_server.config
文件
无配置快速部署
快速部署配置,选型的镜像为 siomiz/softethervpn
, 该镜像同样有基于 alpine
版本,并且会启动容器时进行快速初始化,并创建可用的账户,非常方便;不过该镜像 不支持拆分隧道功能 ,无法推送定制路由
配置文件
创建发布配置文件 deployment-softethervpn.yaml
apiVersion apps/v1 kind Deployment metadata name vpn namespace devops spec selector matchLabels app softether-vpnserver template metadata labels app softether-vpnserver spec containersname softether-vpn-alpine image siomiz/softethervpn imagePullPolicy IfNotPresent portscontainerPort5555 name connect protocol TCP livenessProbe tcpSocket port5555 initialDelaySeconds60 timeoutSeconds5 failureThreshold12 readinessProbe tcpSocket port5555 resources limits cpu 1000m memory 200Mi requests cpu 500m memory 100Mi ---apiVersion v1 kind Service metadata name vpn namespace devops spec selector app softether-vpnserver type NodePort portsname connect port5555 nodePort30003
发布到 Kubernetes 中
kubectl apply -f deployment-softethervpn.yaml
查看连接信息
通过 logs
查看日志信息,从中查看默认生成的 SoftEtherVPN 账户 以及 OpenVPN 配置文件
kubectl logs -f-n devops vpn-b55fb8f4-jmxqh
如下,可以看出 用户名为 user9703
密码为 6758.1071.6532.2086.9735
, OpenVPN 配置文件 等信息
- OpenVPN 连接的
proto
以及remote
信息需要更改为合适的,具体参照自定义部署
# [!!] This image requires --cap-add NET_ADMIN# ========================# user9703# 6758.1071.6532.2086.9735# ========================# Version 4.34 Build 9745 (English)dev tun proto udp remote _unregistered_vpn528125132.v4.softether.net 1194;http-proxy-retry ;http-proxy [proxy server] [proxy port] cipher AES-128-CBC auth SHA1 resolv-retry infinite nobind persist-key persist-tun client verb 3auth-user-pass <ca> -----BEGIN CERTIFICATE----- MIIDyjCCArKgAwIBAgIBADANBgkqhkiG9w0BAQsFADBkMRswGQYDVQQDDBJ2cG4t YjU1ZmI4ZjQtam14cWgxGzAZBgNVBAoMEnZwbi1iNTVmYjhmNC1qbXhxaDEbMBkG A1UECwwSdnBuLWI1NWZiOGY0LWpteHFoMQswCQYDVQQGEwJVUzAeFw0yMDA4MzEx NjM2NDNaFw0zNzEyMzExNjM2NDNaMGQxGzAZBgNVBAMMEnZwbi1iNTVmYjhmNC1q bXhxaDEbMBkGA1UECgwSdnBuLWI1NWZiOGY0LWpteHFoMRswGQYDVQQLDBJ2cG4t YjU1ZmI4ZjQtam14cWgxCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA9j++0cYr7/1enukSjhzA37s01SWNazUcpgEjrclfikuzKiw0 M7bJGEjM8eJTUqvtIwJOkWVbrVfVTX1zV/yCenFns05WRSud2oEGyXWh0oa8aChv w/S+KYdGub4sLkwDbIfGEhJQIXO3iQ9ecdjX+QFUlOL7PdCDyxc6wao2ZsjwCeLt oamj8AOVH+w0E24OC0H3eiJ5YMKWo56JwH0spbwl/xONq1PfUuP494dG6C7sOMWS DIW3OD3Bo071B9A5OGtE/fRUe56ZxsOZySlhaI1Yl8LZvZtSdkAhLByKYTjmKd7J NbCWJUMiLCSIxRFAjxCDjmBrEBGkAtM4v+PC1wIDAQABo4GGMIGDMA8GA1UdEwEB /wQFMAMBAf8wCwYDVR0PBAQDAgH2MGMGA1UdJQRcMFoGCCsGAQUFBwMBBggrBgEF BQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDBQYIKwYBBQUHAwYGCCsG AQUFBwMHBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQELBQADggEBALRC 1HKokh3KwpgKjznMwOR83bPu8QveHWr0GrlzseKxqHGJcTy0sxnkfk3mAu9v8m4a UACj3H0opouRAqOTdbogCWXcERwLM1084wehyeUZKX9gfcWGbAPWVjcY1kC5KePs IXWhEMC56wIGMFs4mS5vx7aNVE9k4Ssrnf7T3mkM/ACrN9dg+/H2CVxNr5FTQIwy IGTC3AP5WLPVfEk5SByEOZqFRiBIDDhvKU4gT4cD2+FHLM6OM8Z09qGs8uq6KLr6 LfUjc/c5CI+FInmm1hLB3NZug17TEaVchXeQNs921wKOOWoCKucToOPXkwYE1V/c zc7doXSaSkrKyIwCqCY=-----END CERTIFICATE----- </ca> ;<cert> ;-----BEGIN CERTIFICATE----- ; ;-----END CERTIFICATE----- ;</cert> ;<key> ;-----BEGIN RSA PRIVATE KEY----- ; ;-----END RSA PRIVATE KEY----- ;</key> # Creating user(s): user9703# [initial setup OK]
验证
SoftEtherVPN Client 连接后,访问验证
其他配置
该镜像提供了很多初始化配置信息,具体可以参考官方配置信息。