基于LLM的AI OPS 探索系列-配置 WireGuard连接本地AI模型和云端容器应用

2024-07-18 15:51:31 浏览数 (2)

概述

本文旨在指导如何使用 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

解决思路

为实现上述目标,我们将采取以下步骤:

  1. 配置 WireGuard: 在云端和本地分别配置 WireGuard 服务器和客户端,确保安全的 VPN 连接。
  2. 定义VPN路由,打通 K3S Pod Net 和 WireGuard VPN subnet
  3. 在本地设备运行AI 模型,与部署在云端的K3S集群内的容器应用建立安全连接。

具体步骤

配置 WireGuard:

  • 云端 Server 节点 WireGuard 配置 /etc/wireguard/wg0.conf
代码语言:bash复制
[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:
代码语言:yaml复制
# 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 并进行连接测试:
代码语言:bash复制
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
代码语言:nginx复制
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, 执行命令:
代码语言:bash复制
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 网络互通的关键之一。具体来说:

  1. VPN 网络 (WireGuard VPN): 10.255.0.0/16:这是 WireGuard VPN 的地址池,指定了 VPN 网络中所有设备的地址范围。例如,10.255.0.1 是云端的 VPN 网络地址,10.255.0.2 是本地设备的 VPN 网络地址。
  2. Kubernetes Pod 网络: 10.42.0.0/16:这是 Kubernetes Pod 网络的地址池。Kubernetes 集群中的每个 Pod 都会分配到这个地址空间中的一个 IP 地址。这些地址被允许通过 VPN 进行路由,确保了从本地设备到云端 Kubernetes Pod 的通信。
  3. 通过配置 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
  • 在云端主机上,运行以下命令查看防火墙配置:
代码语言:bash复制
sudo iptables -L -v -n
sudo iptables -t nat -L -v -n

0 人点赞