# 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 Secrets**(`secrets.backend: sealed-secrets`) - 安装:`helm install sealed-secrets sealed-secrets/sealed-secrets -n kube-system` - 工具:`kubeseal`(用于生成 encryptedData) - **External Secrets Operator**(`secrets.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)需在命名空间内可达: - Redis:`redis://redis:6379/0`(可指向集群内 Redis 或外部托管) - PostgreSQL(含 pgvector 扩展):`postgresql+asyncpg://agentkit@postgres:5432/agentkit` > ponytail: Chart 默认不部署 Redis/PostgreSQL(避免与客户已有基础设施重复)。 > 升级路径:subchart 方式集成 bitnami/redis + bitnami/postgresql(P1)。 ## 2. 在线安装 ### 2.1 准备密钥 按 `docs/deployment/secret-inventory.md` 准备 11 个 secret slot 的明文值, 然后根据所选 backend 生成密钥资源。 **Sealed Secrets 方式**(推荐单集群 / 离线场景): ```bash # 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='' \ --from-literal=database-url='postgresql+asyncpg://agentkit:@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='' \ --from-literal=mtls-client-cert='' \ --from-literal=kms-hsm-pin='' \ --from-literal=otel-exporter-token='Bearer ' \ --from-literal=redis-password='' \ --from-literal=postgres-password='' \ > /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 方式**(推荐多集群 / 云托管场景): ```bash # 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 ```bash # 创建 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 identity(KMS/HSM) ```bash helm install agentkit deploy/helm/agentkit/ \ --namespace agentkit \ --set workloadIdentity.enabled=true \ --set workloadIdentity.audience=sts.your-cloud.com ``` ## 3. 离线安装 离线场景(政企内网无公网)需先在联网环境打包,再拷贝到离线集群安装。 ### 3.1 联网环境打包 ```bash 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 拷贝到离线集群 ```bash # 将整个 dist/ 目录拷贝到离线集群节点(scp / U 盘 / 内网传输) scp -r dist/ user@offline-node:/opt/agentkit/dist ``` ### 3.3 离线集群安装 ```bash ssh user@offline-node cd /path/to/deploy/offline make install DIST_DIR=dist NAMESPACE=agentkit RELEASE=agentkit # install.sh 会:docker load 镜像 + helm install(image.pullPolicy=Never) ``` ## 4. 安装后验证 ```bash # 1) Pod 状态 kubectl get pods -n agentkit # 期望:agentkit-xxx 1/1 Running # 2) Service / Ingress kubectl get svc,ingress -n agentkit # 3) 健康检查 kubectl exec -n agentkit deploy/agentkit-agentkit -- \ curl -s http://localhost:8001/api/v1/health # 期望:{"status":"ok"} # 4) Secret 已注入 kubectl exec -n agentkit deploy/agentkit-agentkit -- env | grep -E 'JWT|API_KEY|DATABASE' | sed 's/=.*/=/' # 期望:所有 env 都有值(不为空) # 5) helm 状态 helm status agentkit -n agentkit ``` ## 5. 故障排查 ### 5.1 Pod CrashLoopBackOff ```bash # 查看日志 kubectl logs -n agentkit deploy/agentkit-agentkit --tail=50 # 常见原因: # - Secret 未注入:检查 SealedSecret 是否已解封(kubectl get sealedsecret -n agentkit) # - DB 连接失败:检查 postgres 服务可达性 + DATABASE_URL 正确性 # - Redis 连接失败:检查 redis 服务 + REDIS_PASSWORD ``` ### 5.2 SealedSecret 未解封 ```bash 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 同步失败 ```bash kubectl get externalsecret agentkit-secrets -n agentkit -o yaml # 关注 status.conditions,常见: # - SecretStore 不存在或不可达 # - Vault / SM 权限不足 # - remoteRef.key 在外部后端不存在 ``` ### 5.4 Ingress 不通 ```bash # 检查 ingress controller kubectl get pods -n ingress-nginx # 检查 TLS secret kubectl get secret agentkit-tls -n agentkit # 检查 DNS 解析到 ingress controller LB ``` ## 6. 卸载 ```bash helm uninstall agentkit -n agentkit kubectl delete namespace agentkit # 注意:SealedSecret 解封后的明文 Secret 需手动删除 kubectl delete sealedsecret agentkit-secrets -n agentkit 2>/dev/null || true ``` ## 7. 升级 ```bash # 镜像升级 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`。