Helm 部署
CBCTF Chart 位于仓库根目录的 chart/。默认会创建应用 Deployment、Service、Ingress、ServiceAccount、ClusterRole、共享 PVC,以及内置
PostgreSQL 和 Redis。
前置要求
- Kubernetes 集群可用
- Helm 可用
- 集群可以拉取
ghcr.io/0rays/cbctf、PostgreSQL、Redis 以及题目镜像 - 如启用持久化,集群需要可用 StorageClass
- 动态附件输入与抓包文件需要平台和运行时 Pod 共享同一 PVC;多节点场景使用
ReadWriteMany - VPC 靶机需要提前安装 Kube-OVN 和 Multus CNI
- KubeVirt VM 靶机需要提前安装 KubeVirt,并确认节点支持虚拟化
安装
添加 Helm Repo
须使用自定义 values
Helm values 会渲染为容器内 /app/config.yaml。应用 Deployment 固定为单副本、Recreate 策略;ConfigMap 变化触发 Pod 替换,会有短暂中断,并非滚动更新。
本文与仓库 Chart 0.0.29 对应。使用仓库代码时可将命令中的 cbctf/cbctf 换成 ./chart;新配置能力需要匹配版本的后端镜像。
运行时设置首次写入数据库后,以数据库为准。修改 values 中的 host、JWT、注册、上传限制或 Kubernetes 运行参数再升级,并不会覆盖已经保存的设置;请到「系统管理」修改并按需重启。参见配置来源与生效时机。
升级和卸载
共享 PVC 默认带有保留策略,卸载不会删除 /app/data 中的数据。PostgreSQL 和 Redis 的 PVC 也应在确认备份后再手动清理。
常用 Values
应用配置
图片、题目附件和题解的大小限制分别使用 cbctf.gin.upload.picture、cbctf.gin.upload.challenge、cbctf.gin.upload.writeup。
JWT、PostgreSQL 和 Redis 密钥会写入 /app/config.yaml。
管理后台不能修改 PostgreSQL/GORM、Redis、数据目录、Gin 监听地址和监听端口。
PostgreSQL 和 Redis
关闭内置组件时必须设置 externalHost,地址按原值使用,不追加命名空间。认证和端口仍使用对应的 auth 与 service.port:
PostgreSQL 需允许安装 pg_trgm 扩展,并提供足够的连接数。使用数据库连接代理时,请选择直连或 session pooling;transaction pooling 不适用于平台的任务协调。Redis 支持地址、端口和密码配置,需提供可直接连接的单实例地址。
内置 PostgreSQL 的 auth 变量仅初始化空数据目录;对已有 PVC 修改 values 中的密码不会执行数据库 ALTER ROLE,应先协调修改数据库凭据。关闭任一数据库的 persistence.enabled 后使用 emptyDir,Pod 重建会丢失对应数据。
共享数据卷与镜像凭据
- 平台挂载
/app/data,默认 PVC 为{namespace}-shared-volume。persistence.existingClaim可以指定同命名空间已有 PVC,Chart 同时写入后端k8s.shared_volume_claim,使生成器和抓包容器使用同一卷。 persistence.enabled: false仅使平台数据使用临时卷,不会为运行时 Pod 创建共享 PVC;这不适用于需要动态附件或抓包的部署。imagePullSecrets与imageCredentials用于 Chart 管理的平台、PostgreSQL 和 Redis Pod。后端创建的题目、生成器、FRPC 和预热 Job 不会继承应用 Pod 的凭据;这些 Pod 使用运行命名空间的defaultServiceAccount,可将所需 Secret 配置到该 ServiceAccount。VM 的 containerDisk 私有镜像还需按 KubeVirt 的拉取凭据机制单独验证。- Chart 的
nodeSelector、tolerations、affinity、resources作用于平台 Pod,不等于题目调度和资源配置;题目资源来自 Compose。
Kubernetes 靶机配置
Chart 使用命名空间 Role 管理 Pod、Service、Job、NetworkPolicy、ConfigMap、Multus NAD 和 VM,使用 ClusterRole 管理节点读取及 Kube-OVN 集群级资源。Chart 不会安装 KubeVirt、Kube-OVN 或 Multus,需要时请先在集群层面安装这些组件。
Chart 不会安装 KubeVirt、Kube-OVN 或 Multus,需要时请先在集群层面安装这些组件。
如果使用自定义 ServiceAccount 或外部 RBAC,可以用下面的命令提前检查关键权限:
Ingress 示例
安装后检查
检查初始管理员密码:
如果 Pod 反复重启,优先检查日志中的数据库、Redis、RBAC、PVC、KubeVirt、Kube-OVN/Multus 相关错误。
启动时资源检查
Helm 安装后,应用启动时只检查以下资源,不自动创建命名空间或 PVC:
- 命名空间:
{namespace} - 共享存储 PVC:
k8s.shared_volume_claim,未指定时为{namespace}-shared-volume - Kubernetes API 权限:上方 RBAC 表中的所有 verbs
命名空间或必需 RBAC 缺失会使启动失败;PVC 缺失会记录警告,随后动态附件和启用抓包的靶机可能无法启动。KubeVirt 资源不会在启动时创建,只有启动包含 x-kubevirt: true 的 VM 靶机时才会创建对应
VirtualMachine。
