避坑指南:从Docker到K8s,手把手教你部署Archery数据库审计平台(附完整YAML)

张开发
2026/4/17 15:55:49 15 分钟阅读

分享文章

避坑指南:从Docker到K8s,手把手教你部署Archery数据库审计平台(附完整YAML)
从Docker到KubernetesArchery数据库审计平台高可用部署实战最近在帮客户做数据库审计系统迁移时发现不少团队在从Docker转向Kubernetes的过程中频频踩坑。作为一款开源的SQL审核平台Archery确实能有效解决数据库权限管理和敏感数据脱敏的问题但官方文档对K8s部署的说明相对简略。本文将分享一套经过生产环境验证的部署方案重点解析那些容易出错的配置细节。1. 环境准备与架构设计在开始编写YAML之前我们需要明确几个关键点。Archery的K8s部署涉及多个组件协同工作包括主应用服务、MySQL数据库、Redis缓存以及可选的GoInception审核引擎。与简单的Docker-Compose部署不同Kubernetes环境需要考虑服务发现、持久化存储、配置管理等高可用要素。基础环境要求Kubernetes集群版本1.16kubectl命令行工具配置就绪至少2个可用节点建议4核8G配置默认StorageClass配置正确组件通信关系如下图所示建议用表格替代图示组件端口依赖服务协议Archery9123MySQL, RedisHTTPMySQL3306-TCPRedis6379-TCPGoInception4000ArcheryHTTP提示生产环境建议为MySQL和Redis配置独立的PersistentVolume避免数据丢失。测试环境可以使用hostPath临时方案。2. 关键配置陷阱与解决方案2.1 字符集问题最隐蔽的坑MySQL的字符集配置不当会导致Archery初始化失败这是90%的部署问题根源。我们来看正确的配置方式# mysql-configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mysql-config namespace: archery-system data: my.cnf: | [mysqld] character-set-server utf8mb4 collation-server utf8mb4_general_ci init_connect SET NAMES utf8mb4 lower_case_table_names 1为什么这很重要Archery的数据库模型包含中文内容存储utf8mb4是MySQL真正的UTF-8实现标准utf8只支持3字节缺少init_connect会导致已有连接使用错误字符集2.2 配置文件挂载的正确姿势直接从Docker-Compose迁移时容易忽略配置文件的挂载方式差异。K8s中推荐使用ConfigMap管理配置# 将本地配置文件转换为ConfigMap kubectl create configmap archery-config -n archery-system \ --from-filelocal_settings.py./local_settings.py \ --from-filesoar.yaml./soar.yaml然后在Deployment中挂载volumeMounts: - name: config-volume mountPath: /opt/archery/local_settings.py subPath: local_settings.py注意subPath的使用是关键否则会覆盖整个目录。这也是许多新手容易出错的地方。3. 完整部署流程详解3.1 命名空间与持久化存储首先创建独立的命名空间kubectl create namespace archery-system然后是MySQL的持久化存储声明生产环境建议使用云厂商的块存储# mysql-pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: /data/mysql3.2 核心服务部署Archery主应用的Deployment需要特别注意环境变量注入env: - name: DATABASE_URL value: mysql://root:123456mysql:3306/archery?charsetutf8mb4 - name: CACHE_URL value: redis://redis:6379/0?PASSWORD123456 - name: CSRF_TRUSTED_ORIGINS value: http://your-domain.com关键参数说明数据库连接字符串必须包含charsetutf8mb4Redis密码需要以URL参数形式传递CSRF_TRUSTED_ORIGINS要设置为实际访问域名3.3 服务暴露与访问建议使用NodePort方式快速验证# archery-service.yaml apiVersion: v1 kind: Service metadata: name: archery namespace: archery-system spec: type: NodePort ports: - port: 9123 nodePort: 30080访问地址为http://任意节点IP:300804. 初始化与故障排查4.1 数据库初始化步骤进入Archery容器执行# 查找manage.py位置 find / -name manage.py 2/dev/null # 执行数据迁移 cd /opt/archery python3 manage.py makemigrations sql python3 manage.py migrate # 创建管理员账号 python3 manage.py createsuperuser4.2 常见错误排查指南遇到问题时按以下顺序检查查看Pod状态kubectl get pods -n archery-system检查日志kubectl logs -f pod-name -n archery-system验证网络连通性kubectl exec -it archery-pod -n archery-system -- curl mysql:3306检查存储挂载kubectl exec -it mysql-pod -n archery-system -- ls /var/lib/mysql典型错误案例MySQL连接失败检查字符集和网络策略Redis认证失败确认密码是否包含特殊字符静态文件加载404检查Nginx配置路径5. 生产环境优化建议对于正式上线环境还需要考虑以下增强配置高可用方案MySQL配置主从复制Redis启用哨兵模式Archery部署多个副本安全加固为每个服务配置独立的ServiceAccount使用Secret管理敏感信息配置NetworkPolicy限制访问性能调优resources: limits: memory: 2Gi cpu: 1 requests: memory: 1Gi cpu: 0.5监控方面建议为每个组件配置Prometheus指标采集和告警规则。这套配置已经在三个不同规模的客户环境中稳定运行超过半年期间经历了多次版本升级验证。

更多文章