fischer-agentkit/docs/deployment/k8s-install.md

7.6 KiB
Raw Blame History

Fischer AgentKit — K8s 部署指南

本文档指导在原生 Kubernetes 1.28+ 集群上通过 Helm Chart 部署 Fischer AgentKit。 覆盖在线与离线两种安装场景,以及 Sealed Secrets / External Secrets 两种密钥后端。

1. 前置条件

组件 版本 说明
Kubernetes >= 1.28 原生 K8s信创 K8s / OpenShift P1 支持)
Helm 3.x Chart 部署工具
kubectl 与集群对齐 集群操作
docker / containerd 任意 镜像构建与加载

集群需已部署以下 Operator 之一(二选一,对应 secrets.backend

  • Sealed Secretssecrets.backend: sealed-secrets
    • 安装:helm install sealed-secrets sealed-secrets/sealed-secrets -n kube-system
    • 工具:kubeseal(用于生成 encryptedData
  • External Secrets Operatorsecrets.backend: external-secrets
    • 安装:helm install external-secrets external-secrets/external-secrets -n kube-system
    • 后端Vault / AWS Secrets Manager / GCP Secret Manager / Azure Key Vault运维预创建 SecretStore

依赖中间件Redis + PostgreSQL需在命名空间内可达

  • Redisredis://redis:6379/0(可指向集群内 Redis 或外部托管)
  • PostgreSQL含 pgvector 扩展):postgresql+asyncpg://agentkit@postgres:5432/agentkit

ponytail: Chart 默认不部署 Redis/PostgreSQL避免与客户已有基础设施重复。 升级路径subchart 方式集成 bitnami/redis + bitnami/postgresqlP1

2. 在线安装

2.1 准备密钥

docs/deployment/secret-inventory.md 准备 11 个 secret slot 的明文值, 然后根据所选 backend 生成密钥资源。

Sealed Secrets 方式(推荐单集群 / 离线场景):

# 1) 写明文到临时 Secret注意永远不要 git commit 明文 Secret
kubectl create secret generic agentkit-secrets --dry-run=client -o yaml \
  --from-literal=jwt-signing-key='<32字节随机串>' \
  --from-literal=api-key='<apikey>' \
  --from-literal=database-url='postgresql+asyncpg://agentkit:<pg-pwd>@postgres:5432/agentkit' \
  --from-literal=idp-signing-certs='{"feishu":"-----BEGIN CERT..."}' \
  --from-literal=third-party-api-keys='{"dashscope":"sk-...","deepseek":"sk-..."}' \
  --from-literal=tls-server-cert='<pem>' \
  --from-literal=mtls-client-cert='<pem>' \
  --from-literal=kms-hsm-pin='<pin>' \
  --from-literal=otel-exporter-token='Bearer <token>' \
  --from-literal=redis-password='<redis-pwd>' \
  --from-literal=postgres-password='<pg-pwd>' \
  > /tmp/agentkit-secret-plaintext.yaml

# 2) 用 kubeseal 加密(需 controller 已运行)
kubeseal --controller-name=sealed-secrets --controller-namespace=kube-system \
  --format yaml < /tmp/agentkit-secret-plaintext.yaml > agentkit-sealedsecret.yaml

# 3) 明文临时文件必须销毁
shred -u /tmp/agentkit-secret-plaintext.yaml

# 4) 应用 SealedSecret
kubectl apply -f agentkit-sealedsecret.yaml -n agentkit

External Secrets 方式(推荐多集群 / 云托管场景):

# 1) 在 Vault / AWS SM / GCP SM 中预置 10 个 key路径见 templates/external-secret.yaml remoteRef.key
# 2) 创建 SecretStore指向外部密钥后端
kubectl apply -f - <<'EOF'
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: agentkit-vault-store
  namespace: agentkit
spec:
  provider:
    vault:
      server: https://vault.internal:8200
      path: secret
      auth:
        kubernetes:
          mountPath: kubernetes
          role: agentkit
EOF

# 3) Chart 安装时 secrets.backend=external-secrets 自动生成 ExternalSecret

2.2 helm install

# 创建 namespace
kubectl create namespace agentkit

# 安装(默认 sealed-secrets backend
helm install agentkit deploy/helm/agentkit/ \
  --namespace agentkit \
  --set ingress.host=agentkit.your-domain.com \
  --set image.repository=fischer-agentkit \
  --set image.tag=0.1.0

# 或使用 External Secrets backend
helm install agentkit deploy/helm/agentkit/ \
  --namespace agentkit \
  --set secrets.backend=external-secrets \
  --set secrets.externalSecret.secretStoreName=agentkit-vault-store \
  --set ingress.host=agentkit.your-domain.com

# 或使用 override values 文件
helm install agentkit deploy/helm/agentkit/ \
  --namespace agentkit \
  -f values-prod.yaml

2.3 启用 workload identityKMS/HSM

helm install agentkit deploy/helm/agentkit/ \
  --namespace agentkit \
  --set workloadIdentity.enabled=true \
  --set workloadIdentity.audience=sts.your-cloud.com

3. 离线安装

离线场景(政企内网无公网)需先在联网环境打包,再拷贝到离线集群安装。

3.1 联网环境打包

cd deploy/offline
make all IMAGE_REPO=fischer-agentkit IMAGE_TAG=0.1.0
# 产物dist/agentkit-image-0.1.0.tar.gz + dist/agentkit-0.1.0.tgz

3.2 拷贝到离线集群

# 将整个 dist/ 目录拷贝到离线集群节点scp / U 盘 / 内网传输)
scp -r dist/ user@offline-node:/opt/agentkit/dist

3.3 离线集群安装

ssh user@offline-node
cd /path/to/deploy/offline
make install DIST_DIR=dist NAMESPACE=agentkit RELEASE=agentkit
# install.sh 会docker load 镜像 + helm installimage.pullPolicy=Never

4. 安装后验证

# 1) Pod 状态
kubectl get pods -n agentkit
# 期望agentkit-xxx 1/1 Running

# 2) Service / Ingress
kubectl get svc,ingress -n agentkit

# 3) 健康检查
# DEPLOY-1: 默认 release=agentkit 时 Deployment 名为 agentkitfullname helper
# 在 release 名包含 chart 名时去重)。若改了 release 名,按 helm status 输出替换。
kubectl exec -n agentkit deploy/agentkit -- \
  curl -s http://localhost:8001/api/v1/health
# 期望:{"status":"ok"}

# 4) Secret 已注入
kubectl exec -n agentkit deploy/agentkit -- env | grep -E 'JWT|API_KEY|DATABASE' | sed 's/=.*/=<redacted>/'
# 期望:所有 env 都有值(不为空)

# 5) helm 状态
helm status agentkit -n agentkit

5. 故障排查

5.1 Pod CrashLoopBackOff

# 查看日志
kubectl logs -n agentkit deploy/agentkit --tail=50

# 常见原因:
# - Secret 未注入:检查 SealedSecret 是否已解封kubectl get sealedsecret -n agentkit
# - DB 连接失败:检查 postgres 服务可达性 + DATABASE_URL 正确性
# - Redis 连接失败:检查 redis 服务 + REDIS_PASSWORD

5.2 SealedSecret 未解封

kubectl describe sealedsecret agentkit-secrets -n agentkit
# 若 status.conditions 显示 error原因通常是
# - sealed-secrets-controller 未运行kubectl get pods -n kube-system | grep sealed-secrets
# - 加密时用的 controller 与当前 controller 私钥不匹配(需重新 kubeseal

5.3 ExternalSecret 同步失败

kubectl get externalsecret agentkit-secrets -n agentkit -o yaml
# 关注 status.conditions常见
# - SecretStore 不存在或不可达
# - Vault / SM 权限不足
# - remoteRef.key 在外部后端不存在

5.4 Ingress 不通

# 检查 ingress controller
kubectl get pods -n ingress-nginx
# 检查 TLS secret
kubectl get secret agentkit-tls -n agentkit
# 检查 DNS 解析到 ingress controller LB

6. 卸载

helm uninstall agentkit -n agentkit
kubectl delete namespace agentkit
# 注意SealedSecret 解封后的明文 Secret 需手动删除
kubectl delete sealedsecret agentkit-secrets -n agentkit 2>/dev/null || true

7. 升级

# 镜像升级
helm upgrade agentkit deploy/helm/agentkit/ \
  --namespace agentkit \
  --set image.tag=0.2.0

# 配置变更
helm upgrade agentkit deploy/helm/agentkit/ \
  --namespace agentkit \
  -f values-prod.yaml

密钥轮换流程见 docs/deployment/key-rotation-runbook.md