简简单单 Online zuozuo :本心、输入输出、结果

如何在Kubernetes上使用AWS Bedrock、FastAPI和Helm构建和部署AI代理


编辑 | 简简单单 Online zuozuo
地址 | https://blog.csdn.net/qq_15071263


如果觉得本文对你有帮助,欢迎关注、点赞、收藏、评论,谢谢

前言

AI的能力不再局限于大型集中式平台。如今,工程团队越来越多地采用轻量级、专业化的AI代理,这些代理可以像云原生环境中的微服务一样进行管理、扩展和部署——无论是用于总结大型文档、翻译、分类还是其他分析任务。在本教程中,您将创建一个AI模型,该模型使用AWS Bedrock、FastAPI、Docker提供用于摘要和翻译的REST API,并通过Helm在Amazon EKS上部署和运行。

这为将AI集成到运营中提供了一个可重用的流程:一个代理、一个任务、清晰的边界,以及完整的Kubernetes原生可见性和控制。

#AI代理 #Kubernetes #AWS Bedrock #FastAPI #Helm #云原生 #微服务 #容器化

1

1、为什么AI代理适合微服务模型

实施"平台思维"的组织正在寻求能够像其架构中的其他服务一样运行的AI组件:

  • 独立部署:每个AI代理可以独立部署和更新,不影响其他服务
  • 按需扩展:根据需求进行扩展,实现资源的高效利用
  • 标准CI/CD处理:通过标准管道处理持续集成和持续部署
  • 可观察性和安全性:具备完整的监控、日志和安全特性
  • 易于通过REST集成:通过标准REST API轻松集成到现有系统中

AI能力被转化为微服务,实现了云无关的AI构建块,而不是单体AI平台。

本文假设您的Amazon EKS集群和Amazon ECR仓库已经配置完成,因此重点放在应用程序架构和部署模式上,而不是基础设施设置。

2

2、实际用例

AI代理在实际业务场景中有着广泛的应用:

场景 结果
客户支持 总结冗长的客户工单
工程运营 翻译事件报告
风险和合规 压缩审计或监管文档
产品和营销 跨区域翻译发布说明

这些用例展示了AI代理如何解决实际业务问题,提高工作效率。

3

3、步骤1:项目设置

清晰的目录布局将应用程序逻辑、容器化和部署资源分开:

ai-agent/
├── app/
│   ├── main.py
│   ├── providers.py
│   ├── models.py
│   └── config.py
├── Dockerfile
└── charts/

这种布局将应用程序逻辑、容器配置和Kubernetes部署资源分开。

4

4、步骤2:构建FastAPI AI代理

配置
# app/config.py
from pydantic import BaseSettings

class Settings(BaseSettings):
    aws_region: str = "us-east-1"
    model_summarize: str = "anthropic.claude-v2"
    model_translate: str = "amazon.titan-text-lite-v1"

settings = Settings()
请求模型
# app/models.py
from pydantic import BaseModel

class SummarizeRequest(BaseModel):
    text: str

class TranslateRequest(BaseModel):
    text: str
    target_language: str
Bedrock提供者
# app/providers.py
import boto3
import json
import logging
from app.config import settings

logger = logging.getLogger("ai-agent")
logger.setLevel(logging.INFO)

bedrock_client = boto3.client(
    "bedrock-runtime",
    region_name=settings.aws_region
)

def call_bedrock(model_id: str, prompt: str) -> str:
    try:
        payload = {
            "prompt": prompt,
            "max_tokens_to_sample": 200
        }
        response = bedrock_client.invoke_model(
            modelId=model_id,
            body=json.dumps(payload)
        )
        output = json.loads(response["body"].read())
        return output.get("completion", "")
    except Exception as e:
        logger.error(f"Bedrock error: {e}")
        return "Unable to process request."
FastAPI应用程序
# app/main.py
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from app.models import SummarizeRequest, TranslateRequest
from app.providers import call_bedrock
from app.config import settings

app = FastAPI(title="AI Summarizer and Translator")

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"]
)

@app.get("/healthz")
async def health():
    return {"status": "ok"}

@app.post("/summarize")
async def summarize(req: SummarizeRequest):
    prompt = f"Summarize this text in two concise sentences:\n{req.text}"
    return {"summary": call_bedrock(settings.model_summarize, prompt)}

@app.post("/translate")
async def translate(req: TranslateRequest):
    prompt = f"Translate this into {req.target_language}:\n{req.text}"
    return {"translation": call_bedrock(settings.model_translate, prompt)}

5

5、步骤3:容器化和部署准备

容器化应用程序

使用多阶段构建的Dockerfile来优化镜像大小并遵循安全最佳实践:

FROM python:3.11-slim AS builder
WORKDIR /app
COPY app/requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

