Achootrain/Realtime_Traffic_density

GitHub: Achootrain/Realtime_Traffic_density

基于 Kafka、Spark、TimescaleDB 和 Grafana 的实时交通流量监控系统,支持通过 GitHub Actions 和 Terraform 自动化部署到 EC2 K3s 集群。

Stars: 0 | Forks: 0

# 流量系统:通过 GitHub Actions 和 Terraform 部署到 EC2 (K3s) 本指南介绍如何使用提供的 GitHub Actions 工作流,将 Kafka producer、Spark 应用、TimescaleDB、Grafana 和 MinIO 部署到您的 EC2 托管 K3s 集群中。 ## 前置条件 - 已安装 K3s 并配置好 `kubectl` 的 EC2 实例(工作流会为 `ubuntu` 用户复制 `/etc/rancher/k3s/k3s.yaml`)。 - EC2 实例上已安装 Docker(用于拉取集群节点在使用 containerd 时所需的 GHCR 镜像,确保节点能从 GHCR 拉取)。 - 拥有仓库访问权限并启用了 GitHub Actions。 - 所需文件必须存在: - `k8s/` 中的 Kubernetes 清单文件 - `kafka/` 和 `spark/` 中的 Dockerfile 和应用源代码 - 工作流:`.github/workflows/aws-ec2-deploy.yml` ## 需要配置的 Secrets (GitHub) 设置以下仓库 secrets: - `EC2_HOST`: EC2 的公网 IP 或 DNS(用于 SSH 以及 Kafka 外部通告,如果需要) - `EC2_USER`: SSH 用户名(例如 `ubuntu`) - `EC2_SSH_KEY`: 用于 SSH 的私钥(PEM 内容) - `GHCR_USERNAME`: 可以读取包的 GitHub 用户名(通常是您的用户名) - `GHCR_TOKEN`: 具有 `read:packages` 权限的 GitHub Personal Access Token(如果镜像是私有的,还需要 `repo` 权限) - 可选: - `KAFKA_BOOTSTRAP_SERVERS`: 如果外部组件需要(通常使用集群内 Service) - `POSTGRES_PASSWORD`: 如果您通过清单覆盖数据库密码(清单中的默认值是 `postgres`) ## 工作流执行内容 - 根据调度输入或仓库变更选择要构建的服务(`kafka` 或 `spark`)。 - 使用预构建的 Docker Hub 镜像: - `docker.io/achootrain/kafka-producer:latest` - `docker.io/achootrain/spark-application:latest` - 将 `k8s/` 中的所有 Kubernetes 清单复制到 EC2 上的 `/home/ubuntu/k8s/`。 - 通过 SSH 连接到 EC2 并执行: - 使用 K3s 配置为 `ubuntu` 用户授予 `kubectl` 访问权限。 - 替换 YAML 中的占位符: - `IP_PLACEHOLDER` -> `EC2_HOST` - `GITHUB_USER_PLACEHOLDER` -> 仓库所有者(小写) - 如果不存在则创建 `traffic` 命名空间。 - 使用 Kustomize 应用所有清单:`kubectl apply -k /home/ubuntu/k8s` - 镜像名称在 Kustomize 中固定;不进行用户名替换。 ## 运行部署 ### 选项 A:通过提交到 `main` 分支 - 将 `kafka/` 或 `spark/` 的更改推送到 `main`。 - 工作流将构建变更的服务镜像并进行部署。 ### 选项 B:手动调度(推荐) 1. 进入 GitHub → Actions → "Build & Deploy to GHCR (K3s)"。 2. 点击 "Run workflow"。 3. 选择 `service`:`kafka` 或 `spark`。 4. 运行。工作流将: - 构建选定的镜像并推送到 GHCR。 - 在 EC2 K3s 上应用 K8s 清单。 ## 验证部署 - 命名空间:`traffic`。 - Kafka:`statefulset/kafka` 和 `service/kafka`。 - TimescaleDB:`statefulset/timescaledb` 和 `service/timescaledb`。 - Grafana:ConfigMaps + Deployment/Service(确保 `grafana.yaml` 中存在 grafana Deployment)。 - Spark:Operator RBAC 和应用程序清单。 命令(从本地通过 kubeconfig 连接到集群或通过 EC2): ``` kubectl get all -n traffic kubectl logs -n traffic statefulset/kafka -c kafka --tail=200 kubectl logs -n traffic deployment/ --tail=200 kubectl logs -n traffic statefulset/timescaledb --tail=200 ``` ## 拉取私有 GHCR 镜像 如果 `ghcr.io/achootrain/spark-application:latest` 是私有的,工作流将使用 `GHCR_USERNAME` 和 `GHCR_TOKEN` 在 `traffic` 命名空间中自动创建/更新名为 `ghcr-secret` 的注册表密钥。 ``` kubectl create secret docker-registry ghcr-secret \ -n traffic \ --docker-server=ghcr.io \ --docker-username=YOUR_GITHUB_USERNAME \ --docker-password=YOUR_GHCR_TOKEN \ --docker-email=YOUR_EMAIL ``` Spark 清单已通过 `imagePullSecrets` 引用此密钥。 ## 镜像引用 - Kustomize 将清单中的镜像名称重新映射为: - `docker.io/achootrain/kafka-producer:latest` - `docker.io/achootrain/spark-application:latest` - Kustomize 默认固定 `latest` 标签。要部署特定提交: - 在工作流中通过 sed 将 `kustomization.yaml` 的 `images.newTag` 更新为 `${{ github.sha }}`。 ## Kafka Topic 和连接性 - Producer 发送到 topic `hugedata`。 - Spark 读取 topic `hugedata`。 - 建议使用集群内引导地址:`kafka.traffic.svc.cluster.local:9092`。 - 对于 EC2 上的外部 producer,请将 Kafka 通告监听器配置为使用 `EC2_HOST` 并暴露一个 NodePort;相应地更新 `KAFKA_BOOTSTRAP_SERVERS`。 ## TimescaleDB 和 Grafana - TimescaleDB Service:`timescaledb.traffic.svc.cluster.local:5432`,数据库 `traffic`,用户 `postgres`。 - Grafana 数据源已预配置为 TimescaleDB 服务。 - 建议通过 Secret 和环境变量设置更强的 Grafana 管理员密码。 ## 故障排除 - 权限:确保 `ubuntu` 可以读取 `~/.kube/config`(工作流会设置文件权限)。 - CRDs:在应用 `SparkApplication` 清单之前安装 Spark Operator。 - JDBC:确保 Spark 镜像在 `spark/jars/` 中包含 PostgreSQL JDBC 驱动。 - 检查点:如果需要持久化状态,请在 Spark 中将 PVC 挂载到 `/app/data`。 ## 清理 ``` kubectl delete namespace traffic ``` ## 注意事项 - 根据您的 EC2 实例大小,根据需要调整清单中的资源请求/限制。 - 使用 GHCR "latest" 标签是为了简单起见;对于生产环境,建议使用不可变标签。 cd terraform cp terraform.tfvars.example terraform.tfvars # 使用真实值编辑 terraform init terraform plan terraform apply
标签:AWS EC2, CISA项目, Docker, ECS, GHCR, GitHub Actions, GitHub Packages, Grafana, K3s, Kafka, kubectl, MinIO, NIDS, Python, SonarQube插件, Spark, SSH远程部署, Terraform, TimescaleDB, 交通监控系统, 大数据处理, 子域名突变, 安全防御评估, 实时数据处理, 容器化, 对象存储, 数据流水线, 无后门, 测试用例, 消息队列, 特权提升, 自动化部署, 自动笔记, 请求拦截, 车流量分析, 轻量级Kubernetes