Clawith/helm/QUICKSTART.md

715 lines
15 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.

# Clawith Helm 部署快速开始指南
## 📋 目录结构
```
helm/
├── clawith/ # Helm Chart 主目录
│ ├── Chart.yaml # Chart 元数据
│ ├── values.yaml # 配置文件
│ ├── README.md # 详细文档
│ └── templates/ # Kubernetes 资源模板
│ ├── _helpers.tpl # 模板辅助函数
│ ├── namespace.yaml # Namespace
│ ├── secrets.yaml # 密钥
│ ├── backend.yaml # 后端服务
│ ├── frontend.yaml # 前端服务
│ ├── ingress.yaml # Ingress 配置
│ ├── postgresql.yaml # PostgreSQL 数据库
│ ├── redis.yaml # Redis 缓存
│ └── storageclass.yaml # 存储类(可选)
└── QUICKSTART.md # 本文档
```
## ⚠️ 重要说明
**K8s 部署方式限制:**
- ✅ 当前 Helm Chart **仅支持 Native Agent 部署方式**
-**不支持 OpenClaw Agent 托管模式**
- 如需使用 OpenClaw Agent 托管,请采用 Docker Compose 或其他部署方式
Native Agent 是 Clawith 内置的代理模式,适用于 Kubernetes 环境。OpenClaw Agent 托管模式目前仅在 Docker Compose 环境中支持。
## 🚀 快速开始
### 1. 编辑配置文件
编辑 `helm/clawith/values.yaml`,根据你的环境修改以下配置:
```bash
vi helm/clawith/values.yaml
```
**必须修改的配置项:**
```yaml
# 1. 配置镜像仓库地址
global:
imageRegistry: docker.io/yourusername # 修改为你的镜像仓库地址
# 2. 配置镜像标签
backend:
image:
tag: latest # 建议使用具体版本号,如 v1.0.0
frontend:
image:
tag: latest # 建议使用具体版本号,如 v1.0.0
# 3. 配置存储
backend:
persistence:
existingClaim: "" # 如果使用现有 PVC填入 PVC 名称
storageClass: "" # 如果新建,则修改为你的 StorageClass 名称
size: 10Gi
postgresql:
image:
registry: docker.io/bitnami # 修改为你的镜像仓库
auth:
password: "clawith123456" # 强烈建议修改为强密码!
primary:
persistence:
existingClaim: "" # 如果使用现有 PVC填入 PVC 名称
storageClass: "" # 如果新建,则修改为你的 StorageClass 名称
size: 8Gi
redis:
image:
registry: docker.io # 修改为你的镜像仓库
persistence:
existingClaim: "" # 如果使用现有 PVC填入 PVC 名称
storageClass: "" # 如果新建,则修改为你的 StorageClass 名称
size: 2Gi
# 4. 配置域名
frontend:
ingress:
host: "clawith.example.com" # 修改为你的域名
# 5. 修改应用密钥(重要!)
backend:
secrets:
secretKey: "your-secret-key-at-least-50-characters-long"
jwtSecretKey: "your-jwt-secret-key-at-least-32-characters"
# 6. 如果需要私签证书支持,启用 hostCerts
backend:
hostCerts:
enabled: false # 如果需要则设置为 true
```
### 2. 安装
```bash
helm install clawith ./helm/clawith -n clawith --create-namespace
```
### 3. 验证部署
```bash
# 查看 Pod 状态
kubectl get pods -n clawith
# 应该看到类似输出:
# NAME READY STATUS RESTARTS AGE
# clawith-backend-xxx 1/1 Running 0 2m
# clawith-frontend-xxx 1/1 Running 0 2m
# clawith-postgresql-0 1/1 Running 0 2m
# clawith-redis-xxx 1/1 Running 0 2m
# 查看服务和 Ingress
kubectl get svc,ingress -n clawith
```
## 🔧 常见配置场景
### 场景 1使用现有 PVC已有存储
```yaml
backend:
persistence:
enabled: true
existingClaim: "clawith-agent-data-pvc" # 你的 PVC 名称
# 不需要指定 storageClass 和 size
postgresql:
primary:
persistence:
enabled: true
existingClaim: "clawith-postgresql-data" # 你的 PVC 名称
redis:
persistence:
enabled: true
existingClaim: "redisdata" # 你的 PVC 名称
```
### 场景 2创建新的 PVC动态存储
```yaml
backend:
persistence:
enabled: true
existingClaim: "" # 留空
storageClass: "nfs-client" # 你的 StorageClass 名称
size: 10Gi
postgresql:
primary:
persistence:
enabled: true
existingClaim: ""
storageClass: "nfs-client"
size: 8Gi
redis:
persistence:
enabled: true
existingClaim: ""
storageClass: "nfs-client"
size: 2Gi
```
### 场景 3配置镜像仓库
如果使用私有镜像仓库或不同的镜像源:
```yaml
global:
imageRegistry: registry.example.com/myproject # 私有仓库
backend:
image:
repository: clawith-backend
tag: v1.0.0 # 使用具体版本号
frontend:
image:
repository: clawith-frontend
tag: v1.0.0
postgresql:
image:
registry: registry.example.com/bitnami
repository: bitnami/postgresql
tag: 15.3.0-debian-11-r7
redis:
image:
registry: registry.example.com
repository: redis
tag: 7-alpine
```
### 场景 4启用私签证书支持
如果你的环境需要自定义 CA 证书(如企业内网环境):
```yaml
backend:
hostCerts:
enabled: true
paths:
certs: /etc/ssl/certs
shareCA: /usr/local/share/ca-certificates
containerPaths:
sslCertFile: /app/cacert.pem
requestsCaBundle: /app/cacert.pem
curlCaBundle: /app/cacert.pem
```
### 场景 5使用外部数据库
如果你有独立的 PostgreSQL 和 Redis 服务:
```yaml
postgresql:
enabled: false
external:
host: "postgresql.example.com"
port: 5432
database: clawith
username: postgres
password: "your-password"
redis:
enabled: false
external:
host: "redis.example.com"
port: 6379
database: 0
password: "" # 如果有密码
```
### 场景 6生产环境配置
```yaml
global:
imageRegistry: registry.yourcompany.com/clawith
backend:
replicaCount: 2 # 多副本
image:
tag: v1.0.0 # 使用固定版本
resources:
limits:
cpu: 2000m
memory: 4Gi
requests:
cpu: 500m
memory: 1Gi
persistence:
storageClass: "ssd-storage" # 高性能存储
size: 50Gi
frontend:
replicaCount: 2
image:
tag: v1.0.0
ingress:
enabled: true
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
host: "clawith.yourcompany.com"
tls:
enabled: true
secretName: clawith-tls-secret
postgresql:
auth:
password: "STRONG_PASSWORD_HERE" # 必须使用强密码
primary:
persistence:
storageClass: "ssd-storage"
size: 20Gi
resources:
limits:
cpu: 2000m
memory: 2Gi
requests:
cpu: 500m
memory: 512Mi
redis:
persistence:
storageClass: "ssd-storage"
size: 5Gi
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 250m
memory: 256Mi
```
## 📝 常用命令
### 查看状态
```bash
# 查看所有资源
kubectl get all -n clawith
# 查看 Pod 状态
kubectl get pods -n clawith
# 查看 PVC
kubectl get pvc -n clawith
# 查看 Helm 发布状态
helm status clawith -n clawith
# 查看 Helm 部署的值
helm get values clawith -n clawith
```
### 查看日志
```bash
# 后端日志
kubectl logs -n clawith -l app.kubernetes.io/component=backend -f
# 前端日志
kubectl logs -n clawith -l app.kubernetes.io/component=frontend -f
# PostgreSQL 日志
kubectl logs -n clawith -l app.kubernetes.io/component=postgresql -f
# Redis 日志
kubectl logs -n clawith -l app.kubernetes.io/component=redis -f
```
### 升级
```bash
# 修改 values.yaml 后升级
helm upgrade clawith ./helm/clawith -n clawith
# 或者使用 --set 覆盖特定值
helm upgrade clawith ./helm/clawith -n clawith \
--set backend.image.tag=v1.0.1 \
--set frontend.image.tag=v1.0.1
# 升级镜像版本
helm upgrade clawith ./helm/clawith -n clawith \
--set global.imageRegistry=registry.example.com/newproject
```
### 回滚
```bash
# 查看历史版本
helm history clawith -n clawith
# 回滚到上一版本
helm rollback clawith -n clawith
# 回滚到指定版本
helm rollback clawith 1 -n clawith
```
### 卸载
```bash
# 卸载应用(保留 PVC
helm uninstall clawith -n clawith
# 如需删除 PVC
kubectl delete pvc -n clawith --all
# 删除 namespace
kubectl delete namespace clawith
```
## 🔍 访问应用
### 通过 Ingress 访问(推荐)
如果配置了 Ingress直接通过域名访问
```
http://clawith.example.com # 或你配置的域名
```
### 通过 Port Forward 访问
如果没有配置 Ingress可以使用端口转发
```bash
# 转发前端服务
kubectl port-forward -n clawith svc/clawith-frontend 8080:80
# 然后访问 http://localhost:8080
```
```bash
# 转发后端服务(用于 API 调试)
kubectl port-forward -n clawith svc/clawith-backend 8000:8000
# 然后访问 http://localhost:8000
```
## 🛠️ 故障排查
### Pod 无法启动
```bash
# 查看 Pod 详情
kubectl describe pod <pod-name> -n clawith
# 查看日志
kubectl logs <pod-name> -n clawith
# 查看事件
kubectl get events -n clawith --sort-by='.lastTimestamp'
```
### PVC 绑定失败
```bash
# 检查 PVC 状态
kubectl get pvc -n clawith
kubectl describe pvc <pvc-name> -n clawith
# 检查 StorageClass
kubectl get storageclass
# 检查 PV
kubectl get pv
```
### 镜像拉取失败
```bash
# 检查镜像配置
helm get values clawith -n clawith | grep -A 3 image
# 查看 Pod 事件
kubectl describe pod <pod-name> -n clawith | grep -A 10 Events
# 手动拉取镜像测试
docker pull your-registry/clawith-backend:latest
```
### 数据库连接问题
```bash
# 检查 PostgreSQL 服务
kubectl get svc -n clawith | grep postgresql
# 检查数据库密码
kubectl get secret -n clawith -o yaml | grep postgres-password
# 进入后端 Pod 测试连接
kubectl exec -it -n clawith deployment/clawith-backend -- /bin/bash
# 在 Pod 内测试
nc -zv clawith-postgresql 5432
```
## 🔐 安全建议
### 1. 修改默认密码
⚠️ **重要**:在部署前必须修改所有默认密码!
```yaml
backend:
secrets:
secretKey: "生成一个至少 50 字符的随机字符串"
jwtSecretKey: "生成一个至少 32 字符的随机字符串"
postgresql:
auth:
password: "生成一个强密码" # 不要使用默认的 clawith123456
```
生成随机密码的方法:
```bash
# 生成 50 字符的随机字符串
openssl rand -base64 36
# 或使用 Python
python3 -c "import secrets; print(secrets.token_urlsafe(50))"
# 生成 32 字符的随机字符串
openssl rand -base64 24
```
### 2. 使用外部 Secrets
在生产环境中,建议使用外部 Secret 管理:
```bash
# 创建 Secret
kubectl create secret generic clawith-secrets \
--from-literal=secret-key='your-secret-key' \
--from-literal=jwt-secret-key='your-jwt-secret' \
-n clawith
# 在 values.yaml 中配置
secrets:
create: false
existingSecret: "clawith-secrets"
```
### 3. 启用 HTTPS
```yaml
frontend:
ingress:
enabled: true
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
host: "clawith.yourcompany.com"
tls:
enabled: true
secretName: clawith-tls-secret
```
### 4. 配置资源限制
```yaml
backend:
resources:
limits:
cpu: 2000m
memory: 4Gi
requests:
cpu: 500m
memory: 1Gi
```
### 5. 使用私有镜像仓库
```yaml
global:
imageRegistry: registry.yourcompany.com/clawith
# 如果需要认证,创建 imagePullSecret
# kubectl create secret docker-registry regcred \
# --docker-server=registry.yourcompany.com \
# --docker-username=user \
# --docker-password=password \
# -n clawith
```
## 💡 实用技巧
### 预览部署内容
在实际部署前,先预览生成的 YAML
```bash
# 渲染模板但不安装
helm template clawith ./helm/clawith -n clawith > preview.yaml
# 或使用 --dry-run
helm install clawith ./helm/clawith -n clawith --dry-run --debug
```
### 比较配置差异
安装 helm-diff 插件来比较配置变更:
```bash
# 安装插件
helm plugin install https://github.com/databus23/helm-diff
# 查看升级差异
helm diff upgrade clawith ./helm/clawith -n clawith
```
### 导出当前配置
```bash
# 导出当前使用的 values
helm get values clawith -n clawith > current-values.yaml
# 导出完整的 manifest
helm get manifest clawith -n clawith > current-manifest.yaml
```
### 只更新特定组件
```bash
# 只更新后端镜像版本
helm upgrade clawith ./helm/clawith -n clawith \
--set backend.image.tag=v1.0.1 \
--reuse-values
# 只更新前端配置
helm upgrade clawith ./helm/clawith -n clawith \
--set frontend.ingress.host=new.example.com \
--reuse-values
# 更新镜像仓库地址
helm upgrade clawith ./helm/clawith -n clawith \
--set global.imageRegistry=new-registry.com/project \
--reuse-values
```
## 📊 监控和维护
### 查看资源使用
```bash
# 查看 Pod 资源使用
kubectl top pods -n clawith
# 查看 Node 资源使用
kubectl top nodes
# 查看 PVC 使用情况
kubectl get pvc -n clawith
```
### 定期备份
**备份 PostgreSQL 数据:**
```bash
# 导出数据库
kubectl exec -n clawith clawith-postgresql-0 -- \
pg_dump -U postgres clawith > backup-$(date +%Y%m%d).sql
# 恢复数据库
kubectl exec -i -n clawith clawith-postgresql-0 -- \
psql -U postgres clawith < backup-20260402.sql
```
**备份 Helm 配置:**
```bash
# 备份当前配置
helm get values clawith -n clawith > backup-values-$(date +%Y%m%d).yaml
```
## 🎯 与原有 K8s 部署对比
| 特性 | 原有 K8s YAML | Helm Chart |
|------|--------------|------------|
| 配置管理 | 分散在多个文件 | 集中在 values.yaml |
| 版本控制 | 手动管理 | Helm 自动追踪 |
| 升级 | 逐个 apply | `helm upgrade` 一条命令 |
| 回滚 | 困难 | `helm rollback` 一条命令 |
| 参数化 | 需要手动替换 | 模板自动渲染 |
| 环境管理 | 复制多份 YAML | 一套模板 + values.yaml |
| 依赖管理 | 手动管理顺序 | Helm 自动处理 |
| 可维护性 | 低 | 高 |
## 📚 更多信息
- **详细配置文档**`helm/clawith/README.md`
- **Helm 官方文档**https://helm.sh/docs/
- **Kubernetes 文档**https://kubernetes.io/docs/
## ❓ 常见问题
**Q: 如何查看当前使用的配置?**
```bash
helm get values clawith -n clawith
```
**Q: 如何只更新某个配置项而不影响其他配置?**
```bash
helm upgrade clawith ./helm/clawith -n clawith --reuse-values --set backend.image.tag=v1.0.1
```
**Q: 卸载后如何保留数据?**
```bash
# Helm 卸载默认不会删除 PVC数据会保留
helm uninstall clawith -n clawith
# PVC 仍然存在,下次安装时可以继续使用
```
**Q: 如何查看部署失败的原因?**
```bash
kubectl get events -n clawith --sort-by='.lastTimestamp'
kubectl logs -n clawith <pod-name>
helm status clawith -n clawith
```
**Q: 如何更换镜像仓库?**
```bash
# 方式1修改 values.yaml 中的 global.imageRegistry
# 方式2使用 --set 参数
helm upgrade clawith ./helm/clawith -n clawith \
--set global.imageRegistry=new-registry.com/project
```
**Q: 如何验证 StorageClass 是否可用?**
```bash
# 查看可用的 StorageClass
kubectl get storageclass
# 查看 StorageClass 详情
kubectl describe storageclass nfs-client
```
---
**祝你部署顺利!** 🎉