FROM python:3.11-slim
ENV PYTHONUNBUFFERED=1
ENV PATH=/root/.local/bin:$PATH
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY app ./app
RUN adduser --disabled-password --gecos '' appuser
USER appuser
EXPOSE 8000
CMD ["uvicorn","app.main:app","--host","0.0.0.0","--port","8000","--workers","2"]

这个Dockerfile使用非root用户运行应用程序,提高了安全性。

将镜像推送到Amazon ECR
aws ecr get-login-password --region us-east-1 \
  | docker login --username AWS --password-stdin <ECR_URL>
docker tag ai-agent:latest <ECR_URL>/ai-agent:latest
docker push <ECR_URL>/ai-agent:latest

确保将<ECR_URL>替换为您的实际ECR仓库URL。这些命令将构建的Docker镜像推送到Amazon ECR,以便在Kubernetes集群中使用。

创建Kubernetes Secrets
kubectl create secret generic bedrock-secret \
  --from-literal=AWS_ACCESS_KEY_ID=XXX \
  --from-literal=AWS_SECRET_ACCESS_KEY=YYY

XXXYYY替换为您的实际AWS访问密钥ID和秘密访问密钥。这个Secret将用于在Pod中注入AWS凭证,以便应用程序可以访问AWS Bedrock服务。

6

6、步骤4:Helm配置和部署

Helm配置

values.yaml文件定义了部署配置:

replicaCount: 2

image:
  repository: <ECR_URL>/ai-agent
  tag: latest
  pullPolicy: Always

service:
  type: LoadBalancer
  port: 80

env:
  AWS_REGION: us-east-1

secretRef: bedrock-secret

resources:
  requests:
    cpu: 100m
    memory: 256Mi
  limits:
    cpu: 500m
    memory: 512Mi
部署模板
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ai-agent
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: ai-agent
  template:
    metadata:
      labels:
        app: ai-agent
    spec:
      containers:
      - name: ai-agent
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        ports:
        - containerPort: 8000
        env:
        - name: AWS_REGION
          value: {{ .Values.env.AWS_REGION | quote }}
        envFrom:
        - secretRef:
            name: {{ .Values.secretRef }}
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8000
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8000
        resources:
          {{ toYaml .Values.resources | indent 12 }}

Helm配置提供了灵活的部署管理,包括副本数量、资源限制和健康检查配置。

部署到Kubernetes
helm install ai-agent ./charts -f values.yaml
kubectl get svc

使用Helm安装应用程序后,使用kubectl get svc命令获取LoadBalancer的外部IP地址,用于访问API服务。

测试API
curl -X POST http://<EXTERNAL-IP>/summarize \
  -H "Content-Type: application/json" \
  -d '{"text":"Customer reported API latency during peak hours."}'

<EXTERNAL-IP>替换为从kubectl get svc命令获取的实际外部IP地址。这个curl命令测试摘要API的功能。

7

7、自动扩缩容和CI/CD自动化

自动扩缩容和监控

配置水平Pod自动扩缩容(HPA)以实现按需扩展:

kubectl autoscale deployment ai-agent \
  --min=2 --max=6 --cpu-percent=70

这个命令配置了HPA,当CPU使用率达到70%时,会自动扩展Pod数量,最多扩展到6个副本,最少保持2个副本。这确保了应用程序能够根据负载自动调整资源。

CI/CD自动化

一旦容器镜像和Helm图表设置完成,可以通过标准CI/CD管道实现自动化。该过程涉及构建容器镜像、将其存储在Amazon ECR中,以及将Helm发布部署/升级到EKS。

  • GitHub Actions:适用于基于仓库的CI/CD,具有简单的部署管道
  • Harness CD:适用于需要审批门控、RBAC、可追溯性和多团队编排的环境

无论使用哪种工具,部署生命周期都保持一致:容器版本控制、通过Helm进行Kubernetes发布,以及使用标准健康检查进行滚动更新。

8

8、总结

Kubernetes为将AI代理部署为可修改的服务提供了一个坚实的平台,而AWS Bedrock使大型语言模型易于访问,其简单性不会增加任何额外的操作复杂性。与FastAPI、Docker和Helm配合使用,可以通过标准API轻松提供AI服务,实现直接清晰的方法。

将应用程序逻辑层与部署方面分离的能力使得更容易以促进重用、可扩展性和应用程序操作一致性的方式实现该方法。随着企业消费多云的趋势日益增长,为了控制部署过程而不陷入复杂性,上述品质的重要性不容忽视。

在本系列的后续部分中,相同的机器学习模型将在Azure AKS上与Azure OpenAI一起使用,在GCP GKE上与Vertex AI一起使用。这就是Kubernetes的力量——能够在任何云平台上为机器学习任务提供等效层的能力。


生如逆旅,一苇以航
欢迎关注、欢迎联系交流、欢迎沟通想法、欢迎交换意见、欢迎合作咨询

感谢亲的关注、点赞、收藏、评论,一键三连支持,谢谢

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