运维岗位完整学习指南:岗位职责、技能体系、工具详解、学习路线、项目实战与面试题 🛠️
适合人群:零基础想转运维、应届生准备系统运维/云运维/DevOps、已经会一点 Linux 但不知道下一步学什么的人。
文档目标:讲清楚 运维岗位到底做什么、需要掌握什么、学什么、用什么工具、怎么做项目、怎么准备面试 。
不绑定前端、不围绕开发岗位展开,重点讲真实企业运维、云运维、DevOps、SRE 常用能力。
目录
- [1. 运维岗位是什么](#1. 运维岗位是什么)
- [2. 运维岗位的发展方向](#2. 运维岗位的发展方向)
- [3. 运维核心能力模型](#3. 运维核心能力模型)
- [4. Linux 系统管理](#4. Linux 系统管理)
- [5. 计算机网络与排障](#5. 计算机网络与排障)
- [6. Web 服务与负载均衡](#6. Web 服务与负载均衡)
- [7. 数据库与中间件运维](#7. 数据库与中间件运维)
- [8. Shell 与 Python 自动化](#8. Shell 与 Python 自动化)
- [9. Docker 容器运维](#9. Docker 容器运维)
- [10. Kubernetes 云原生运维](#10. Kubernetes 云原生运维)
- [11. 监控告警与可观测性](#11. 监控告警与可观测性)
- [12. 日志系统与链路追踪](#12. 日志系统与链路追踪)
- [13. CI/CD 与发布系统](#13. CI/CD 与发布系统)
- [14. 自动化运维与 IaC](#14. 自动化运维与 IaC)
- [15. 云平台运维](#15. 云平台运维)
- [16. 安全运维](#16. 安全运维)
- [17. 备份、容灾与高可用](#17. 备份、容灾与高可用)
- [18. SRE 与稳定性工程](#18. SRE 与稳定性工程)
- [19. 运维学习路线](#19. 运维学习路线)
- [20. 运维实战项目](#20. 运维实战项目)
- [21. 运维面试题与答案](#21. 运维面试题与答案)
- [22. 官方文档与学习资源](#22. 官方文档与学习资源)
- [23. 总结](#23. 总结)
1. 运维岗位是什么
运维,全称通常叫 IT Operations / System Operations / Infrastructure Operations,在公司里主要负责服务器、网络、系统、中间件、数据库、容器平台、发布流程、监控告警、安全加固、故障恢复等工作。
一句话理解:
运维的核心职责是 让系统稳定、安全、高效、可持续地运行。
运维不是简单地"重启服务器""装软件""看日志",而是要围绕以下目标工作:
| 核心目标 | 说明 |
|---|---|
| 稳定性 | 服务不能频繁宕机,系统要能长时间稳定运行 |
| 可用性 | 用户能够正常访问系统,核心服务不能随便不可用 |
| 可观测性 | 系统出问题时能通过监控、日志、链路追踪快速定位 |
| 自动化 | 减少手动操作,降低人为失误,提高效率 |
| 安全性 | 防止入侵、越权、数据泄露、恶意请求、漏洞攻击 |
| 可恢复性 | 出现故障后能够快速回滚、恢复、切换、备份还原 |
| 成本控制 | 云服务器、带宽、存储、数据库、监控资源不能浪费 |
2. 运维岗位的发展方向
运维岗位不是单一岗位,而是一组相关方向。不同公司叫法不一样,但能力有很多重叠。
2.1 系统运维
主要负责 Linux/Windows 服务器、系统服务、用户权限、磁盘、网络、进程、系统安全等。
需要重点掌握:
- Linux 系统管理
- 用户、权限、进程、服务
- 磁盘、LVM、文件系统
- Shell 脚本
- 系统日志
- SSH 与安全加固
- 防火墙、安全组
- 常见服务部署
适合入门岗位:初级运维工程师、Linux 运维工程师、系统管理员。
2.2 网络运维
主要负责交换机、路由器、防火墙、VPN、DNS、负载均衡、机房网络、云网络等。
需要重点掌握:
- TCP/IP
- VLAN、子网、路由
- DNS、HTTP、HTTPS
- 防火墙策略
- VPN
- CDN
- SLB/CLB
- 网络抓包
- 网络故障定位
适合方向:网络工程师、网络运维、IDC 运维、云网络运维。
2.3 应用运维
主要负责业务应用的部署、发布、配置、日志、性能、监控、回滚、故障处理。
需要重点掌握:
- Nginx / Apache
- Tomcat / Java 应用部署
- Node/PHP/Python/Go 服务部署基础
- MySQL / Redis / MQ 基础
- 日志排查
- 监控告警
- 发布回滚
- 性能分析
适合方向:应用运维工程师、业务运维工程师、平台运维工程师。
2.4 数据库运维 DBA
主要负责数据库安装、备份、恢复、主从复制、高可用、性能优化、慢查询分析、容量规划。
需要重点掌握:
- MySQL / PostgreSQL
- Redis
- MongoDB
- Elasticsearch
- 数据备份与恢复
- 主从复制
- 高可用架构
- SQL 优化
- 慢查询分析
- 数据安全
适合方向:数据库管理员 DBA、数据库运维工程师。
2.5 云运维
主要负责云服务器、云数据库、云网络、对象存储、负载均衡、CDN、云监控、安全组、权限等。
需要重点掌握:
- ECS/CVM 云服务器
- VPC 私有网络
- 安全组
- SLB/CLB 负载均衡
- RDS 云数据库
- OSS/COS/S3 对象存储
- CDN
- 云监控
- IAM/RAM 权限
- 云安全
- 云成本优化
适合方向:云运维工程师、云平台运维、云计算工程师。
2.6 DevOps 工程师
DevOps 更偏向自动化、效率平台、CI/CD、容器化、基础设施即代码。
需要重点掌握:
- Git
- Jenkins / GitLab CI / GitHub Actions
- Docker
- Kubernetes
- Helm
- Harbor
- Ansible
- Terraform
- Prometheus / Grafana
- 发布平台
- 自动化脚本
适合方向:DevOps 工程师、平台工程师、自动化运维工程师。
2.7 SRE 稳定性工程师
SRE 是 Site Reliability Engineering,站点可靠性工程。相比传统运维,SRE 更强调工程化、指标化、自动化、可靠性治理。
需要重点掌握:
- SLI / SLO / SLA
- 错误预算
- 故障复盘
- 容量规划
- 限流、熔断、降级
- 灾备演练
- 混沌工程
- 可观测性
- 自动化恢复
- 高可用架构
适合方向:SRE 工程师、稳定性工程师、高级运维、基础架构工程师。
3. 运维核心能力模型
一个合格运维应该具备以下 8 类能力。
| 能力 | 初级要求 | 进阶要求 |
|---|---|---|
| 系统能力 | 会用 Linux 命令、管理服务 | 会内核参数、性能调优、系统安全 |
| 网络能力 | 会 ping、curl、DNS、端口排查 | 会抓包、负载均衡、网络架构设计 |
| 部署能力 | 会手动部署服务 | 会自动化发布、灰度、回滚 |
| 排障能力 | 能看日志定位常见问题 | 能定位复杂链路、性能瓶颈 |
| 监控能力 | 会看 CPU/内存/磁盘 | 会设计指标、告警、Dashboard |
| 自动化能力 | 会写 Shell 脚本 | 会 Ansible、Python、Terraform |
| 容器能力 | 会 Docker 基础命令 | 会 K8s、Helm、GitOps |
| 安全能力 | 会改 SSH、防火墙 | 会漏洞修复、权限治理、审计 |
运维能力可以用一句话概括:
能部署、能监控、能排障、能自动化、能恢复、能优化。
4. Linux 系统管理
Linux 是运维的核心基础。无论是传统服务器、云服务器、Docker 宿主机还是 Kubernetes 节点,本质上都离不开 Linux。
4.1 Linux 发行版
常见发行版:
| 发行版 | 特点 | 企业常见度 |
|---|---|---|
| CentOS | 曾经非常流行,传统企业常见 | 老项目常见 |
| Rocky Linux | CentOS 替代方案之一 | 新项目可选 |
| AlmaLinux | CentOS 替代方案之一 | 新项目可选 |
| Ubuntu Server | 社区活跃,云平台常见 | 非常常见 |
| Debian | 稳定、轻量 | 常见 |
| RHEL | Red Hat 企业版 | 大型企业常见 |
| openEuler | 国产服务器场景常见 | 国内政企常见 |
建议学习顺序:
text
Ubuntu Server / Rocky Linux 二选一入门
→ 熟悉包管理、服务管理、日志管理
→ 再了解 RHEL/CentOS 系生态差异
4.2 Linux 文件目录结构
| 目录 | 作用 |
|---|---|
/bin |
基础命令 |
/sbin |
系统管理命令 |
/etc |
配置文件目录 |
/var |
日志、缓存、运行数据 |
/var/log |
系统和服务日志 |
/usr |
用户程序、库文件 |
/home |
普通用户家目录 |
/root |
root 用户家目录 |
/opt |
第三方软件安装目录 |
/tmp |
临时文件目录 |
/proc |
内核和进程虚拟文件系统 |
/dev |
设备文件 |
/mnt |
临时挂载目录 |
排障时常看的目录:
bash
/etc/nginx/ # Nginx 配置
/var/log/nginx/ # Nginx 日志
/etc/systemd/system/ # systemd 自定义服务
/var/log/messages # 系统日志,RHEL 系
/var/log/syslog # 系统日志,Debian/Ubuntu 系
/var/log/secure # 登录和认证日志,RHEL 系
/var/log/auth.log # 登录和认证日志,Ubuntu 系
4.3 Linux 必会命令
文件操作
bash
ls -lh
cd /opt
pwd
cp a.txt b.txt
mv old.txt new.txt
rm -rf /tmp/test
mkdir -p /data/app
find /var/log -type f -name "*.log"
文本查看
bash
cat file.log
less file.log
head -n 50 file.log
tail -n 100 file.log
tail -f app.log
grep "ERROR" app.log
grep -rn "timeout" /var/log/
文本处理
bash
awk '{print $1}' access.log
sed -n '1,20p' app.log
sort access.log
uniq -c
cut -d ':' -f1 /etc/passwd
压缩解压
bash
tar -czvf backup.tar.gz /data/www
tar -xzvf backup.tar.gz
zip -r backup.zip /data/www
unzip backup.zip
权限管理
bash
chmod 755 script.sh
chmod 644 config.conf
chown nginx:nginx /data/www
usermod -aG wheel zhangsan
权限理解:
| 权限 | 数字 | 说明 |
|---|---|---|
| r | 4 | 读 |
| w | 2 | 写 |
| x | 1 | 执行 |
| 755 | rwxr-xr-x | 所有者可读写执行,其他人读执行 |
| 644 | rw-r--r-- | 所有者可读写,其他人只读 |
| 600 | rw------- | 只有所有者可读写,常用于私钥 |
4.4 用户与权限
bash
# 创建用户
useradd deploy
passwd deploy
# 创建用户组
groupadd devops
# 加入用户组
usermod -aG devops deploy
# 查看用户
id deploy
# 删除用户
userdel -r deploy
sudo 权限配置:
bash
visudo
示例:
bash
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
意思是:deploy 用户可以免密执行重启 Nginx 的命令,但不能随意执行所有 root 命令。
4.5 进程管理
bash
ps aux | grep nginx
top
htop
pidof nginx
kill -9 PID
pgrep java
常见排查思路:
text
服务访问异常
→ 查看进程是否存在
→ 查看端口是否监听
→ 查看日志是否报错
→ 查看资源是否耗尽
→ 查看配置是否变更
4.6 systemd 服务管理
bash
systemctl status nginx
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx
systemctl enable nginx
systemctl disable nginx
journalctl -u nginx -f
journalctl -xe
自定义 systemd 服务示例:
ini
[Unit]
Description=My App Service
After=network.target
[Service]
User=deploy
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -jar /opt/myapp/app.jar
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
保存路径:
bash
/etc/systemd/system/myapp.service
启用:
bash
systemctl daemon-reload
systemctl enable myapp
systemctl start myapp
4.7 磁盘与文件系统
常用命令:
bash
df -h # 查看磁盘空间
du -sh /var/log # 查看目录大小
lsblk # 查看磁盘结构
fdisk -l # 查看磁盘分区
mount # 查看挂载
mount /dev/sdb1 /data # 挂载磁盘
umount /data # 卸载磁盘
排查磁盘满:
bash
# 查看哪个分区满了
df -h
# 找大目录
du -h --max-depth=1 / | sort -h
# 找大文件
find / -type f -size +500M 2>/dev/null
# 查看已删除但仍被进程占用的文件
lsof | grep deleted
常见磁盘满原因:
| 原因 | 处理方式 |
|---|---|
| 日志过大 | 日志切割、压缩、清理 |
| Docker 日志过大 | 配置 log-driver 和 max-size |
| 数据库 binlog 过多 | 设置过期时间,谨慎清理 |
| 临时文件过多 | 清理 /tmp、缓存目录 |
| 删除文件后空间未释放 | 查找 deleted 文件,重启对应进程 |
5. 计算机网络与排障
网络是运维排障的核心。很多线上问题表面是"网站打不开",实际可能是 DNS、证书、端口、防火墙、负载均衡、服务挂掉、后端超时、网络链路问题。
5.1 必学网络知识
| 知识点 | 必须掌握 |
|---|---|
| IP 地址 | 公网 IP、内网 IP、IPv4、IPv6 |
| 子网掩码 | /24、/16、CIDR |
| 网关 | 出网入口 |
| DNS | 域名解析流程 |
| TCP | 三次握手、四次挥手、可靠传输 |
| UDP | 无连接、速度快、常用于 DNS/音视频 |
| HTTP | 请求方法、状态码、Header |
| HTTPS | TLS/SSL、证书、加密 |
| CDN | 缓存、回源、刷新、预热 |
| NAT | 内外网地址转换 |
| 负载均衡 | 四层、七层、轮询、权重、IP hash |
5.2 常用网络命令
bash
ping example.com
curl -I https://example.com
curl -v https://example.com
nslookup example.com
dig example.com
traceroute example.com
mtr example.com
ss -tunlp
netstat -tunlp
ip addr
ip route
telnet 1.1.1.1 443
nc -zv 1.1.1.1 443
tcpdump -i eth0 port 80
5.3 HTTP 状态码排障
| 状态码 | 含义 | 运维排查方向 |
|---|---|---|
| 200 | 正常 | 无需处理 |
| 301/302 | 重定向 | 检查 Nginx rewrite、HTTPS 跳转 |
| 400 | 请求错误 | 检查请求参数、Header、网关限制 |
| 401 | 未认证 | 检查认证配置 |
| 403 | 禁止访问 | 检查权限、目录权限、Nginx allow/deny |
| 404 | 找不到资源 | 检查路径、路由、文件是否存在 |
| 413 | 请求体太大 | 调整 Nginx client_max_body_size |
| 499 | 客户端断开 | 检查接口慢、用户取消请求、网络差 |
| 500 | 服务内部错误 | 查应用日志 |
| 502 | 网关错误 | 后端服务挂了、端口不通、代理配置错 |
| 503 | 服务不可用 | 后端过载、维护、限流 |
| 504 | 网关超时 | 后端处理慢、超时时间过短 |
5.4 网站打不开的标准排查流程
text
1. 用户是否能解析域名?
nslookup domain.com
dig domain.com
2. 域名是否解析到正确 IP?
对比 DNS 记录和服务器公网 IP
3. 服务器是否能 ping 通?
ping server_ip
4. 端口是否开放?
nc -zv server_ip 80
nc -zv server_ip 443
5. 云安全组是否放行?
检查云平台安全组入方向规则
6. 服务器防火墙是否放行?
firewall-cmd --list-all
iptables -L -n
7. Nginx 是否启动?
systemctl status nginx
8. Nginx 配置是否正确?
nginx -t
9. 后端服务是否启动?
ps aux | grep app
ss -tunlp | grep 8080
10. 日志是否报错?
tail -f /var/log/nginx/error.log
tail -f app.log
6. Web 服务与负载均衡
6.1 Nginx 需要掌握什么
Nginx 是运维最常用的 Web 服务、反向代理和负载均衡组件之一。
必须掌握:
| 模块 | 内容 |
|---|---|
| 安装 | yum/apt 安装、源码编译了解即可 |
| 配置结构 | main、events、http、server、location |
| 静态网站 | root、index、try_files |
| 反向代理 | proxy_pass、proxy_set_header |
| 负载均衡 | upstream、weight、ip_hash |
| HTTPS | SSL 证书配置、强制跳转 |
| 日志 | access.log、error.log、自定义 log_format |
| 限流 | limit_req、limit_conn |
| 缓存 | proxy_cache |
| 压缩 | gzip |
| 重写 | rewrite、return |
| 安全 | 禁止访问隐藏文件、限制方法、隐藏版本号 |
6.2 Nginx 静态站点配置
nginx
server {
listen 80;
server_name example.com;
root /data/www/example;
index index.html index.htm;
location / {
try_files $uri $uri/ /index.html;
}
access_log /var/log/nginx/example_access.log;
error_log /var/log/nginx/example_error.log;
}
6.3 Nginx 反向代理配置
nginx
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
6.4 Nginx 负载均衡配置
nginx
upstream app_backend {
server 10.0.0.11:8080 weight=3;
server 10.0.0.12:8080 weight=2;
server 10.0.0.13:8080 backup;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://app_backend;
}
}
常见负载均衡策略:
| 策略 | 说明 |
|---|---|
| 轮询 | 默认方式,请求依次转发 |
| weight | 权重越高,请求越多 |
| ip_hash | 同一 IP 尽量转发到同一后端 |
| least_conn | 优先转发到连接数少的节点 |
| backup | 主节点不可用时启用备用节点 |
6.5 HTTPS 配置
nginx
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
7. 数据库与中间件运维
运维不一定要成为 DBA,但必须会部署、备份、恢复、监控和基础排障。
7.1 MySQL 运维
必须掌握:
| 模块 | 内容 |
|---|---|
| 安装部署 | yum/apt/docker 安装 |
| 用户权限 | 创建用户、授权、回收权限 |
| 数据备份 | mysqldump、物理备份了解 |
| 数据恢复 | 导入 SQL、指定库恢复 |
| 主从复制 | binlog、relay log、GTID |
| 慢查询 | slow query log、explain |
| 性能指标 | QPS、TPS、连接数、锁等待 |
| 安全 | 禁止 root 远程、强密码、最小权限 |
常用命令:
sql
-- 查看数据库
SHOW DATABASES;
-- 查看用户
SELECT user, host FROM mysql.user;
-- 创建用户
CREATE USER 'appuser'@'%' IDENTIFIED BY 'StrongPassword';
-- 授权
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 查看连接数
SHOW STATUS LIKE 'Threads_connected';
-- 查看慢查询是否开启
SHOW VARIABLES LIKE 'slow_query_log';
备份恢复:
bash
# 备份单库
mysqldump -uroot -p appdb > appdb_$(date +%F).sql
# 备份所有库
mysqldump -uroot -p --all-databases > all_$(date +%F).sql
# 恢复
mysql -uroot -p appdb < appdb_2026-06-08.sql
7.2 Redis 运维
必须掌握:
| 模块 | 内容 |
|---|---|
| 数据结构 | string、hash、list、set、zset |
| 持久化 | RDB、AOF |
| 主从复制 | master/replica |
| 高可用 | Sentinel |
| 集群 | Redis Cluster |
| 内存管理 | maxmemory、淘汰策略 |
| 安全 | requirepass、bind、防火墙 |
| 监控 | connected_clients、used_memory、ops |
常用命令:
bash
redis-cli ping
redis-cli info
redis-cli info memory
redis-cli info replication
redis-cli config get maxmemory
redis-cli slowlog get 10
重点指标:
| 指标 | 说明 |
|---|---|
| used_memory | Redis 使用内存 |
| connected_clients | 当前客户端连接数 |
| instantaneous_ops_per_sec | 每秒操作数 |
| keyspace_hits / misses | 缓存命中与未命中 |
| rejected_connections | 被拒绝连接数 |
| expired_keys | 过期 key 数量 |
| evicted_keys | 被淘汰 key 数量 |
7.3 消息队列
常见消息队列:
| 工具 | 场景 |
|---|---|
| RabbitMQ | 传统业务异步、可靠投递 |
| Kafka | 日志、流式数据、高吞吐 |
| RocketMQ | 电商、金融、事务消息 |
运维需要关注:
- 队列堆积
- 消费者是否存活
- 消息重试
- 死信队列
- 磁盘占用
- Broker 状态
- 集群副本
- 消息丢失风险
7.4 Elasticsearch 运维
需要掌握:
- 集群健康:green/yellow/red
- index、shard、replica
- mapping
- 查询性能
- JVM 内存
- 磁盘水位
- 快照备份
- ILM 生命周期管理
常用命令:
bash
curl http://localhost:9200/_cluster/health?pretty
curl http://localhost:9200/_cat/indices?v
curl http://localhost:9200/_cat/nodes?v
curl http://localhost:9200/_cat/shards?v
8. Shell 与 Python 自动化
运维如果只会手动操作,很难成长。自动化是运维进阶的关键。
8.1 Shell 必学内容
| 内容 | 说明 |
|---|---|
| 变量 | 保存路径、服务名、日期等 |
| 参数 | $1、$2、$@ |
| 条件判断 | if、case |
| 循环 | for、while |
| 函数 | 封装重复逻辑 |
| 文本处理 | grep、awk、sed |
| 定时任务 | crontab |
| 日志输出 | 标准输出、错误输出 |
| 退出码 | $? |
8.2 Shell 巡检脚本示例
bash
#!/bin/bash
DATE=$(date +%F_%H-%M-%S)
REPORT="/tmp/server_check_$DATE.txt"
{
echo "===== 服务器巡检报告 ====="
echo "时间: $(date)"
echo
echo "===== 主机名 ====="
hostname
echo
echo "===== 系统版本 ====="
cat /etc/os-release | head -n 5
echo
echo "===== CPU 负载 ====="
uptime
echo
echo "===== 内存使用 ====="
free -h
echo
echo "===== 磁盘使用 ====="
df -h
echo
echo "===== 端口监听 ====="
ss -tunlp
echo
echo "===== 最近登录 ====="
last -n 5
} > "$REPORT"
echo "巡检完成:$REPORT"
8.3 磁盘告警脚本
bash
#!/bin/bash
THRESHOLD=80
USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$USAGE" -ge "$THRESHOLD" ]; then
echo "警告:根分区磁盘使用率 ${USAGE}%,超过 ${THRESHOLD}%"
else
echo "正常:根分区磁盘使用率 ${USAGE}%"
fi
8.4 Python 运维自动化
Python 适合做:
- 批量 SSH 管理
- 调用云平台 API
- 巡检报表
- 日志分析
- 自动化平台后端
- 监控数据处理
- 告警消息发送
常用库:
| 库 | 用途 |
|---|---|
| os / sys | 系统操作 |
| subprocess | 执行系统命令 |
| requests | 调用 HTTP API |
| paramiko | SSH 自动化 |
| fabric | 批量远程执行 |
| pandas | 处理巡检表格 |
| schedule | 简单定时任务 |
| fastapi | 写运维平台接口 |
9. Docker 容器运维
Docker 是现代运维必须掌握的基础技能。它解决了"环境不一致、部署复杂、依赖冲突"的问题。
9.1 Docker 核心概念
| 概念 | 说明 |
|---|---|
| Image 镜像 | 应用运行环境模板 |
| Container 容器 | 镜像运行后的实例 |
| Dockerfile | 构建镜像的说明文件 |
| Registry | 镜像仓库 |
| Volume | 数据持久化 |
| Network | 容器网络 |
| Compose | 多容器编排工具 |
9.2 Docker 常用命令
bash
# 查看版本
docker version
# 查看镜像
docker images
# 查看运行中容器
docker ps
# 查看所有容器
docker ps -a
# 启动 Nginx 容器
docker run -d --name nginx-demo -p 80:80 nginx
# 查看日志
docker logs -f nginx-demo
# 进入容器
docker exec -it nginx-demo bash
# 停止容器
docker stop nginx-demo
# 删除容器
docker rm nginx-demo
# 删除镜像
docker rmi nginx
9.3 Dockerfile 示例
dockerfile
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY app.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
构建和运行:
bash
docker build -t myapp:1.0 .
docker run -d --name myapp -p 8080:8080 myapp:1.0
9.4 docker-compose 示例
yaml
version: "3.8"
services:
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
app:
image: myapp:1.0
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
redis:
image: redis:7
ports:
- "6379:6379"
启动:
bash
docker compose up -d
docker compose ps
docker compose logs -f
docker compose down
9.5 Docker 常见故障
| 问题 | 排查方式 |
|---|---|
| 容器启动失败 | docker logs 容器名 |
| 端口冲突 | ss -tunlp 查看端口占用 |
| 容器访问不了外网 | 检查 Docker 网络、DNS、防火墙 |
| 数据丢失 | 是否使用 volume 持久化 |
| 镜像过大 | 多阶段构建、减少依赖、清理缓存 |
| 日志过大 | 配置 Docker 日志大小限制 |
Docker 日志限制示例:
json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
路径:
bash
/etc/docker/daemon.json
10. Kubernetes 云原生运维
Kubernetes,简称 K8s,是容器编排系统,用于管理大规模容器应用。
10.1 为什么要学 Kubernetes
Docker 能运行单个容器,但企业线上环境通常需要:
- 多个服务
- 多台机器
- 自动重启
- 自动扩容
- 服务发现
- 配置管理
- 灰度发布
- 负载均衡
- 存储挂载
- 权限控制
- 集群调度
这些就是 Kubernetes 解决的问题。
10.2 K8s 核心组件
| 组件 | 作用 |
|---|---|
| kube-apiserver | 集群 API 入口 |
| etcd | 保存集群状态数据 |
| scheduler | 调度 Pod 到节点 |
| controller-manager | 维护集群期望状态 |
| kubelet | 节点代理,管理 Pod |
| kube-proxy | 服务转发 |
| container runtime | 容器运行时,如 containerd |
10.3 K8s 核心资源
| 资源 | 作用 |
|---|---|
| Pod | 最小运行单元 |
| Deployment | 无状态应用部署 |
| StatefulSet | 有状态应用部署 |
| DaemonSet | 每个节点运行一个 Pod |
| Job | 一次性任务 |
| CronJob | 定时任务 |
| Service | 服务访问入口 |
| Ingress | HTTP/HTTPS 路由入口 |
| ConfigMap | 普通配置 |
| Secret | 敏感配置 |
| PV/PVC | 持久化存储 |
| Namespace | 资源隔离 |
| RBAC | 权限控制 |
| HPA | 自动扩缩容 |
10.4 kubectl 常用命令
bash
kubectl get nodes
kubectl get pods -A
kubectl get svc -A
kubectl get deploy -A
kubectl describe pod pod-name
kubectl logs -f pod-name
kubectl exec -it pod-name -- bash
kubectl apply -f deployment.yaml
kubectl delete -f deployment.yaml
kubectl rollout status deployment myapp
kubectl rollout history deployment myapp
kubectl rollout undo deployment myapp
10.5 Deployment 示例
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0
ports:
- containerPort: 8080
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
10.6 Service 示例
yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
10.7 Ingress 示例
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-service
port:
number: 80
10.8 K8s 常见故障排查
Pod 一直 Pending
可能原因:
- 节点资源不足
- 节点不可调度
- PVC 没绑定
- 镜像拉取配置问题
- nodeSelector / taint 不匹配
排查命令:
bash
kubectl describe pod pod-name
kubectl get nodes
kubectl describe node node-name
Pod CrashLoopBackOff
可能原因:
- 应用启动报错
- 配置文件错误
- 依赖服务不可用
- 健康检查配置错误
- 资源限制过小导致 OOM
排查命令:
bash
kubectl logs pod-name
kubectl logs pod-name --previous
kubectl describe pod pod-name
ImagePullBackOff
可能原因:
- 镜像名错误
- tag 不存在
- 私有仓库认证失败
- 节点无法访问镜像仓库
排查:
bash
kubectl describe pod pod-name
Node NotReady
可能原因:
- kubelet 异常
- 容器运行时异常
- 节点资源耗尽
- 网络插件异常
- 节点与 apiserver 通信异常
排查:
bash
systemctl status kubelet
journalctl -u kubelet -f
kubectl describe node node-name
11. 监控告警与可观测性
监控不是"装个面板"那么简单,真正的监控要解决三个问题:
text
1. 出问题能及时发现
2. 出问题能快速定位
3. 出问题能量化影响范围
11.1 监控体系分层
| 层级 | 监控内容 |
|---|---|
| 基础设施层 | CPU、内存、磁盘、网络、负载 |
| 系统服务层 | Nginx、MySQL、Redis、Kafka |
| 容器层 | Docker、containerd、Pod、Node |
| 应用层 | QPS、错误率、响应时间、线程、JVM |
| 业务层 | 登录数、订单数、支付成功率、转化率 |
| 用户体验层 | 页面打开速度、接口耗时、错误提示 |
11.2 Prometheus 技术栈
| 组件 | 作用 |
|---|---|
| Prometheus Server | 采集和存储指标 |
| Exporter | 暴露指标 |
| Node Exporter | Linux 主机指标 |
| Blackbox Exporter | HTTP/TCP/ICMP 探测 |
| cAdvisor | 容器指标 |
| Alertmanager | 告警分组、静默、发送 |
| Grafana | 可视化 Dashboard |
11.3 常见监控指标
Linux 主机
| 指标 | 告警建议 |
|---|---|
| CPU 使用率 | 连续 5 分钟超过 80% |
| 内存使用率 | 连续 5 分钟超过 85% |
| 磁盘使用率 | 超过 80% 提醒,超过 90% 严重 |
| 磁盘 IO | await、util 过高 |
| 网络流量 | 异常突增或丢包 |
| Load Average | 超过 CPU 核心数较多 |
Web 服务
| 指标 | 说明 |
|---|---|
| QPS | 每秒请求数 |
| 4xx 比例 | 客户端错误比例 |
| 5xx 比例 | 服务端错误比例 |
| P95 响应时间 | 95% 请求的耗时 |
| 活跃连接数 | 并发连接情况 |
MySQL
| 指标 | 说明 |
|---|---|
| Threads_connected | 当前连接数 |
| Slow_queries | 慢查询数量 |
| Queries | 查询总数 |
| Innodb_buffer_pool_hit_rate | 缓存命中率 |
| Seconds_Behind_Master | 主从延迟 |
Redis
| 指标 | 说明 |
|---|---|
| used_memory | 内存占用 |
| connected_clients | 客户端连接 |
| evicted_keys | 淘汰 key |
| keyspace_hits/misses | 缓存命中率 |
| ops_per_sec | 每秒操作数 |
11.4 Prometheus 告警规则示例
yaml
groups:
- name: node-alerts
rules:
- alert: HostHighCpuUsage
expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "主机 CPU 使用率过高"
description: "{{ $labels.instance }} CPU 使用率超过 80%"
- alert: HostDiskWillFull
expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 < 15
for: 5m
labels:
severity: critical
annotations:
summary: "磁盘空间不足"
description: "{{ $labels.instance }} 磁盘可用空间低于 15%"
12. 日志系统与链路追踪
日志是排障的第一现场。监控告诉你"出问题了",日志告诉你"为什么出问题"。
12.1 日志分类
| 日志类型 | 示例 |
|---|---|
| 系统日志 | syslog、messages、secure、auth.log |
| Web 日志 | Nginx access.log、error.log |
| 应用日志 | app.log、error.log |
| 数据库日志 | MySQL error log、slow log、binlog |
| 容器日志 | Docker json log、K8s pod log |
| 安全日志 | 登录失败、sudo 操作、异常 IP |
12.2 ELK / EFK
| 组件 | 作用 |
|---|---|
| Elasticsearch | 存储和搜索日志 |
| Logstash | 日志清洗和转换 |
| Kibana | 日志查询和可视化 |
| Filebeat | 轻量级日志采集 |
| Fluent Bit | 云原生日志采集 |
ELK 常见流程:
text
应用日志
→ Filebeat / Fluent Bit
→ Logstash / Kafka
→ Elasticsearch
→ Kibana 查询分析
12.3 Loki 日志体系
Loki 是 Grafana 生态常见日志系统,适合和 Prometheus/Grafana 搭配。
常见流程:
text
应用日志
→ Promtail / Fluent Bit
→ Loki
→ Grafana 查询
适合场景:
- 中小规模日志系统
- K8s 日志采集
- 希望和 Grafana 统一展示
- 不需要复杂全文检索
12.4 链路追踪
链路追踪用于排查微服务调用链问题。
常见工具:
| 工具 | 说明 |
|---|---|
| Jaeger | 开源分布式追踪系统 |
| Zipkin | 经典链路追踪工具 |
| SkyWalking | 国产常见 APM 工具 |
| OpenTelemetry | 统一可观测性标准 |
链路追踪能解决:
- 请求经过了哪些服务
- 哪个服务耗时最高
- 哪个接口报错
- 调用链是否断裂
- 微服务之间依赖关系
13. CI/CD 与发布系统
CI/CD 是 DevOps 的核心能力。
13.1 CI/CD 是什么
| 名称 | 含义 |
|---|---|
| CI | Continuous Integration,持续集成 |
| CD | Continuous Delivery / Deployment,持续交付/持续部署 |
标准流程:
text
提交代码
→ 触发流水线
→ 拉取代码
→ 安装依赖
→ 编译构建
→ 单元测试
→ 构建镜像
→ 推送镜像仓库
→ 部署测试环境
→ 人工审批
→ 部署生产环境
→ 健康检查
→ 失败回滚
13.2 Jenkins
Jenkins 是传统企业常用 CI/CD 工具。
需要掌握:
- Jenkins 安装
- 插件管理
- 凭据管理
- Pipeline
- Jenkinsfile
- 参数化构建
- Webhook 触发
- 构建日志查看
- 权限控制
- 节点管理
Jenkinsfile 示例:
groovy
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git 'https://example.com/repo.git'
}
}
stage('Build') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('Docker Build') {
steps {
sh 'docker build -t myapp:${BUILD_NUMBER} .'
}
}
stage('Deploy') {
steps {
sh 'docker stop myapp || true'
sh 'docker rm myapp || true'
sh 'docker run -d --name myapp -p 8080:8080 myapp:${BUILD_NUMBER}'
}
}
}
}
13.3 GitLab CI
.gitlab-ci.yml 示例:
yaml
stages:
- build
- docker
- deploy
build-job:
stage: build
script:
- echo "build app"
- mvn clean package -DskipTests
docker-job:
stage: docker
script:
- docker build -t registry.example.com/myapp:$CI_COMMIT_SHORT_SHA .
- docker push registry.example.com/myapp:$CI_COMMIT_SHORT_SHA
deploy-job:
stage: deploy
script:
- kubectl set image deployment/myapp myapp=registry.example.com/myapp:$CI_COMMIT_SHORT_SHA
only:
- main
13.4 发布策略
| 策略 | 说明 | 优点 | 缺点 |
|---|---|---|---|
| 停机发布 | 停服务后更新 | 简单 | 有停机时间 |
| 滚动发布 | 分批替换实例 | 平滑 | 版本并存 |
| 蓝绿发布 | 两套环境切换 | 回滚快 | 成本高 |
| 灰度发布 | 小流量验证 | 风险低 | 实现复杂 |
| 金丝雀发布 | 少量实例新版本 | 可控 | 需要监控支持 |
14. 自动化运维与 IaC
14.1 Ansible
Ansible 用于批量管理服务器、批量安装软件、批量修改配置、批量部署服务。
核心概念:
| 概念 | 说明 |
|---|---|
| Control Node | 控制节点 |
| Managed Node | 被管理节点 |
| Inventory | 主机清单 |
| Module | 模块 |
| Playbook | 自动化剧本 |
| Role | 角色化组织 |
Inventory 示例:
ini
[webservers]
10.0.0.11
10.0.0.12
[dbservers]
10.0.0.21
Playbook 示例:
yaml
- hosts: webservers
become: yes
tasks:
- name: Install nginx
yum:
name: nginx
state: present
- name: Start nginx
service:
name: nginx
state: started
enabled: yes
14.2 Terraform
Terraform 是基础设施即代码工具,用代码创建和管理云资源。
适合管理:
- 云服务器
- VPC
- 子网
- 安全组
- 负载均衡
- RDS
- OSS/S3
- DNS
- Kubernetes 集群
Terraform 示例:
hcl
provider "aws" {
region = "ap-east-1"
}
resource "aws_instance" "web" {
ami = "ami-xxxxxxxx"
instance_type = "t3.micro"
tags = {
Name = "web-server"
}
}
常用命令:
bash
terraform init
terraform plan
terraform apply
terraform destroy
15. 云平台运维
现代运维必须熟悉至少一个云平台。
15.1 云平台核心产品
| 产品 | 说明 |
|---|---|
| ECS/CVM | 云服务器 |
| VPC | 私有网络 |
| Subnet | 子网 |
| Security Group | 安全组 |
| SLB/CLB | 负载均衡 |
| RDS | 云数据库 |
| Redis 云版 | 托管缓存 |
| OSS/COS/S3 | 对象存储 |
| CDN | 内容分发 |
| WAF | Web 防火墙 |
| NAT Gateway | NAT 网关 |
| Cloud Monitor | 云监控 |
| IAM/RAM | 权限管理 |
15.2 云运维必须会的操作
- 购买云服务器
- 配置安全组
- 配置 SSH 登录
- 挂载数据盘
- 创建快照
- 创建负载均衡
- 绑定域名
- 配置 HTTPS 证书
- 使用对象存储
- 配置 CDN
- 配置云监控告警
- 配置 RAM/IAM 子账号权限
- 做云资源成本分析
15.3 云服务器安全组规则建议
| 端口 | 是否开放 | 说明 |
|---|---|---|
| 22 | 限制 IP 开放 | SSH,不建议 0.0.0.0/0 长期开 |
| 80 | 对公网开放 | HTTP |
| 443 | 对公网开放 | HTTPS |
| 3306 | 不建议公网开放 | MySQL |
| 6379 | 不建议公网开放 | Redis |
| 9200 | 不建议公网开放 | Elasticsearch |
| 8080 | 按需开放 | 应用服务端口,建议走 Nginx 代理 |
16. 安全运维
安全是运维必须重视的底线。很多事故不是技术难,而是权限没管好、端口乱开、密码太弱、备份没有加密。
16.1 Linux 安全加固
- 禁止 root 直接 SSH 登录
- 修改默认 SSH 端口,或限制来源 IP
- 使用密钥登录
- 配置 sudo 最小权限
- 定期更新系统补丁
- 关闭不用的服务
- 配置防火墙
- 设置密码复杂度
- 定期审计登录日志
- 重要目录限制权限
SSH 配置示例:
bash
vim /etc/ssh/sshd_config
text
PermitRootLogin no
PasswordAuthentication no
Port 2222
重启 SSH:
bash
systemctl restart sshd
16.2 防火墙
firewalld:
bash
firewall-cmd --state
firewall-cmd --list-all
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
iptables:
bash
iptables -L -n
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
16.3 常见安全风险
| 风险 | 说明 | 解决方式 |
|---|---|---|
| 弱密码 | 容易被爆破 | 强密码、密钥登录、MFA |
| 端口暴露 | 数据库暴露公网 | 安全组限制、内网访问 |
| 权限过大 | 普通用户拥有 root 权限 | 最小权限原则 |
| 证书过期 | HTTPS 访问异常 | 自动续期监控 |
| 依赖漏洞 | 组件版本过旧 | 定期升级、漏洞扫描 |
| 日志泄露 | 日志包含密码/token | 敏感信息脱敏 |
| 备份泄露 | 备份文件公网可下载 | 权限控制、加密存储 |
17. 备份、容灾与高可用
17.1 备份策略
备份不是"复制一份文件"这么简单,需要考虑:
| 维度 | 说明 |
|---|---|
| 备份对象 | 数据库、文件、配置、镜像、证书 |
| 备份频率 | 每小时、每天、每周 |
| 备份类型 | 全量、增量、差异 |
| 备份位置 | 本机、异地、对象存储 |
| 保留周期 | 保留 7 天、30 天、180 天 |
| 恢复演练 | 定期测试能否恢复 |
| 加密 | 防止备份泄露 |
17.2 重要指标:RTO 和 RPO
| 指标 | 含义 | 举例 |
|---|---|---|
| RTO | 恢复时间目标 | 故障后 30 分钟内恢复 |
| RPO | 恢复点目标 | 最多丢失 5 分钟数据 |
简单理解:
text
RTO:最多能停多久
RPO:最多能丢多少数据
17.3 高可用方案
| 层级 | 方案 |
|---|---|
| Web 层 | Nginx 多节点 + 负载均衡 |
| 应用层 | 多实例部署、滚动发布 |
| 数据库 | 主从、MGR、PXC、云 RDS 高可用 |
| Redis | Sentinel、Cluster |
| 存储 | 对象存储、多副本 |
| 机房 | 多可用区、多地域容灾 |
18. SRE 与稳定性工程
SRE 是运维的高阶方向,强调用软件工程方法解决运维稳定性问题。
18.1 SRE 核心概念
| 概念 | 说明 |
|---|---|
| SLA | 对客户承诺的服务可用性 |
| SLO | 内部设定的服务目标 |
| SLI | 衡量服务质量的指标 |
| 错误预算 | 允许失败的空间 |
| MTTR | 平均恢复时间 |
| MTBF | 平均故障间隔时间 |
| Postmortem | 故障复盘 |
18.2 常见 SLI
| 服务类型 | SLI 示例 |
|---|---|
| Web 服务 | 请求成功率、P95 延迟、5xx 比例 |
| 数据库 | 查询延迟、连接成功率、复制延迟 |
| 消息队列 | 消费延迟、积压量、投递成功率 |
| 存储服务 | 读写成功率、读写延迟 |
18.3 故障处理流程
text
1. 发现告警
2. 确认影响范围
3. 判断故障等级
4. 快速止血
5. 通知相关人员
6. 定位根因
7. 修复问题
8. 验证恢复
9. 补充监控
10. 故障复盘
18.4 故障复盘模板
markdown
# 故障复盘报告
## 1. 故障概述
- 故障时间:
- 影响业务:
- 影响用户:
- 故障等级:
## 2. 时间线
- 10:00 监控告警
- 10:03 运维确认
- 10:10 定位到数据库连接数耗尽
- 10:20 临时扩容连接池
- 10:30 服务恢复
## 3. 根因分析
## 4. 处理过程
## 5. 暴露问题
## 6. 改进措施
## 7. 责任人与截止时间
19. 运维学习路线
19.1 第一阶段:Linux 与网络基础,1~2 个月
目标:能独立管理一台 Linux 服务器。
学习内容:
- Linux 基础命令
- 文件权限
- 用户和用户组
- systemd 服务管理
- crontab 定时任务
- SSH
- 防火墙
- 磁盘管理
- 日志查看
- TCP/IP、HTTP、DNS、HTTPS
实战:
- 安装 Linux 虚拟机
- 创建用户并配置 sudo
- 部署 Nginx 静态网站
- 配置 SSH 密钥登录
- 配置防火墙
- 写磁盘巡检脚本
19.2 第二阶段:服务部署与中间件,2~4 个月
目标:能部署常见 Web 服务、数据库和缓存。
学习内容:
- Nginx 反向代理
- HTTPS 配置
- MySQL 安装、授权、备份恢复
- Redis 安装和持久化
- 日志切割
- supervisor/systemd 管理应用
- rsync 文件同步
实战:
- Nginx 反代后端应用
- MySQL 自动备份脚本
- Redis 持久化配置
- 日志自动切割
- 服务异常自动重启
19.3 第三阶段:Docker 与自动化,4~6 个月
目标:能用容器部署服务,能写自动化脚本。
学习内容:
- Docker 镜像和容器
- Dockerfile
- Docker Compose
- Harbor 镜像仓库
- Shell 自动化
- Python 自动化
- Ansible 入门
实战:
- Docker 部署 Nginx/MySQL/Redis
- 编写 Dockerfile
- docker-compose 部署多服务
- Ansible 批量安装 Nginx
- Python 批量巡检服务器
19.4 第四阶段:监控、日志、CI/CD,6~8 个月
目标:能搭建企业基础运维体系。
学习内容:
- Prometheus
- Grafana
- Alertmanager
- ELK / Loki
- Jenkins / GitLab CI
- 发布回滚
- 灰度发布
- 告警通知
实战:
- Prometheus 监控 Linux
- Grafana 制作大盘
- Alertmanager 配置告警
- ELK 收集 Nginx 日志
- Jenkins 自动发布应用
19.5 第五阶段:Kubernetes 与云原生,8~12 个月
目标:具备中高级运维/DevOps 能力。
学习内容:
- Kubernetes 架构
- Pod、Deployment、Service、Ingress
- ConfigMap、Secret、PVC
- Helm
- HPA
- K8s 监控和日志
- Argo CD
- Terraform
- 云平台资源管理
实战:
- 搭建 K8s 测试集群
- 部署应用到 K8s
- 配置 Ingress 域名访问
- Helm 部署 Prometheus
- Argo CD 实现 GitOps 发布
- Terraform 创建云服务器
20. 运维实战项目
项目 1:Linux 服务器初始化脚本
目标:一键完成服务器基础配置。
功能:
- 创建 deploy 用户
- 配置 SSH 安全
- 安装常用工具
- 配置时区
- 配置防火墙
- 配置系统参数
- 创建目录结构
技能点:Linux、Shell、安全加固。
项目 2:Nginx + HTTPS + 负载均衡
目标:搭建可用于生产的 Web 入口。
功能:
- 多域名配置
- HTTPS 证书
- HTTP 强制跳转 HTTPS
- 反向代理
- 多后端负载均衡
- 访问日志
- 错误日志
- 限流配置
技能点:Nginx、HTTPS、负载均衡、日志。
项目 3:MySQL 自动备份与恢复
目标:建立数据库备份机制。
功能:
- 每天凌晨自动备份
- 备份文件压缩
- 保留最近 7 天
- 上传对象存储
- 恢复演练
- 备份失败告警
技能点:MySQL、Shell、crontab、对象存储。
项目 4:Docker Compose 部署中间件环境
目标:快速搭建测试环境。
服务:
- Nginx
- MySQL
- Redis
- RabbitMQ
- Elasticsearch
- Kibana
技能点:Docker、Compose、Volume、Network。
项目 5:Prometheus + Grafana 监控系统
目标:搭建基础监控体系。
功能:
- 监控 Linux 主机
- 监控 Nginx
- 监控 MySQL
- 监控 Redis
- 配置 Grafana 面板
- 配置告警规则
- 告警发送到企业微信/飞书/钉钉
技能点:Prometheus、Grafana、Alertmanager、Exporter。
项目 6:Jenkins 自动化发布系统
目标:实现代码提交后自动构建和部署。
流程:
text
Git 提交
→ Webhook 触发 Jenkins
→ 拉取代码
→ 构建应用
→ 构建 Docker 镜像
→ 推送 Harbor
→ 远程部署
→ 健康检查
→ 失败回滚
技能点:Git、Jenkins、Docker、Harbor、Shell。
项目 7:Kubernetes 应用部署平台
目标:掌握云原生部署。
内容:
- Deployment
- Service
- Ingress
- ConfigMap
- Secret
- PVC
- HPA
- Helm
- Prometheus 监控
技能点:Kubernetes、Helm、云原生运维。
项目 8:Ansible 批量运维平台
目标:实现批量配置和批量部署。
内容:
- 批量安装 Nginx
- 批量修改配置
- 批量重启服务
- 批量创建用户
- 批量巡检服务器
技能点:Ansible、Inventory、Playbook、Role。
项目 9:Terraform 管理云资源
目标:通过代码管理云服务器和网络。
内容:
- 创建 VPC
- 创建子网
- 创建安全组
- 创建云服务器
- 创建负载均衡
- 输出公网 IP
技能点:Terraform、IaC、云平台。
项目 10:故障演练与复盘体系
目标:提升真实排障能力。
演练场景:
- CPU 打满
- 磁盘写满
- Nginx 配置错误
- MySQL 连接数耗尽
- Redis 内存耗尽
- Docker 容器异常退出
- K8s Pod CrashLoopBackOff
- 证书过期
- DNS 解析错误
技能点:监控、日志、应急响应、复盘。
21. 运维面试题与答案
21.1 Linux 面试题
1. 如何查看服务器 CPU、内存、磁盘?
答:
bash
top
free -h
df -h
du -sh /var/log
vmstat 1
iostat -x 1
top 查看 CPU 和进程,free -h 查看内存,df -h 查看磁盘分区,du -sh 查看目录大小。
2. Linux 负载 load average 是什么?
答:
Load average 表示系统运行队列和不可中断状态任务的平均数量。一般可以和 CPU 核心数对比:
- 4 核机器 load 长期小于 4,通常较正常
- 4 核机器 load 长期大于 8,可能存在压力
- 需要结合 CPU、IO、进程状态一起看
3. 如何排查磁盘满?
答:
bash
df -h
du -h --max-depth=1 / | sort -h
find / -type f -size +500M 2>/dev/null
lsof | grep deleted
先看哪个分区满,再定位大目录、大文件。如果文件已删除但空间未释放,检查是否被进程占用。
4. chmod 755 是什么意思?
答:
755 表示:
- 所有者:7 = 读 + 写 + 执行
- 所属组:5 = 读 + 执行
- 其他人:5 = 读 + 执行
适合目录和可执行脚本。
5. 软链接和硬链接区别?
答:
| 类型 | 说明 |
|---|---|
| 软链接 | 类似快捷方式,指向路径,源文件删除后可能失效 |
| 硬链接 | 指向同一个 inode,源文件删除后数据仍可访问 |
命令:
bash
ln source hard_link
ln -s source soft_link
21.2 网络面试题
1. TCP 三次握手是什么?
答:
text
1. 客户端发送 SYN
2. 服务端返回 SYN + ACK
3. 客户端返回 ACK
目的是确认双方收发能力正常,建立可靠连接。
2. HTTP 和 HTTPS 区别?
答:
| 对比 | HTTP | HTTPS |
|---|---|---|
| 默认端口 | 80 | 443 |
| 加密 | 不加密 | TLS/SSL 加密 |
| 安全性 | 明文传输 | 防窃听、防篡改 |
| 证书 | 不需要 | 需要证书 |
3. 502 和 504 有什么区别?
答:
- 502:网关从上游服务收到无效响应,常见于后端服务挂了、端口不通、Nginx 代理配置错误。
- 504:网关等待上游服务超时,常见于后端处理太慢、数据库慢、超时时间过短。
4. 如何判断端口是否通?
答:
bash
nc -zv ip 端口
telnet ip 端口
curl -v http://ip:port
ss -tunlp | grep 端口
从客户端测连通性,从服务端看端口是否监听。
21.3 Nginx 面试题
1. Nginx 有哪些作用?
答:
- 静态 Web 服务
- 反向代理
- 负载均衡
- HTTPS 终止
- 限流
- 缓存
- URL 重写
- TCP/UDP 代理
2. Nginx 修改配置后怎么检查和重载?
答:
bash
nginx -t
systemctl reload nginx
先检查配置语法,确认无误后 reload,避免直接 restart 造成服务中断。
3. Nginx 如何配置上传文件大小?
答:
nginx
client_max_body_size 100m;
可以放在 http、server 或 location 中。
21.4 MySQL 面试题
1. MySQL 如何备份和恢复?
答:
bash
mysqldump -uroot -p appdb > appdb.sql
mysql -uroot -p appdb < appdb.sql
生产环境还需要考虑锁表、数据量、binlog、备份一致性和恢复演练。
2. 什么是慢查询?
答:
慢查询是执行时间超过阈值的 SQL。通过 slow query log 记录,用于分析 SQL 性能问题。
sql
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
21.5 Docker 面试题
1. 镜像和容器区别?
答:
- 镜像是静态模板
- 容器是镜像运行后的实例
类似:镜像是"安装包",容器是"运行中的程序"。
2. Docker 数据如何持久化?
答:
使用 volume 或 bind mount。
bash
docker run -d -v /data/mysql:/var/lib/mysql mysql:8
3. 容器启动失败怎么排查?
答:
bash
docker ps -a
docker logs 容器名
docker inspect 容器名
重点看启动命令、环境变量、端口、挂载目录、应用日志。
21.6 Kubernetes 面试题
1. Pod 是什么?
答:
Pod 是 Kubernetes 中最小调度单元,一个 Pod 可以包含一个或多个容器,共享网络和存储。
2. Deployment 和 StatefulSet 区别?
答:
| 资源 | 适用场景 |
|---|---|
| Deployment | 无状态应用,如 Web 服务 |
| StatefulSet | 有状态应用,如数据库、Zookeeper |
StatefulSet 有稳定的网络标识和存储。
3. Pod CrashLoopBackOff 怎么排查?
答:
bash
kubectl describe pod pod-name
kubectl logs pod-name
kubectl logs pod-name --previous
常见原因:应用启动报错、配置错误、依赖不可用、健康检查失败、资源不足。
21.7 监控面试题
1. Prometheus 的工作原理是什么?
答:
Prometheus 通过 pull 模式定期从目标服务抓取 metrics,存储为时间序列数据,通过 PromQL 查询,并可结合 Alertmanager 发送告警。
2. 告警太多怎么办?
答:
- 告警分级
- 告警收敛
- 设置合理 for 时间
- 去掉无意义告警
- 增加告警抑制
- 按业务影响设计告警
- 避免单纯瞬时抖动触发
21.8 DevOps 面试题
1. 什么是 CI/CD?
答:
CI 是持续集成,CD 是持续交付/持续部署。核心是通过自动化流水线完成构建、测试、部署、回滚,提高发布效率和稳定性。
2. 蓝绿发布和灰度发布区别?
答:
| 发布方式 | 说明 |
|---|---|
| 蓝绿发布 | 两套完整环境,切换流量 |
| 灰度发布 | 部分用户或少量流量先用新版本 |
蓝绿回滚快但成本高;灰度风险低但实现复杂。
22. 官方文档与学习资源
22.1 Linux / 系统管理
22.2 网络 / Web 服务
22.3 数据库与中间件
- MySQL 官方文档
- MySQL Backup and Recovery
- Redis 官方文档
- Redis Persistence
- RabbitMQ 官方文档
- Apache Kafka 官方文档
- Elasticsearch 官方文档
22.4 Docker / Kubernetes
- Docker 官方文档
- Docker Get Started
- Dockerfile Reference
- Kubernetes 官方文档
- Kubernetes Concepts
- Helm 官方文档
- CNCF CKA 认证
22.5 监控 / 日志 / 可观测性
- Prometheus 官方文档
- Grafana 官方文档
- Grafana Alerting
- Alertmanager 文档
- Elastic Observability
- Grafana Loki 文档
- OpenTelemetry 官方文档
- Jaeger 官方文档
22.6 CI/CD / DevOps / 自动化
- Jenkins 官方文档
- Jenkins Pipeline 文档
- GitLab CI/CD 官方文档
- GitHub Actions 文档
- Argo CD 官方文档
- Ansible 官方文档
- Terraform 官方文档
22.7 云平台文档
22.8 安全运维
23. 总结
运维岗位的学习不能只背命令,而要围绕真实工作能力构建:
text
Linux 基础
→ 网络排障
→ Web 服务
→ 数据库与中间件
→ Shell/Python 自动化
→ Docker 容器
→ 监控告警
→ 日志系统
→ CI/CD
→ Ansible/Terraform
→ Kubernetes
→ 云平台
→ 安全运维
→ SRE 稳定性工程
入门阶段重点不要贪多,建议优先学:
- Linux 命令和系统管理
- 网络基础和 HTTP/HTTPS
- Nginx
- MySQL / Redis 基础
- Shell 脚本
- Docker
- Prometheus + Grafana
- Jenkins / GitLab CI
- Ansible
- Kubernetes
最终目标不是"会用工具",而是:
出问题能发现,发现后能定位,定位后能恢复,恢复后能复盘,复盘后能自动化防止再次发生。
这才是真正企业需要的运维能力。 🚀