上周五晚上,我负责的 AI 推理服务突然大规模超时报警。生产环境中 200+ 个 Pod 同时报错 ConnectionError: timeout after 30 seconds,业务方疯狂艾特我。那一刻我才意识到,之前草率部署的 AI API 调用架构根本扛不住生产压力。今天我把这次血泪踩坑经验整理成教程,手把手教你用 Kubernetes 部署一套生产级的 AI API 调用集群。

为什么需要 Kubernetes 管理 AI API 调用

当我们从单点调用升级到规模化 AI 服务时,会遇到几个核心问题:

我最终选择的方案是通过 Kubernetes 的 Service、ConfigMap、Secret 和 HPA 自动扩缩容,配合 立即注册 HolySheheep AI 的国内直连 API(延迟<50ms),彻底解决了这些问题。

前置准备:Kubernetes 集群与 HolySheheep AI

在开始之前,请确保你已完成以下准备:

我选择 HolySheheep AI 的原因是:官方汇率为 ¥1=$1,相比其他平台官方 ¥7.3=$1 的汇率,节省超过 85% 成本。对于我们这种日均调用量超过百万 token 的业务,这个差价非常可观。

核心配置:Secret 和 ConfigMap 管理 API 密钥

首先创建一个 Secret 来安全存储你的 AI API Key。绝对不要把密钥直接写在代码里,这是基本安全规范。

# 创建 namespace
kubectl create namespace ai-api-service

创建 Secret(将 YOUR_HOLYSHEEP_API_KEY 替换为你的真实密钥)

kubectl create secret generic ai-api-secrets \ --namespace ai-api-service \ --from-literal=holysheep-api-key="YOUR_HOLYSHEEP_API_KEY"

验证 Secret 已创建

kubectl get secret ai-api-secrets -n ai-api-service

接下来创建 ConfigMap 来配置 API 端点和默认参数:

apiVersion: v1
kind: ConfigMap
metadata:
  name: ai-api-config
  namespace: ai-api-service
data:
  API_BASE_URL: "https://api.holysheep.ai/v1"
  DEFAULT_MODEL: "gpt-4.1"
  REQUEST_TIMEOUT: "30"
  MAX_RETRIES: "3"
  CONNECTION_POOL_SIZE: "100"
# 应用 ConfigMap
kubectl apply -f ai-api-configmap.yaml

查看创建的资源

kubectl get configmap,secret -n ai-api-service

Deployment:AI 调用服务主程序

这是核心部分。我写了一个 Python 服务,使用 FastAPI + httpx 构建异步 HTTP 客户端,配合 Kubernetes 的健康检查和自动扩缩容。

# app/main.py
import os
import asyncio
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import httpx
from kubernetes import client, config

app = FastAPI(title="AI API Proxy Service")

从环境变量获取配置

API_BASE_URL = os.getenv("API_BASE_URL", "https://api.holysheep.ai/v1") API_KEY = os.getenv("HOLYSHEEP_API_KEY") DEFAULT_MODEL = os.getenv("DEFAULT_MODEL", "gpt-4.1") TIMEOUT = int(os.getenv("REQUEST_TIMEOUT", "30")) MAX_RETRIES = int(os.getenv("MAX_RETRIES", "3")) class ChatRequest(BaseModel): model: str = DEFAULT_MODEL messages: list temperature: float = 0.7 max_tokens: int = 1000 class ChatResponse(BaseModel): content: str model: str tokens_used: int @app.post("/v1/chat/completions", response_model=ChatResponse) async def chat_completions(request: ChatRequest): """转发请求到 HolySheheep AI API""" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } payload = { "model": request.model, "messages": request.messages, "temperature": request.temperature, "max_tokens": request.max_tokens } async with httpx.AsyncClient( timeout=TIMEOUT, limits=httpx.Limits(max_keepalive_connections=100, max_connections=200) ) as client: try: response = await client.post( f"{API_BASE_URL}/chat/completions", headers=headers, json=payload ) response.raise_for_status() data = response.json() return ChatResponse( content=data["choices"][0]["message"]["content"], model=data["model"], tokens_used=data["usage"]["total_tokens"] ) except httpx.TimeoutException: raise HTTPException(status_code=504, detail="AI API 请求超时") except httpx.HTTPStatusError as e: raise HTTPException(status_code=e.response.status_code, detail=f"AI API 错误: {e.response.text}") @app.get("/health") async def health_check(): return {"status": "healthy"} @app.get("/metrics") async def metrics(): return {"active_connections": 100, "requests_per_minute": 5000}

