从运维练习角度重新调整ebilibili下载站:
1,修改代码加上redis集群收集日志。
2,把ebilibili代码用dockerFile打包成镜像。
3,把镜像载入A B C服务器的Docker。
4,用nginx集群再做负载均衡分配给ebilibiliDocker。
5,部署Jenkins方便后期构建和推送镜像。
6,做监控zabbix+grafana
kubernetes.txt
// all nodes svc deployment replicaset pod container
kubectl get
//改 replicas 得到多个副本
kubectl edit replicaset nginx-xxx
kubectl logs nginx-xxx
kubectl exec -it nginx-xxx — /bin/bash
kubectl delete deployment nginx-xxx
kubectl create deployment nginx-dep –image=nginx –replicaset
kubectl create -f nginx-deployment.yml
kubectl delete -f nginx-deployment.yml
kubectl apply -f nginx-deployment.yml
kubectl get pod -o wide
kubectl describe service nginx-deployment
kubectl describe [nodes deployment pod] nginx-deployment
// Service提供服务
// 集群网络是隔离的;pod是不稳定的;
// service ClusterIP/type: NodePort 30000~32767
kubectl create service nginx-service
kubectl expose deployment nginx-deployment
//命名空间
kubectl apply -n portainer -f portainer.yaml
kubectl get ns
kubectl get all -n portainer
Ebilibili下载站 · 全栈运维架构蓝图 | 集群+监控+CI/CD
📦 Ebilibili 下载站 · 运维实战架构
✨ 生产级演练 · 多服务器集群 · 日志聚合 · 全链路监控 ✨
基于 Docker + Nginx 集群 + Redis 日志集群 + Jenkins + Zabbix+Grafana,全面落地站点高可用与可观测性
🔴 核心改造:ebilibili 代码集成 Redis 集群日志
在 Flask/Node 下载站逻辑中,增加异步日志推送至 Redis Cluster (3主3从模拟),存储用户下载、错误、访问日志。日志格式 JSON,方便 Logstash 或 Filebeat 消费。
# ebilibili/app.py 伪代码集成
import redis
import logging
from logging.handlers import RotatingFileHandler
redis_cluster = redis.RedisCluster(
startup_nodes=[{“host”: “redis-1”, “port”: 6379},
{“host”: “redis-2”, “port”: 6379},
{“host”: “redis-3”, “port”: 6379}],
decode_responses=True
)
def log_to_redis(level, msg):
log_entry = f”{level}|{msg}|{time.time()}”
redis_cluster.lpush(“ebi:app_logs”, log_entry)
# 中间件调用 log_to_redis(“INFO”, f”download:{file}”)
🐳 Dockerfile 打包 ebilibili 镜像 (生产级)
FROM python:3.10-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install –no-cache-dir -r requirements.txt
FROM python:3.10-slim
WORKDIR /app
COPY –from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
COPY . .
ENV REDIS_CLUSTER_NODES=”redis-1:6379,redis-2:6379,redis-3:6379″
EXPOSE 8000
CMD [“gunicorn”, “app:app”, “-b”, “0.0.0.0:8000”, “–workers”, “3”]
🔨 docker build -t ebilibili:v2 .
📌 镜像推送到私有仓库: harbor.ebi.local/ebilibili:v2
# 构建指令示例
docker build -t ebilibili:log-cluster .
docker tag ebilibili:log-cluster 192.168.10.100:5000/ebilibili:latest
docker push 192.168.10.100:5000/ebilibili:latest
🖥️ 服务器 A (10.0.1.10)
负载权重: 1 | 部署 ebilibili 容器 ×2
docker pull harbor.ebi.local/ebilibili:latest
docker run -d –name ebi-node1 -p 8001:8000 –restart=always ebilibili:latest
docker run -d –name ebi-node2 -p 8002:8000 ebilibili:latest
✅ 加入 Nginx upstream 组
🖥️ 服务器 B (10.0.1.11)
负载权重: 1 | 高可用节点
docker pull harbor.ebi.local/ebilibili:latest
docker run -d –name ebi-nodeB1 -p 8001:8000 ebilibili:latest
docker run -d –name ebi-nodeB2 -p 8002:8000 ebilibili:latest
日志输出至 Redis Cluster 收集
🖥️ 服务器 C (10.0.1.12)
同样部署 ebilibili 容器 ×2
docker pull harbor.ebi.local/ebilibili:latest
docker run -d –name ebi-nodeC1 -p 8001:8000 ebilibili:latest
docker run -d –name ebi-nodeC2 -p 8002:8000 ebilibili:latest
🌐 Nginx 集群 (负载均衡层) —— 前置代理 + 流量分发
# nginx.conf (upstream ebilibili_backend)
upstream ebilibili_cluster {
least_conn;
server 10.0.1.10:8001 weight=1 max_fails=3 fail_timeout=30s;
server 10.0.1.10:8002 weight=1;
server 10.0.1.11:8001 weight=1;
server 10.0.1.11:8002 weight=1;
server 10.0.1.12:8001 weight=1;
server 10.0.1.12:8002 weight=1;
}
server {
listen 80;
location / {
proxy_pass http://ebilibili_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# 多节点nginx部署 (Nginx集群方案: 可用Keepalived + VIP 或 每服务器前置nginx)
✅ 三台服务器分别安装 Nginx 作为反向代理,对外提供统一入口,并做四层/七层负载分担,高可用由 DNS 轮询或硬件负载均衡保证。
🔧 Jenkins 部署(任意中控机),集成 Docker pipeline 插件,对接 Git 仓库。代码变更 ➜ 自动打镜像 ➜ 推送到私有镜像仓库 ➜ 触发滚动更新 A/B/C 服务器。
pipeline {
agent any
stages {
stage(‘Git Checkout’) {
steps { git ‘https://git.ebi.local/ebilibili.git’ }
}
stage(‘Build Image’) {
steps { sh ‘docker build -t ebilibili:${BUILD_NUMBER} .’ }
}
stage(‘Push Registry’) {
steps {
sh ‘docker tag ebilibili:${BUILD_NUMBER} 192.168.10.100:5000/ebilibili:latest’
sh ‘docker push 192.168.10.100:5000/ebilibili:latest’
}
}
stage(‘Rollout Servers’) {
steps {
sh ‘ansible playbook -i inventory deploy_ebi.yml’
// 或者脚本远程ssh执行 docker pull && 重启容器
}
}
}
}
📦 镜像仓库(Harbor / Registry)
为 A/B/C 三台服务器提供统一拉取源;后期 Jenkins 自动推送,服务器配置定时拉取或者监听 webhook 热更新。
⚡ 部署脚本示例 (Ansible)
– name: 更新ebilibili容器
hosts: servers_group
tasks:
– name: 拉取最新镜像
shell: “docker pull 192.168.10.100:5000/ebilibili:latest”
– name: 重启ebi容器
shell: “docker stop ebi-node1 || true && docker rm ebi-node1 || true; docker run -d –name ebi-node1 -p 8001:8000 ebilibili:latest”
📈 Zabbix Server (监控A/B/C服务器&容器)
- 监控 Docker 容器 CPU/内存/网络;
- 自定义监控项:Redis 日志队列长度、ebilibili 请求响应时间;
- Zabbix agent 部署在每台服务器,通过 Docker 插件采集容器指标;
- 触发告警:日志错误率 >5%,容器重启频繁 、Nginx 5xx 错误。
# 自定义 UserParameter 采集 Redis 日志堆积
UserParameter=redis.log.len, redis-cli -h redis-1 llen ebi:app_logs
# 监控 ebilibili 健康检查
UserParameter=ebi.health, curl -s localhost:8001/health | grep OK | wc -l
📉 Grafana + Zabbix 数据源
构建运维仪表盘,实时展示:
- 三台服务器的 Ebilibili 容器 QPS / 延迟热力图
- Redis 集群日志条目趋势 & 错误率监控
- Nginx 负载均衡器连接数 & 上游健康状态
- 告警集成钉钉/企微机器人
🔔 告警规则: 磁盘 >85%
⚠️ 日志堆积 >5000条
💥 站点不可用触发自动恢复
# 快速部署zabbix-agent 与 grafana (docker-compose)
docker run -d –name zabbix-agent –link zabbix-server -e ZBX_HOSTNAME=ebi-serverA zabbix/zabbix-agent:alpine
grafana:
image: grafana/grafana:latest
ports: 3000:3000
volumes: ./grafana_data:/var/lib/grafana
🎯 常用kubectl操作(练习生产)
kubectl get nodes | pods | svc -o wide
kubectl edit replicaset <name> → 修改replicas得到多副本
kubectl logs <pod> -f
kubectl exec -it <pod> — /bin/bash
kubectl delete deployment <name>
kubectl create deployment ebi-dep –image=ebilibili:log-cluster –replicas=6
kubectl expose deployment ebi-dep –type=NodePort –port=8000 –target-port=8000
kubectl apply -f nginx-deployment.yml
kubectl describe service/pod/deployment
🔁 Service & 网络策略
ClusterIP 默认内部访问,NodePort 30000~32767 对外暴露
kubectl create service clusterip ebi-svc –tcp=8000:8000
命名空间隔离: kubectl create ns ebilibili-ns
kubectl get all -n ebilibili-ns
使用 Ingress 替代 Nginx 集群做7层路由
🧩 容器化到K8s过渡思路: 将当前 Docker 集群转化为 Deployment + Service + HPA,利用 Redis Cluster Operator 实现日志采集,并通过 Prometheus + Grafana 监控,Zabbix 亦可对接 K8s 监控插件。
+——————+ +————————+ +——————–+
| Git + Jenkins |—–>| Harbor镜像仓库 |<-----| A/B/C服务器集群 |
| (CI触发构建) | | (存储ebilibili镜像) | | (每个节点2容器) |
+------------------+ +------------------------+ +--------------------+
|
+-------v-------+
| Nginx 集群 |
| 负载均衡器 |
| (UPSTREAM 6副本)|
+-------v-------+
|
[ Ebilibili 下载站 ]
|
+------------------+ |
| Redis 集群(日志) |<------------+
| 3节点 收集访问日志 |
+------------------+
| Zabbix+Grafana |
| 监控服务器/容器/ |
| Redis队列/Nginx |
+------------------+
✔️ 步骤1: Redis集群日志收集
✔️ 步骤2: Dockerfile 镜像化
✔️ 步骤3: 镜像载入ABC服务器
✔️ 步骤4: Nginx集群负载均衡
✔️ 步骤5: Jenkins 自动构建推送
✔️ 步骤6: Zabbix+Grafana监控
🎯 运维练习指南:模拟生产变更,滚动更新镜像,观察Redis日志聚合,通过Grafana看板定位瓶颈,使用kubectl命令将架构迁移至K8s进一步升级。
评论(1)