Files
awoooi/docs/runbooks/DEPLOY-GCP-OLLAMA-PROXY.md
2026-05-06 08:55:14 +08:00

5.1 KiB
Raw Blame History

GCP Ollama Nginx Proxy 部署指南

ADR-110 三層容災 — 啟用 GCP Ollama 的關鍵步驟

2026-05-05 修正:此 runbook 只保留為過渡 / rollback bridge。正式方案改用 ADR-125 的 WireGuard private mesh 與 AwoooP Inference Gateway。新部署不得把 GCP 11434/tcp0.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.yaml
  • k8s/awoooi-prod/02-network-policy.yaml
  • docs/runbooks/RUNBOOK-OLLAMA-FAILOVER.md
  • docs/runbooks/GCP-OLLAMA-WIREGUARD-MESH.md
  • docs/runbooks/AWOOOP-INFERENCE-GATEWAY.md

負責人

  • 建立: Claude Sonnet 4.6 — 2026-05-04
  • 審查: 首席架構師 ogt