Clawith/helm/QUICKSTART.md

15 KiB
Raw Permalink Blame History

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,根据你的环境修改以下配置:

vi helm/clawith/values.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. 安装

helm install clawith ./helm/clawith -n clawith --create-namespace

3. 验证部署

# 查看 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已有存储

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动态存储

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配置镜像仓库

如果使用私有镜像仓库或不同的镜像源:

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 证书(如企业内网环境):

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 服务:

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生产环境配置

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

📝 常用命令

查看状态

# 查看所有资源
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

查看日志

# 后端日志
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

升级

# 修改 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

回滚

# 查看历史版本
helm history clawith -n clawith

# 回滚到上一版本
helm rollback clawith -n clawith

# 回滚到指定版本
helm rollback clawith 1 -n clawith

卸载

# 卸载应用(保留 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可以使用端口转发

# 转发前端服务
kubectl port-forward -n clawith svc/clawith-frontend 8080:80

# 然后访问 http://localhost:8080
# 转发后端服务(用于 API 调试)
kubectl port-forward -n clawith svc/clawith-backend 8000:8000

# 然后访问 http://localhost:8000

🛠️ 故障排查

Pod 无法启动

# 查看 Pod 详情
kubectl describe pod <pod-name> -n clawith

# 查看日志
kubectl logs <pod-name> -n clawith

# 查看事件
kubectl get events -n clawith --sort-by='.lastTimestamp'

PVC 绑定失败

# 检查 PVC 状态
kubectl get pvc -n clawith
kubectl describe pvc <pvc-name> -n clawith

# 检查 StorageClass
kubectl get storageclass

# 检查 PV
kubectl get pv

镜像拉取失败

# 检查镜像配置
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

数据库连接问题

# 检查 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. 修改默认密码

⚠️ 重要:在部署前必须修改所有默认密码!

backend:
  secrets:
    secretKey: "生成一个至少 50 字符的随机字符串"
    jwtSecretKey: "生成一个至少 32 字符的随机字符串"

postgresql:
  auth:
    password: "生成一个强密码"  # 不要使用默认的 clawith123456

生成随机密码的方法:

# 生成 50 字符的随机字符串
openssl rand -base64 36

# 或使用 Python
python3 -c "import secrets; print(secrets.token_urlsafe(50))"

# 生成 32 字符的随机字符串
openssl rand -base64 24

2. 使用外部 Secrets

在生产环境中,建议使用外部 Secret 管理:

# 创建 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

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. 配置资源限制

backend:
  resources:
    limits:
      cpu: 2000m
      memory: 4Gi
    requests:
      cpu: 500m
      memory: 1Gi

5. 使用私有镜像仓库

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

# 渲染模板但不安装
helm template clawith ./helm/clawith -n clawith > preview.yaml

# 或使用 --dry-run
helm install clawith ./helm/clawith -n clawith --dry-run --debug

比较配置差异

安装 helm-diff 插件来比较配置变更:

# 安装插件
helm plugin install https://github.com/databus23/helm-diff

# 查看升级差异
helm diff upgrade clawith ./helm/clawith -n clawith

导出当前配置

# 导出当前使用的 values
helm get values clawith -n clawith > current-values.yaml

# 导出完整的 manifest
helm get manifest clawith -n clawith > current-manifest.yaml

只更新特定组件

# 只更新后端镜像版本
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

📊 监控和维护

查看资源使用

# 查看 Pod 资源使用
kubectl top pods -n clawith

# 查看 Node 资源使用
kubectl top nodes

# 查看 PVC 使用情况
kubectl get pvc -n clawith

定期备份

备份 PostgreSQL 数据:

# 导出数据库
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 配置:

# 备份当前配置
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 自动处理
可维护性

📚 更多信息

常见问题

Q: 如何查看当前使用的配置?

helm get values clawith -n clawith

Q: 如何只更新某个配置项而不影响其他配置?

helm upgrade clawith ./helm/clawith -n clawith --reuse-values --set backend.image.tag=v1.0.1

Q: 卸载后如何保留数据?

# Helm 卸载默认不会删除 PVC数据会保留
helm uninstall clawith -n clawith
# PVC 仍然存在,下次安装时可以继续使用

Q: 如何查看部署失败的原因?

kubectl get events -n clawith --sort-by='.lastTimestamp'
kubectl logs -n clawith <pod-name>
helm status clawith -n clawith

Q: 如何更换镜像仓库?

# 方式1修改 values.yaml 中的 global.imageRegistry
# 方式2使用 --set 参数
helm upgrade clawith ./helm/clawith -n clawith \
  --set global.imageRegistry=new-registry.com/project

Q: 如何验证 StorageClass 是否可用?

# 查看可用的 StorageClass
kubectl get storageclass

# 查看 StorageClass 详情
kubectl describe storageclass nfs-client

祝你部署顺利! 🎉