Kubernetes 部署
前提条件
- Kubernetes 集群(1.24+)
- 已配置
kubectl - 可用且支持
ReadWriteMany的 StorageClass(用于共享应用 PVC) - Ingress 控制器(推荐 nginx-ingress)
- cert-manager(可选,用于 TLS)
快速部署
kubectl apply -k k8s/
资源清单
所有清单文件在 k8s/ 目录中,按功能组织:
k8s/
├── namespace.yaml # 命名空间: open-ace
├── configmap.yaml # ConfigMap + Secret
├── storage.yaml # PVC + ServiceAccount + RBAC
├── database.yaml # PostgreSQL + Redis StatefulSets
├── deployment.yaml # 应用 Deployment + HPA
├── scheduler-deployment.yaml # 自主开发调度器 Deployment
├── scheduler-service.yaml # 调度器 Service
├── service.yaml # Service + Ingress
├── policies.yaml # PDB + NetworkPolicy
└── kustomization.yaml # Kustomize 配置
命名空间
创建带有标准 Kubernetes 标签的 open-ace 命名空间。
Deployment
| 设置 | 值 |
|---|---|
| 副本数 | 3 |
| 镜像 | open-ace:latest |
| 容器端口 | 19888 |
| 更新策略 | RollingUpdate(maxSurge=1, maxUnavailable=0) |
| 安全上下文 | runAsNonRoot: true、runAsUser: 1000、allowPrivilegeEscalation: false |
资源限制:
| 资源 | 请求 | 限制 |
|---|---|---|
| CPU | 100m | 500m |
| 内存 | 256Mi | 512Mi |
健康检查(Issue #2186):
- 存活检查:HTTP GET
/livez,initialDelay=10s,period=10s(仅检查进程存活) - 就绪检查:HTTP GET
/readyz,initialDelay=5s,period=5s(检查数据库、配置、依赖) - 启动探针:HTTP GET
/readyz,failureThreshold=60,period=5s(最多等待 300s) - Prometheus 抓取:
/metrics端点(Prometheus 格式)
端点职责:
/livez:进程存活检查,不检查依赖,避免因短暂抖动触发重启/readyz:就绪检查,验证数据库连接、Schema 兼容性、配置目录、工作空间/metrics:Prometheus 指标暴露/health:已弃用,委托给/readyz,响应包含deprecated: true
Pod 反亲和性: 优先分散到不同节点,以便在容量允许时保持可用性。
HorizontalPodAutoscaler: 参考清单至少保留 3 个副本,并可根据 CPU 与内存利用率扩展到 10 个副本。
粘性路由: Service 使用 sessionAffinity: ClientIP,nginx Ingress 使用 cookie affinity。远程会话 HTTP 控制态已经持久化并可跨 Pod,但实时终端 relay WebSocket bridge 仍属于单个 Web 进程;对活跃终端会话而言,粘性路由仍是最稳妥的默认配置。
HA 支持(Issue #1851):
实时终端和 VSCode WebSocket 连接采用"可重连恢复"的 HA 模式:
- Relay 状态注册到 Redis 实现跨 Pod 感知
- 浏览器连接到非 owner Pod 时,会收到重定向 close frame(code 3010)并重连到 owner Pod
- Terminal 历史不持久化,重连后显示 "Connection recovered"
- Redis 故障时自动降级到内存模式(仅限本 Pod)
preStophook(30s)在滚动更新时提供优雅关闭
建议配置:
- 保持粘性路由以获得最佳体验
- 监控 Redis 健康状态和熔断器状态
- 使用
preStophook 允许活跃连接排空