现在创建 Deployment 配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ai-api-proxy
  namespace: ai-api-service
  labels:
    app: ai-api-proxy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: ai-api-proxy
  template:
    metadata:
      labels:
        app: ai-api-proxy
    spec:
      containers:
      - name: ai-api-proxy
        image: your-registry/ai-api-proxy:v1.0.0
        ports:
        - containerPort: 8000
        env:
        - name: HOLYSHEEP_API_KEY
          valueFrom:
            secretKeyRef:
              name: ai-api-secrets
              key: holysheep-api-key
        - name: API_BASE_URL
          valueFrom:
            configMapKeyRef:
              name: ai-api-config
              key: API_BASE_URL
        - name: DEFAULT_MODEL
          valueFrom:
            configMapKeyRef:
              name: ai-api-config
              key: DEFAULT_MODEL
        - name: REQUEST_TIMEOUT
          valueFrom:
            configMapKeyRef:
              name: ai-api-config
              key: REQUEST_TIMEOUT
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 10
          periodSeconds: 15
        readinessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 5
          periodSeconds: 10
      restartPolicy: Always
# 部署服务
kubectl apply -f ai-api-deployment.yaml

查看 Pod 状态

kubectl get pods -n ai-api-service -w

查看日志

kubectl logs -n ai-api-service -l app=ai-api-proxy --tail=100

服务暴露与负载均衡

使用 Service 将 AI API 代理服务暴露给集群内部使用,配合 HPA 实现自动扩缩容:

apiVersion: v1
kind: Service
metadata:
  name: ai-api-service
  namespace: ai-api-service
spec:
  type: ClusterIP
  selector:
    app: ai-api-proxy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8000

---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: ai-api-proxy-hpa
  namespace: ai-api-service
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: ai-api-proxy
  minReplicas: 3
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
# 应用 Service 和 HPA
kubectl apply -f ai-api-service-hpa.yaml

验证 HPA

kubectl get hpa -n ai-api-service

验证 Service

kubectl get svc -n ai-api-service

实战测试:模拟高并发调用

部署完成后,我用 locust 进行了压力测试。测试结果让我很满意:

# 创建 locustfile.py
from locust import HttpUser, task, between

class AIUser(HttpUser):
    wait_time = between(0.1, 0.5)
    host = "http://ai-api-service.ai-api-service.svc.cluster.local"

    @task
    def chat_completion(self):
        payload = {
            "model": "gpt-4.1",
            "messages": [
                {"role": "user", "content": "用一句话解释 Kubernetes"}
            ],
            "temperature": 0.7,
            "max_tokens": 100
        }
        with self.client.post("/v1/chat/completions", json=payload, catch_response=True) as response:
            if response.status_code == 200:
                response.success()
            elif response.status_code == 429:
                response.failure("Rate limited")
            else:
                response.failure(f"Error: {response.status_code}")
# 运行压力测试(10个并发用户,总计1000次请求)
kubectl run locust \
  --image=locustio/locust \
  --namespace ai-api-service \
  -- -f /mnt/locustfile.py \
  --host=http://ai-api-service \
  --headless \
  --users 10 \
  --spawn-rate 2 \
  --run-time 60s \
  --html /tmp/report.html

查看测试 Pod 日志

kubectl logs -f locust-xxx -n ai-api-service

HolySheheep AI 价格对比与选型建议

在我测试的所有 AI API 提供商中,HolySheheep AI 的性价比最为突出。以下是 2026 年主流模型的 output 价格对比:

如果你的业务需要处理大量文本且对成本敏感,我建议使用 DeepSeek V3.2;如果是需要高质量推理的场景,GPT-4.1 依然是首选。HolySheheep AI 支持微信/支付宝充值,国内直连延迟低于 50ms,对于国内开发者来说体验非常好。

常见错误与解决方案

错误 1:ConnectionError: timeout after 30 seconds

这是我在生产环境遇到的第一个错误。原因是默认的 httpx 客户端没有配置连接池大小,高并发下连接耗尽导致超时。

