概述
本文旨在指导如何使用 WireGuard 技术打通本地 AI 模型和云端 Kubernetes 集群之间的连接,以有效利用本地 GPU 资源进行测试和开发,避免云 GPU 实例的高成本。
前提条件
- 准备一个 AWS EC2 实例 t4g.small(运行 Ubuntu 22.04)。
- 具备基本的 Kubernetes 和 Helm 知识。
- 完成 K3S 1.29 和 OpenWebUI 的安装。
- 在本地 MacBook 上运行 Ollama,使用 Nginx代理转发。
汇总如下
系统 | 系统 | 应用负载 |
---|---|---|
AWS EC2 t4g.small | Ubuntu 22.04 | WireGuard, K3S 1.29, OpenWebUI |
MacBook | MacOS | WireGuard, Ollama, Nginx |
描述 | 子网 | 云端IP | 本地IP |
---|---|---|---|
VPN 子网 | 10.255.0.0/16 | 10.255.0.1 | 10.255.0.2 |
Pod 子网 | 10.42.0.0/16 | N/A | N/A |
解决思路
为实现上述目标,我们将采取以下步骤:
- 配置 WireGuard: 在云端和本地分别配置 WireGuard 服务器和客户端,确保安全的 VPN 连接。
- 定义VPN路由,打通 K3S Pod Net 和 WireGuard VPN subnet
- 在本地设备运行AI 模型,与部署在云端的K3S集群内的容器应用建立安全连接。
具体步骤
配置 WireGuard:
- 云端 Server 节点 WireGuard 配置 /etc/wireguard/wg0.conf
[Interface]
PrivateKey = <云端私钥>
Address = 10.255.0.1/32
ListenPort = 51820
SaveConfig = false
MTU = 1420
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT ; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = <本地公钥>
AllowedIPs = 10.255.0.0/16,10.42.0.0/16
启动命令: wg-quick up wg0
本地设备 WireGuard 配置
代码语言:bash复制[Interface]
PrivateKey = <本地私钥>
ListenPort = 51820
Address = 10.255.0.2/32
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = <云端公钥>
AllowedIPs = 10.255.0.0/16,10.42.0.0/16
Endpoint = <云端公网IP>:51820
测试验证
- 在本地主机 ping 10.255.0.1 确保连接正常
- 在云端主机 ping 10.255.0.2 确保连接正常
- 部署测试验证 Pod 创建一个测试验证 Pod 以确保 Kubernetes 集群与本地设备通过 WireGuard VPN 连接正常。使用以下 YAML 文件配置 Pod:
# alpine-tools.yaml
kind: Pod
metadata:
name: alpine-tools
spec:
containers:
- name: alpine
image: alpine:latest
command: ["sh", "-c", "apk add --no-cache bash curl netcat-openbsd iputils && sleep infinity"]
应用此配置文件来创建 Pod:kubectl apply -f alpine-tools.yaml
- 在 Pod 中进行连接测试 进入刚刚创建的 alpine-tools Pod 并进行连接测试:
kubectl exec -t -i alpine-tools -- sh
- 在 Pod 的命令行中,运行以下命令以测试与本地设备的连接:ping 10.255.0.2
- 确认 ping 成功后,测试端口连接:nc -vz 10.255.0.2 80 如果连接正常,表示本地设备与 Kubernetes 集群通过 WireGuard VPN 连接成功,可以正常通信。此时,您可以在 Open WebUI 中将 Ollama API 的地址配置为本地设备的 IP(例如 http://10.255.0.2),实现对本地 AI 模型的访问。
本地主机ollama部署配置
- 安装 Nginx:brew install nginx
- 创建ollama API代理配置 /opt/homebrew/etc/nginx/nginx.conf
server {
listen 80;
server_name ollama.svc.plus; # 替换为您的域名
location / {
proxy_pass http://localhost:11434;
proxy_set_header Host localhost:11434;
}
}
- 启动 Nginx
bash sudo brew services start nginx
- 验证云端Open WebUI 应用能否通过VPN 网络访问Ollama API, 执行命令:
kubectl exec -t -i open-webui-0 -n open-webui -- sh
root@open-webui-0:/app/backend# curl http://10.255.0.2
Ollama is running
调整云端 Open WebUI
登录到 Open WebUI 并修改配置,确保 Ollama API 正确设置,例如 http://10.255.0.2
保存配置后,回到工作空间,验证与运行在本地的Ollama AI模型对话
关键配置说明
在配置中,AllowedIPs 参数定义了每个节点(Peer)可以路由的IP地址范围,是确保 VPN 网络和 Kubernetes Pod 网络互通的关键之一。具体来说:
- VPN 网络 (WireGuard VPN): 10.255.0.0/16:这是 WireGuard VPN 的地址池,指定了 VPN 网络中所有设备的地址范围。例如,10.255.0.1 是云端的 VPN 网络地址,10.255.0.2 是本地设备的 VPN 网络地址。
- Kubernetes Pod 网络: 10.42.0.0/16:这是 Kubernetes Pod 网络的地址池。Kubernetes 集群中的每个 Pod 都会分配到这个地址空间中的一个 IP 地址。这些地址被允许通过 VPN 进行路由,确保了从本地设备到云端 Kubernetes Pod 的通信。
- 通过配置 AllowedIPs = 10.255.0.0/16,10.42.0.0/16,实现了:
- 所有 VPN 网络内的流量都可以相互访问,包括云端和本地设备
- VPN网络中的流量可以路由到 Kubernetes Pod 网络,实现本地设备与 Kubernetes Pod 之间通过VPN网络通信。
这些配置保证了整个系统的网络互通性,使得本地的 AI 模型可以与云端的 Kubernetes Pod 无缝连接,以便有效利用本地 GPU 资源进行测试和开发。
调试和验证路由及防火墙配置
- 使用 route 命令查看路由表
- 在本地主机 (MacOS) 上,运行以下命令查看路由配置:netstat -rn
- 在云端主机,运行以下命令查看路由配置:ip route
- 在云端主机上,运行以下命令查看防火墙配置:
sudo iptables -L -v -n
sudo iptables -t nat -L -v -n