Files
ez-api/test/k8s/README.md
2025-12-24 11:49:34 +08:00

189 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# EZ-API Kubernetes Deployment
## 目录结构
```
k8s/
├── namespace.yaml # 命名空间定义
├── configmap.yaml # 配置映射
├── secret.yaml # 敏感信息密码、Token等
├── postgres.yaml # 主数据库 StatefulSet + Headless Service
├── log-postgres.yaml # 日志数据库 StatefulSet + Headless Service
├── redis.yaml # Redis StatefulSet + Headless Service
├── ez-api.yaml # ez-api Deployment + LoadBalancer Service
├── balancer.yaml # balancer Deployment + LoadBalancer Service
├── kustomization.yaml # Kustomize 配置文件
└── README.md # 本文档
```
## 架构说明
### 有状态服务StatefulSet
**PostgreSQL 和 Redis 使用 StatefulSet 的原因:**
1. **稳定的网络标识**Pod 名称固定(如 `postgres-0`DNS 可预测
2. **有序部署和扩展**Pod 按顺序创建和删除
3. **稳定的持久化存储**:每个 Pod 有自己的 PVCPod 重建后数据保留
4. **更新策略控制**支持分区更新Partition可实现金丝雀发布
**更新策略配置:**
```yaml
updateStrategy:
type: RollingUpdate
rollingUpdate:
partition: 0 # 0 表示全部更新,设置为 N 表示只更新 ordinal >= N 的 Pod
```
- `partition: 0` - 所有 Pod 都会更新(默认行为)
- `partition: 1` - 只有 ordinal >= 1 的 Pod 会更新ordinal=0 保持不变(金丝雀发布)
### 无状态服务Deployment
**ez-api 和 balancer 使用 Deployment 的原因:**
1. 无需持久化存储(状态存储在数据库/Redis
2. 可以快速水平扩展
3. 支持滚动更新和回滚
## 部署方式
### 使用 Kustomize 部署
```bash
# 预览生成的 YAML
kubectl kustomize ez-api/test/k8s/
# 部署到集群
kubectl apply -k ez-api/test/k8s/
# 查看部署状态
kubectl get all -n ez-api-test-dev
```
### 使用 kubectl 直接部署
```bash
# 按顺序部署
kubectl apply -f ez-api/test/k8s/namespace.yaml
kubectl apply -f ez-api/test/k8s/configmap.yaml
kubectl apply -f ez-api/test/k8s/secret.yaml
kubectl apply -f ez-api/test/k8s/postgres.yaml
kubectl apply -f ez-api/test/k8s/log-postgres.yaml
kubectl apply -f ez-api/test/k8s/redis.yaml
kubectl apply -f ez-api/test/k8s/ez-api.yaml
kubectl apply -f ez-api/test/k8s/balancer.yaml
```
## 存储配置
### PVC 持久化卷
| 服务 | 存储大小 | 用途 |
|------|---------|------|
| postgres | 50Gi | 主数据库数据 |
| log-postgres | 100Gi | 日志数据库(数据量较大) |
| redis | 10Gi | Redis AOF 持久化 |
### 修改 StorageClass
如果集群使用特定的 StorageClass需要取消注释并修改
```yaml
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "your-storage-class" # 取消注释并修改
resources:
requests:
storage: 50Gi
```
## 服务访问
### LoadBalancer 服务
| 服务 | 端口 | 类型 |
|------|------|------|
| ez-api | 8080 | LoadBalancer |
| balancer | 8081 | LoadBalancer |
### 获取外部 IP
```bash
# 查看 Service 状态
kubectl get svc -n ez-api-test-dev
# 等待 LoadBalancer 分配 IP
kubectl get svc ez-api -n ez-api-test-dev -w
kubectl get svc balancer -n ez-api-test-dev -w
```
## 配置修改
### 修改密码和 Token
编辑 [`secret.yaml`](ez-api/test/k8s/secret.yaml) 文件:
```yaml
stringData:
POSTGRES_PASSWORD: "your-secure-password"
EZ_ADMIN_TOKEN: "your-secure-token"
```
### 修改应用配置
编辑 [`configmap.yaml`](ez-api/test/k8s/configmap.yaml) 文件:
```yaml
data:
EZ_LOG_RETENTION_DAYS: "60"
EZ_BALANCER_STATS_FLUSH_ENABLED: "true"
```
## 扩容
### 水平扩展 ez-api / balancer
```bash
kubectl scale deployment ez-api --replicas=3 -n ez-api-test-dev
kubectl scale deployment balancer --replicas=3 -n ez-api-test-dev
```
### 注意事项
- PostgreSQL 和 Redis 的 StatefulSet 副本数保持为 1单实例模式
- 如需高可用数据库,建议使用托管数据库服务或配置主从复制
## 监控和日志
```bash
# 查看 Pod 日志
kubectl logs -f deployment/ez-api -n ez-api-test-dev
kubectl logs -f deployment/balancer -n ez-api-test-dev
# 查看 StatefulSet 日志
kubectl logs -f statefulset/postgres -n ez-api-test-dev
kubectl logs -f statefulset/redis -n ez-api-test-dev
# 进入 Pod 调试
kubectl exec -it postgres-0 -n ez-api-test-dev -- psql -U postgres -d ezapi
kubectl exec -it redis-0 -n ez-api-test-dev -- redis-cli
```
## 清理
```bash
# 删除所有资源(保留 PVC
kubectl delete -k ez-api/test/k8s/
# 删除 PVC会删除数据
kubectl delete pvc -l app.kubernetes.io/name=ez-api-test-dev -n ez-api-test-dev
# 删除命名空间(会删除所有资源和数据!)
kubectl delete namespace ez-api-test-dev
```