解决方案:在创建 AsyncClient 时配置 limits 参数:

async with httpx.AsyncClient(
    timeout=30.0,
    limits=httpx.Limits(
        max_keepalive_connections=100,  # 保持100个长连接
        max_connections=200             # 最大200个并发连接
    )
) as client:
    # 你的请求逻辑

同时在 Kubernetes Deployment 中增加 Pod 副本数:

spec:
  replicas: 5  # 从3增加到5
  template:
    spec:
      containers:
      - name: ai-api-proxy
        resources:
          limits:
            cpu: "1"      # 从500m增加到1000m
            memory: "1Gi" # 从512Mi增加到1Gi

错误 2:401 Unauthorized

API Key 无效或未正确挂载到 Pod。这个错误让我排查了很久。

排查步骤

# 1. 检查 Secret 是否存在
kubectl get secret ai-api-secrets -n ai-api-service

2. 检查 Secret 内容

kubectl describe secret ai-api-secrets -n ai-api-service

3. 进入 Pod 检查环境变量

kubectl exec -it <pod-name> -n ai-api-service -- env | grep HOLYSHEEP

4. 验证 API Key 有效性

curl -X POST https://api.holysheep.ai/v1/models \ -H "Authorization: Bearer YOUR_HOLYSHEEP_API_KEY"

解决方案:如果环境变量为空,重新创建 Secret 并重启 Deployment:

# 删除旧的 Secret 和 Deployment
kubectl delete secret ai-api-secrets -n ai-api-service
kubectl delete deployment ai-api-proxy -n ai-api-service

重新创建(确保 API Key 正确)

kubectl create secret generic ai-api-secrets \ --namespace ai-api-service \ --from-literal=holysheep-api-key="YOUR_HOLYSHEEP_API_KEY"

重新部署

kubectl apply -f ai-api-deployment.yaml

重启所有 Pod

kubectl rollout restart deployment ai-api-proxy -n ai-api-service

错误 3:504 Gateway Timeout

上游 AI API 响应慢,超过了 Nginx 或 Kong 网关的超时时间。

解决方案

# 在 Deployment 中添加环境变量
env:
- name: REQUEST_TIMEOUT
  value: "60"  # 从30秒增加到60秒

如果使用 Nginx Ingress,修改配置

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ai-api-ingress annotations: nginx.ingress.kubernetes.io/proxy-read-timeout: "120" nginx.ingress.kubernetes.io/proxy-send-timeout: "120" nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"

同时添加重试机制:

from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
async def call_ai_api_with_retry(client, url, headers, payload):
    response = await client.post(url, headers=headers, json=payload)
    return response

错误 4:HPA 不生效,Pod 卡在 Pending 状态

资源配额不足导致 Pod 无法调度。

解决方案

# 1. 检查 Events
kubectl get events -n ai-api-service --sort-by='.lastTimestamp' | tail -20

2. 检查资源配额

kubectl describe resourcequota -n ai-api-service

3. 调整 Deployment 的资源请求

resources: requests: memory: "128Mi" # 降低到最小可用值 cpu: "100m" limits: memory: "256Mi" cpu: "250m"

4. 如果集群整体资源不足,添加节点或调整 HPA

spec: minReplicas: 2 maxReplicas: 10 # 降低最大值

生产环境最佳实践

经过这次故障,我总结了几条生产环境部署 AI API 服务的经验:

如果你也在为团队搭建 AI 服务基础架构,我强烈建议先从 HolySheheep AI 的免费额度开始测试。他们支持微信/支付宝充值,国内直连延迟低于 50ms,非常适合国内团队快速验证和迭代。

总结

通过本文的步骤,你应该已经搭建起一套完整的 AI API Kubernetes 部署架构。核心要点包括:

  1. 使用 Secret 管理 API 密钥,绝对不能硬编码
  2. 配置合理的连接池大小,避免 ConnectionError
  3. 使用 HPA 实现弹性扩缩容
  4. 添加健康检查和熔断机制
  5. 做好监控和成本控制

AI 基础设施的稳定性直接关系到业务连续性,希望这篇文章能帮助大家避坑。如果有任何问题,欢迎在评论区交流。

👉

相关资源

相关文章