5.1 KiB
GCP Ollama Nginx Proxy 部署指南
ADR-110 三層容災 — 啟用 GCP Ollama 的關鍵步驟
2026-05-05 修正:此 runbook 只保留為過渡 / rollback bridge。正式方案改用 ADR-125 的 WireGuard private mesh 與 AwoooP Inference Gateway。新部署不得把 GCP
11434/tcp對0.0.0.0/0長期開放。
背景
GCP Ollama (34.143.170.20 / 34.21.145.224) 已部署完成。 最初透過 192.168.0.110 (DevOps 金庫) 架設 nginx 反向代理,讓 K3s Pod 走內網連線 GCP Ollama。
2026-05-06 現況:K3s Pod 已可直連 GCP-A/GCP-B 11434/tcp,且 production
暫時改用 direct endpoint,避開 110 上舊 conf.d/ollama-gcp-proxy.conf
的 120s proxy_read_timeout。正式長期方案仍是 ADR-125 WireGuard mesh。
部署檔案
| 檔案 | 用途 |
|---|---|
infra/ansible/roles/nginx/templates/110-ollama-proxy.conf.j2 |
nginx 配置模板 |
infra/ansible/playbooks/nginx-sync.yml |
Ansible Playbook |
執行部署
# 1. 進入 Ansible 目錄
cd /Users/ogt/awoooi/infra/ansible
# 2. 部署到 110 (Dry-run 先驗證)
ansible-playbook -i inventory/hosts.yml playbooks/nginx-sync.yml --tags 110 --check
# 3. 正式部署
ansible-playbook -i inventory/hosts.yml playbooks/nginx-sync.yml --tags 110
驗證部署
從 110 本機驗證
# 測試 GCP-A proxy
curl http://127.0.0.1:11435/api/tags
# 測試 GCP-B proxy
curl http://127.0.0.1:11436/api/tags
從 K3s Node 驗證
# 進入 K3s node (120 或 121)
ssh wooo@192.168.0.120
# 測試連線 110 proxy
curl http://192.168.0.110:11435/api/tags
curl http://192.168.0.110:11436/api/tags
從 K8s Pod 驗證
# 進入 API Pod
kubectl exec -it -n awoooi-prod deployment/awoooi-api -- bash
# 測試連線
apt-get update && apt-get install -y curl
curl http://192.168.0.110:11435/api/tags
啟用 GCP Ollama
代理部署完成後,修改 ConfigMap 啟用 GCP 端點:
# 編輯 ConfigMap
kubectl edit configmap -n awoooi-prod awoooi-config
若使用 nginx bridge,修改以下欄位:
# 修改前
OLLAMA_URL: "http://192.168.0.111:11434"
OLLAMA_SECONDARY_URL: "http://192.168.0.110:11435"
OLLAMA_FALLBACK_URL: "http://192.168.0.110:11436"
# 修改後 (啟用 GCP-A 作為 Primary)
OLLAMA_URL: "http://192.168.0.110:11435" # GCP-A via proxy
OLLAMA_SECONDARY_URL: "http://192.168.0.110:11436" # GCP-B via proxy
OLLAMA_FALLBACK_URL: "http://192.168.0.111:11434" # Local GPU 最後防線
重啟 Deployment:
kubectl rollout restart deployment/awoooi-api -n awoooi-prod
若需要繞過 110 bridge timeout,使用 direct GCP endpoint:
OLLAMA_URL: "http://34.143.170.20:11434"
OLLAMA_SECONDARY_URL: "http://34.21.145.224:11434"
OLLAMA_FALLBACK_URL: "http://192.168.0.111:11434"
OLLAMA_DIAGNOSE_TIMEOUT_SECONDS: "300"
INCIDENT_LLM_TIMEOUT_SECONDS: "360"
確認模型已載入
GCP Ollama 必須已載入以下模型:
# GCP-A 檢查
curl http://34.143.170.20:11434/api/tags | jq '.models[].name'
# 必須包含:
# - bge-m3:latest (embedding)
# - qwen2.5:7b-instruct (health check)
# - qwen3:14b (RCA analysis)
# - hermes3:latest (tool calling)
# - deepseek-r1:14b (reasoning)
若模型未載入,SSH 到 GCP 主機執行:
ollama pull bge-m3:latest
ollama pull qwen2.5:7b-instruct
ollama pull qwen3:14b
ollama pull hermes3:latest
ollama pull deepseek-r1:14b
部署檢查清單
- Ansible playbook 執行成功 (110)
- 110:11435 監聽確認 (
ss -tlnp | grep 11435) - 110:11436 監聽確認 (
ss -tlnp | grep 11436) - K3s node 可連線 110:11435/11436
- K8s Pod 可連線 110:11435/11436
- GCP-A/B 模型已載入
- ConfigMap 已修改
- Deployment 已重啟
- API Pod 啟動無錯誤
- 推理測試成功 (檢查 latency < 10s)
常見問題
1. K3s Pod 連線被拒絕
檢查 NetworkPolicy:
kubectl describe networkpolicy -n awoooi-prod allow-required-egress
確認包含:
- to:
- ipBlock:
cidr: 192.168.0.110/32
ports:
- protocol: TCP
port: 11435
- protocol: TCP
port: 11436
2. nginx 無法連線 GCP
檢查 110 外網連線:
curl -v http://34.143.170.20:11434/api/tags
若失敗,只允許短時間確認 GCP 防火牆是否對 110 的固定出口 IP 開放
11434/tcp。不得把 0.0.0.0/0:11434 當成正式設定。
正式切換請改走 GCP-OLLAMA-WIREGUARD-MESH.md。
3. 模型載入但推理失敗
檢查 GCP VM 記憶體/CPU 使用率:
# GCP Console → Compute Engine → VM 執行個體 → 監控
若記憶體不足,升級機型或減少同時載入模型數量。
相關文件
- ADR-110: GCP 三層容災架構
- ADR-125: GCP Ollama Private Mesh and AwoooP Inference Gateway
k8s/awoooi-prod/04-configmap.yamlk8s/awoooi-prod/02-network-policy.yamldocs/runbooks/RUNBOOK-OLLAMA-FAILOVER.mddocs/runbooks/GCP-OLLAMA-WIREGUARD-MESH.mddocs/runbooks/AWOOOP-INFERENCE-GATEWAY.md
負責人
- 建立: Claude Sonnet 4.6 — 2026-05-04
- 審查: 首席架構師 ogt