仅 K8s 部署
Info
本篇指南仅适用于接触过 K8s 的用户。此篇文章不会介绍如何搭建 K8s 集群,也不会含有如何使用 kubectl 等命令的教程,同时文中可能出现一些 K8s 的专业术语,需要一定的基础进行阅读。
本文将着重介绍如何在 K8s 集群中部署 GZCTF,GZCTF 自身的配置教程请参考 快速上手。
部署须知
- GZCTF 支持多实例部署,但经测试,目前来说仅单实例部署且和数据库位于同一节点的部署方式是最稳定的,因此本文中将以单实例部署为例进行介绍。
- 多实例部署时,全部的实例应当使用 S3 对象存储以确保文件一致性和并发写入(参见 #365),此外,需要部署 Redis 以确保多实例之间的缓存一致性。请参考 appsettings 文档进行配置。支持 Azure / AWS / Minio。
- 多实例部署时,负载均衡器需要配置 sticky session,否则无法使用 websocket 来获取实时数据。
- 如果你不想那么麻烦,那就部署单实例吧!
- 既然选择使用 K8s 进行部署,一定程度上说明你需要更大的 Pod 数量,请务必注意如下配置项:
-
在安装时指定
--kube-controller-manager-arg=node-cidr-mask-size=16,默认的 CIDR 为/24,最多支持 255 个 Pod。此配置项在安装后无法更改。 -
请自行调整
maxPods的值,否则可能会导致 Pod 数量达到上限而无法调度。
-
部署 GZCTF
-
创建命名空间及配置文件
-
创建本地 PV(如果需要多实例共享存储请自行更改配置)
-
创建 GZCTF 的 Deployment
-
创建 Service 和 Ingress
-
Traefik 的额外配置
为了让 GZCTF 能够正常通过 XFF 获取用户真实 IP,需要让 Traefik 能够正确地添加 XFF 头。请注意如下内容不一定总是具有时效性和适用于所有版本的 Traefik,此处举例为 helm values,请自行查找最新的配置方法。
部署提示
- 如果需要让 GZCTF 在初始化时自动创建管理员账户请注意传递
GZCTF_ADMIN_PASSWORD环境变量,否则需要手动创建管理员账户。 - 请在系统日志界面调试并参考是否能够正常获取用户真实 IP,如果不能请检查 Traefik 的配置是否正确。
- 如有监控需求,请自行部署 Prometheus 和 Grafana,并打开 Traefik 的 Prometheus 支持,并且你可以通过 node exporter 监控题目容器的资源使用情况。
- 如果需要根据配置文件更改自动更新 GZCTF 的部署,请参考 Reloader。
- 在集群内部,可以使用
https://kubernetes.default.svc.cluster.local:443作为集群配置文件中的server字段。