找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3511

积分

0

好友

454

主题
发表于 17 小时前 | 查看: 3| 回复: 0

“转型SRE,薪资从20K涨到40K,用了18个月。”这是我2023年初的一条朋友圈。那时我刚完成从传统运维到SRE的转身,拿到了心仪的Offer。回想2021年那个迷茫的自己——一个做了4年运维、每天疲于救火、看不到职业前景的工程师,我踩过不少坑,也总结了一套相对高效的转型方法。这篇文章,我将毫无保留地分享这段经历:为什么要转?如何准备?怎样落地和面试?

技术背景:SRE/DevOps是什么?为什么要转型?

SRE和DevOps的本质区别

很多人以为SRE和DevOps是一回事,其实不然。

DevOps(Development + Operations):

  • 定位:一种文化、理念和实践,强调开发和运维的协作
  • 核心目标:加速软件交付速度,缩短开发到上线的周期
  • 关键能力:CI/CD、自动化、敏捷开发、持续改进
  • 典型工作
    • 构建和维护CI/CD流水线
    • 自动化部署和配置管理
    • 监控和日志管理
    • 工具链整合
  • 代表公司:大多数互联网公司都有DevOps岗

SRE(Site Reliability Engineering):

  • 定位:Google创造的工程实践,用软件工程的方法解决运维问题
  • 核心目标:保障系统可靠性,在稳定性和快速迭代之间找平衡
  • 关键能力:编程能力、系统设计、可靠性工程、容量规划
  • 典型工作
    • 设计和实现高可用架构
    • 建立SLO/SLI体系
    • 容量规划和性能优化
  • On-call和故障响应
    • 开发运维平台和工具
  • 代表公司:Google、Facebook、阿里巴巴、字节跳动等大厂

核心差异对比:

维度              | DevOps           | SRE
----------------|-----------------|-----------------
起源             | 敏捷运动          | Google工程实践
核心关注点        | 交付速度          | 系统可靠性
编程要求          | 中等(脚本为主)    | 高(需要开发能力)
系统设计能力      | 中等             | 高
数学/算法要求     | 低               | 中高(容量规划、性能分析)
on-call要求      | 部分公司有        | 必须
典型技术栈       | CI/CD工具、IaC    | 编程语言、监控、分布式系统
职业发展天花板    | 高级DevOps、架构师 | SRE专家、技术总监、CTO

我的理解是:DevOps更像“高级运维”,强调自动化和协作;而SRE则是“软件工程师+运维专家”,强调用代码解决问题。DevOps门槛相对低一些,但SRE的要求更高,相应的职业天花板也更高。

为什么要转型?传统运维的困境

传统运维的典型一天(转型前的我):

08:30 - 上班,查看监控和告警
09:00 - 处理夜间故障告警(数据库连接数过高)
10:00 - 参加产品需求评审会(被要求评估上线风险)
11:00 - 手动执行应用发布(30分钟,紧张兮兮)
12:00 - 午饭
13:00 - 写周报(罗列做了哪些事)
14:00 - 接到开发需求:申请3台服务器
14:30 - 在云控制台手动创建服务器
15:00 - 配置服务器(SSH登录,安装软件)
16:00 - 参加故障复盘会(又被问“为什么监控没提前发现”)
17:00 - 查看明天发布计划,准备发布脚本
18:00 - 下班

19:00 - 吃饭时收到告警:磁盘满了
19:30 - 登录服务器清理日志
20:00 - 真正下班

周末:
- 值班,随时待命
- 遇到故障,立即处理

感受:
- 😫 疲于救火,没有成就感
- 😫 做的都是重复性工作
- 😫 技术没有积累
- 😫 薪资增长缓慢
- 😫 看不到职业前景

转型后的我(SRE):

08:30 - 上班,查看监控Dashboard(自动化监控系统)
09:00 - Code Review:审查团队成员的PR(运维平台功能)
10:00 - 开发:实现自动扩缩容功能(写Go代码)
12:00 - 午饭
13:00 - 技术方案评审:容量规划方案
14:00 - 继续开发:完成代码并写单元测试
15:30 - 提交PR,触发自动化测试和部署(CI/CD)
16:00 - 参加架构讨论会:设计新业务的高可用方案
17:00 - 写技术文档:《容量规划最佳实践》
18:00 - 下班

On-call(每月1周):
- 携带电脑,随时响应(但故障很少,因为系统已经很稳定)
- 有故障时,5分钟内响应,快速定位并修复
- 次日写故障复盘,提出改进措施

感受:
- ✅ 在写代码,在创造价值
- ✅ 技术持续成长
- ✅ 有成就感(系统稳定性显著提升)
- ✅ 薪资翻倍
- ✅ 职业前景清晰

转型的核心原因:

  1. 职业发展:传统运维天花板低,SRE/DevOps天花板高
  2. 薪资待遇:SRE平均薪资比传统运维高50-100%
  3. 技术成长:SRE需要编程、架构设计等硬核技能
  4. 工作体验:从重复劳动到创造价值
  5. 市场需求:传统运维岗位萎缩,SRE/DevOps需求激增

SRE/DevOps的市场需求和薪资

2024年市场数据:

岗位需求趋势(拉勾网数据):
- 传统运维岗位:4500个(同比下降25%)
- SRE岗位:3800个(同比增长45%)
- DevOps岗位:8200个(同比增长38%)

薪资对比(北京,3-5年经验):
- 传统运维:15-25K
- DevOps:20-35K(高30-40%)
- SRE:25-45K(高60-80%)

一线互联网公司SRE薪资(总包):
- 阿里P6 SRE:35-50W
- 字节3-1 SRE:40-60W
- 腾讯T3-1 SRE:35-50W
- 美团L6 SRE:35-50W

技能要求对比:
传统运维:
- Linux系统管理
- Shell脚本
- 监控工具使用
- 故障处理

SRE/DevOps:
- 编程语言(Python/Go)
- Kubernetes和云原生
- CI/CD流水线
- 系统设计和架构
- 监控和可观测性
- 高可用设计
- 容量规划

结论很明确:转型SRE/DevOps不仅是技能升级,更是职业生涯的跃迁。如果你想深入了解这些领域的实践,可以在 云栈社区 的运维板块找到更多相关讨论和资源。

核心内容:我的转型全过程(18个月)

阶段0:决策和规划(Month 0,用时1个月)

转型前的自我评估

在决定转型前,我花了一个月时间思考和评估。

自我评估清单:

技术能力:
✅ Linux系统:4年经验,熟练
✅ Shell脚本:能写,但不精通
✅ Python:只会简单语法,没做过项目
❌ Go语言:不会
✅ Docker:了解基础,没有生产实践
❌ Kubernetes:听说过,不会用
✅ 监控:Zabbix用得熟,Prometheus不熟
❌ 编程能力:薄弱(这是最大短板)

软实力:
✅ 学习能力:强,愿意投入时间
✅ 解决问题能力:强,擅长定位故障
✅ 英语:能看文档
✅ 沟通能力:中等

个人情况:
- 年龄:27岁,还有转型时间
- 家庭:未婚,无负担
- 时间:每天可投入3-4小时学习
- 经济:有一定积蓄,可承受半年低收入

评估结论:
✅ 有转型的必要性(职业瓶颈)
✅ 有转型的可能性(年轻、有时间)
⚠️ 最大挑战:编程能力薄弱
⚠️ 次要挑战:云原生技术空白

选择转型方向:SRE还是DevOps?

我最终选择了SRE,原因如下:

DevOps的优势:
- 门槛相对低,容易入门
- 岗位多,机会多
- 更注重工程实践和工具

DevOps的劣势:
- 技术深度要求相对低
- 长期发展天花板有限
- 与开发的技能差距明显

SRE的优势:
- 技术深度要求高,成长空间大
- 薪资天花板高
- 更接近软件工程师,可以写代码
- 职业发展路径清晰(SRE→架构师→技术总监)

SRE的劣势:
- 门槛高,需要编程能力
- 岗位相对少(主要在大厂)
- On-call压力大

我的选择:SRE
理由:
1. 我想要更高的技术天花板
2. 我愿意投入时间学习编程
3. 我的目标是进入一线互联网公司

制定转型计划

我制定了一个18个月的转型计划:

转型路线图:

Phase 1(Month 1-6):技能储备期
目标:补齐技能短板
- Month 1-2:Python编程基础
- Month 3-4:Kubernetes和云原生
- Month 5-6:监控和可观测性

Phase 2(Month 7-12):项目实践期
目标:在现有岗位实践SRE理念
- Month 7-8:建立SLO/SLI体系
- Month 9-10:自动化和CI/CD
- Month 11-12:开发运维平台

Phase 3(Month 13-15):面试准备期
目标:准备简历和面试
- Month 13:整理项目经验
- Month 14:刷LeetCode和系统设计
- Month 15:投递简历,参加面试

Phase 4(Month 16-18):入职适应期
目标:顺利转型
- Month 16:拿到Offer,离职交接
- Month 17-18:新公司适应期

投入预算:
- 时间:每周20小时,共1560小时
- 金钱:课程费用5000元,书籍1000元
- 机会成本:可能需要接受短期降薪

阶段1:技能储备期(Month 1-6)

Month 1-2:Python编程突破

为什么先学Python?

  • SRE必须会编程,Python是最常用的语言
  • Python生态丰富,适合运维场景
  • 相对Go更容易上手

学习路径:

Week 1-2:Python基础语法
学习资源:《Python编程从入门到实践》
每天投入:3小时
内容:
- 数据类型、控制流程、函数
- 类和面向对象
- 异常处理、文件操作
- 模块和包
练习:LeetCode Easy题目(20道)

Week 3-4:Python进阶和常用库
内容:
- 装饰器、生成器、上下文管理器
- 多线程、多进程、异步IO
- requests库(HTTP请求)
- paramiko库(SSH操作)
- pandas库(数据处理)

实战项目1:服务器批量管理工具
功能:
- SSH连接管理
- 批量执行命令
- 文件分发
- 系统信息采集

代码示例:
import paramiko
from concurrent.futures import ThreadPoolExecutor

class ServerManager:
    def __init__(self, servers):
        self.servers = servers

    def exec_command(self, server, command):
        """在单个服务器执行命令"""
        ip, user, password = server
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

        try:
            ssh.connect(ip, username=user, password=password, timeout=10)
            stdin, stdout, stderr = ssh.exec_command(command)
            output = stdout.read().decode()
            error = stderr.read().decode()
            return {
                "ip": ip,
                "output": output,
                "error": error,
                "success": len(error) == 0
            }
        except Exception as e:
            return {
                "ip": ip,
                "output": "",
                "error": str(e),
                "success": False
            }
        finally:
            ssh.close()

    def batch_exec(self, command, max_workers=10):
        """批量执行命令"""
        with ThreadPoolExecutor(max_workers=max_workers) as executor:
            futures = [
                executor.submit(self.exec_command, server, command)
                for server in self.servers
            ]
            results = [f.result() for f in futures]
            return results

# 使用
servers = [
    ("192.168.1.10", "root", "password"),
    ("192.168.1.11", "root", "password"),
]
manager = ServerManager(servers)
results = manager.batch_exec("df -h | grep -w /")

for result in results:
    if result["success"]:
        print(f"✅ {result['ip']}:\n{result['output']}")
    else:
        print(f"❌ {result['ip']}: {result['error']}")

Week 5-6:Web开发基础(FastAPI)
为什么学Web开发?
- SRE需要开发运维平台
- API是服务间通信的标准

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import uvicorn

app = FastAPI(title="运维平台API")

class DeployRequest(BaseModel):
    app_name: str
    version: str
    servers: list[str]

@app.post("/api/deploy")
async def deploy(request: DeployRequest):
    """应用部署接口"""
    try:
        # 调用部署逻辑
        result = deploy_application(
            request.app_name,
            request.version,
            request.servers
        )
        return {
            "status": "success",
            "message": "部署成功",
            "result": result
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.get("/api/status/{app_name}")
async def get_status(app_name: str):
    """查询应用状态"""
    status = get_app_status(app_name)
    return {
        "app": app_name,
        "status": status
    }

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

Week 7-8:实战项目2 - 自动化运维平台(MVP)
功能:
- 服务器管理(CMDB)
- 批量操作(命令、脚本、文件)
- 应用部署
- 任务历史和审计

技术栈:
- 后端:FastAPI + Celery
- 数据库:PostgreSQL
- 任务队列:Redis
- 前端:Vue3(简单实现)

成果:
- 完整的MVP产品
- 在公司内部试用
- 写技术博客记录过程

Month 1-2总结:

  • ✅ 掌握了Python核心语法和常用库
  • ✅ 开发了2个实用工具
  • ✅ 建立了编程思维
  • ✅ 写了5篇技术博客
  • ⚠️ 代码质量还不够好,需要继续提升

Month 3-4:Kubernetes和云原生

学习路径:

Week 1-2:K8s基础
学习资源:
- 官方文档(最权威)
- 《Kubernetes权威指南》
- 极客时间《Kubernetes实战》

搭建环境:
- 本地:Minikube
- 云端:阿里云K8s(免费试用)

核心概念学习:
- Pod、Service、Deployment
- ConfigMap、Secret
- PV、PVC、StorageClass
- Namespace、Label、Selector

实战练习:
1. 部署Nginx应用
2. 配置Service和Ingress
3. 使用ConfigMap管理配置
4. 实现应用的滚动更新和回滚

Week 3-4:K8s进阶
深入理解:
- K8s架构和组件
- 调度机制(Scheduler原理)
- 网络模型(CNI插件)
- 存储(CSI插件)
- RBAC权限管理

监控和日志:
- Metrics Server
- Prometheus + Grafana
- EFK日志收集

自动伸缩:
- HPA(Horizontal Pod Autoscaler)
- VPA(Vertical Pod Autoscaler)
- Cluster Autoscaler

实战项目:将公司应用容器化
任务:
1. 分析应用架构和依赖
2. 编写Dockerfile优化镜像
3. 编写K8s YAML配置
4. 搭建测试环境并部署
5. 配置监控和告警
6. 编写运维文档

# 示例:应用部署配置
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  namespace: production
spec:
  replicas: 10
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: web-app
        image: registry.example.com/web-app:v1.2.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
          limits:
            cpu: 1000m
            memory: 1Gi
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: web-app
  namespace: production
spec:
  selector:
    app: web-app
  ports:
  - port: 80
    targetPort: 8080
  type: ClusterIP
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
  namespace: production
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 10
  maxReplicas: 50
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

Month 3-4总结:

  • ✅ 掌握K8s核心概念和操作
  • ✅ 在测试环境完成应用容器化
  • ✅ 理解云原生理念
  • ✅ 写了8篇K8s技术文章
  • ⏭️ 下一步:在生产环境推广

Month 5-6:监控和可观测性

学习路径:

Week 1-2:Prometheus深度学习
核心知识:
- Prometheus架构和数据模型
- PromQL查询语言
- Exporter开发
- 告警规则编写
- AlertManager配置

实战:搭建完整监控体系
1. 主机监控(Node Exporter)
2. K8s监控(kube-state-metrics)
3. 应用监控(自定义Exporter)
4. 中间件监控(MySQL、Redis、Nginx)

# 示例:自定义应用监控指标
from prometheus_client import Counter, Histogram, Gauge, start_http_server
import time

# 定义指标
http_requests_total = Counter(
    'http_requests_total',
    'Total HTTP requests',
    ['method', 'endpoint', 'status']
)

http_request_duration_seconds = Histogram(
    'http_request_duration_seconds',
    'HTTP request duration',
    ['method', 'endpoint']
)

active_connections = Gauge(
    'active_connections',
    'Number of active connections'
)

# 在应用代码中使用
@app.route('/api/users')
def get_users():
    start_time = time.time()

    try:
        # 业务逻辑
        users = fetch_users_from_db()

        # 记录指标
        http_requests_total.labels(
            method='GET',
            endpoint='/api/users',
            status='200'
        ).inc()

        duration = time.time() - start_time
        http_request_duration_seconds.labels(
            method='GET',
            endpoint='/api/users'
        ).observe(duration)

        return jsonify(users)

    except Exception as e:
        http_requests_total.labels(
            method='GET',
            endpoint='/api/users',
            status='500'
        ).inc()
        raise

# 启动Prometheus metrics服务器
start_http_server(9090)

Week 3:ELK/EFK日志管理
架构:
Filebeat → Kafka → Logstash → Elasticsearch → Kibana

配置示例:
# Filebeat配置
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/app/*.log
  fields:
    app: myapp
    env: production
  multiline:
    pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
    negate: true
    match: after

output.kafka:
  hosts: ["kafka1:9092", "kafka2:9092"]
  topic: "logs-production"

实战:日志分析
- 分析慢接口(响应时间>1s)
- 统计错误类型和频率
- 关联日志和Trace ID

Week 4:分布式追踪(Jaeger)
实现全链路追踪:
- 接入OpenTelemetry
- 分析请求链路
- 定位性能瓶颈

Week 5-6:可观测性平台建设
整合三大支柱:
- Metrics:Prometheus
- Logs:ELK
- Traces:Jaeger

实现统一的可观测性平台:
- 统一入口和Dashboard
- 关联Metrics、Logs、Traces
- 智能告警和根因分析

Month 5-6总结:

  • ✅ 建立了完整的监控告警体系
  • ✅ 实现了日志集中管理和分析
  • ✅ 接入了分布式追踪
  • ✅ 故障发现时间从15分钟降低到30秒
  • ✅ 写了10篇可观测性文章

Phase 1(Month 1-6)总体总结:

  • ✅ 编程能力:Python从0到能开发工具
  • ✅ 云原生:K8s从不会到能在生产使用
  • ✅ 监控:建立了完整的可观测性体系
  • ✅ 输出:写了23篇技术博客
  • ✅ 项目:完成2个工具,1个平台
  • ⏭️ 下一阶段:在公司实践SRE理念

阶段2:项目实践期(Month 7-12)

Month 7-8:建立SLO/SLI体系

SRE核心理念实践:

什么是SLO/SLI?
- SLI(Service Level Indicator):服务水平指标
- SLO(Service Level Objective):服务水平目标
- SLA(Service Level Agreement):服务水平协议

示例:
SLI:API请求成功率
SLO:99.95%(即每月允许21.6分钟故障时间)
SLA:如果低于99.9%,赔偿客户

建立SLO体系的步骤:

Step 1:识别关键用户旅程
示例(电商系统):
1. 浏览商品
2. 搜索商品
3. 加入购物车
4. 下单支付
5. 查看订单

Step 2:定义SLI指标
# 可用性SLI
availability = (successful_requests / total_requests) * 100

# 延迟SLI
latency_sli = (requests_under_threshold / total_requests) * 100

# 示例:API可用性SLI
sum(rate(http_requests_total{status=~"2.."}[5m]))
/
sum(rate(http_requests_total[5m]))

Step 3:设定SLO目标
服务分级:
- P0核心服务:99.95%
- P1重要服务:99.9%
- P2一般服务:99.5%

示例SLO文档:
服务名称:订单服务
SLO等级:P0
SLI指标:
1. 可用性:99.95%
   - 5xx错误率 < 0.05%
   - 超时率 < 0.01%

2. 延迟:
   - P50 < 100ms
   - P95 < 300ms
   - P99 < 500ms

3. 吞吐量:
   - 支持10000 QPS

监控:Prometheus + Grafana
告警:低于SLO时触发
Error Budget:每月21.6分钟

Step 4:实施Error Budget机制
# Error Budget = (1 - SLO) * 时间窗口
# 例如:SLO 99.95%,月度Error Budget = 21.6分钟

策略:
- Error Budget > 50%:可以快速迭代,激进发布
- Error Budget < 50%:减缓发布,focus on稳定性
- Error Budget耗尽:冻结发布,只修bug

实践效果:
✅ 在稳定性和快速迭代之间找到平衡
✅ 用数据说话,而不是主观判断
✅ 开发和运维有共同目标(Error Budget)
✅ 减少无意义的告警,focus on真正影响用户的问题

Month 9-10:自动化和CI/CD

构建完整的CI/CD流水线:

目标:实现从代码提交到生产发布的全自动化

架构:
GitLab → GitLab CI → Docker Registry → ArgoCD → Kubernetes

流水线设计:
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ 代码 │→│ 构建 │→│ 测试 │→│ 部署 │→│ 验证 │→│ 发布 │
│ 提交 │ │ 镜像 │ │ 单元 │ │ 测试 │ │ 健康 │ │ 生产 │
└──────┘ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘
    ↓失败               ↓失败
 自动回滚             自动告警

GitLab CI配置:
# .gitlab-ci.yml
stages:
  - build
  - test
  - deploy-staging
  - deploy-production

variables:
  IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

build:
  stage: build
  script:
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG
  only:
    - master
    - develop

test:
  stage: test
  script:
    - go test -v ./...
    - go test -cover ./... -coverprofile=coverage.out
    - go tool cover -func=coverage.out
  coverage: '/total:.*\s(\d+.\d+)%/'

deploy_staging:
  stage: deploy-staging
  script:
    - kubectl set image deployment/app app=$IMAGE_TAG -n staging
    - kubectl rollout status deployment/app -n staging --timeout=5m
    - ./scripts/health_check.sh staging
  environment:
    name: staging
  only:
    - develop

deploy_production:
  stage: deploy-production
  script:
    # 金丝雀发布
    - kubectl set image deployment/app-canary app=$IMAGE_TAG -n production
    - kubectl rollout status deployment/app-canary -n production
    - ./scripts/canary_analysis.sh
    - kubectl set image deployment/app app=$IMAGE_TAG -n production
    - kubectl rollout status deployment/app -n production
  environment:
    name: production
  when: manual # 生产环境需要手动触发
  only:
    - master

GitOps实践(ArgoCD):
- 所有K8s配置存储在Git仓库
- ArgoCD监控Git变化并自动同步
- 声明式管理,版本可追溯

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp
spec:
  project: default
  source:
    repoURL: https://gitlab.example.com/k8s-configs.git
    targetRevision: HEAD
    path: apps/myapp
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

实践效果:
- ✅ 发布时间:从30分钟降低到5分钟
- ✅ 发布频率:从每周1次提升到每天5-10次
- ✅ 失败率:从5%降低到0.3%
- ✅ 回滚时间:从10分钟降低到30秒

Month 11-12:开发运维平台

自研Internal Developer Platform(IDP):

背景:
公司有50+个应用,每个应用的部署、监控、日志查看都很分散,
开发人员和运维人员都很痛苦。

解决方案:开发统一的运维平台

功能设计:
1. 应用管理(CMDB)
   - 应用列表和详情
   - 依赖关系图
   - 资源配额

2. 部署管理
   - 一键部署
   - 金丝雀发布
   - 回滚
   - 发布历史

3. 监控大盘
   - 应用健康状态
   - 关键指标(QPS、延迟、错误率)
   - 告警历史

4. 日志查询
   - 实时日志
   - 历史日志搜索
   - 日志下载

5. 工单系统
   - 资源申请
   - 权限申请
   - 变更申请

技术栈:
- 前端:Vue3 + Element Plus
- 后端:FastAPI + Celery
- 数据库:PostgreSQL + Redis
- 部署:Docker + Kubernetes

核心代码示例:
# 后端API
from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
import kubernetes

app = FastAPI()

@app.get("/api/apps")
async def list_apps(db: Session = Depends(get_db)):
    """应用列表"""
    apps = db.query(Application).all()
    return [app.to_dict() for app in apps]

@app.post("/api/deploy")
async def deploy_app(
    request: DeployRequest,
    db: Session = Depends(get_db)
):
    """部署应用"""
    # 1. 验证权限
    if not check_permission(request.user, request.app_name):
        raise HTTPException(403, "无权限")

    # 2. 创建部署任务
    task = DeployTask(
        app_name=request.app_name,
        version=request.version,
        env=request.env,
        user=request.user
    )
    db.add(task)
    db.commit()

    # 3. 异步执行部署(Celery)
    deploy_task.delay(task.id)

    return {"task_id": task.id, "status": "pending"}

@app.get("/api/logs/{app_name}")
async def get_logs(
    app_name: str,
    namespace: str = "production",
    lines: int = 100
):
    """获取应用日志"""
    k8s_client = kubernetes.client.CoreV1Api()

    # 获取Pod列表
    pods = k8s_client.list_namespaced_pod(
        namespace=namespace,
        label_selector=f"app={app_name}"
    )

    logs = []
    for pod in pods.items:
        pod_logs = k8s_client.read_namespaced_pod_log(
            name=pod.metadata.name,
            namespace=namespace,
            tail_lines=lines
        )
        logs.append({
            "pod": pod.metadata.name,
            "logs": pod_logs
        })

    return logs

# Celery异步任务
from celery import Celery

celery_app = Celery('tasks', broker='redis://localhost:6379/0')

@celery_app.task
def deploy_task(task_id):
    """执行部署"""
    task = db.query(DeployTask).get(task_id)

    try:
        # 1. 更新镜像
        update_deployment_image(
            app_name=task.app_name,
            version=task.version,
            namespace=task.env
        )

        # 2. 等待滚动更新完成
        wait_for_rollout(task.app_name, task.env)

        # 3. 健康检查
        if not health_check(task.app_name, task.env):
            # 健康检查失败,自动回滚
            rollback_deployment(task.app_name, task.env)
            task.status = "failed"
            task.error = "健康检查失败,已自动回滚"
        else:
            task.status = "success"

    except Exception as e:
        task.status = "failed"
        task.error = str(e)
        # 发送告警
        send_alert(f"部署失败:{task.app_name} {task.version}")

    finally:
        task.completed_at = datetime.now()
        db.commit()

开发周期:2个月
团队:我 + 1个前端同学
投入产出:
- 开发投入:2人月
- 使用人数:全公司100+人
- 效率提升:部署时间降低80%,运维工单减少60%
- 业务价值:显著提升研发效能

这个项目成为我面试的核心案例,也是我转型成功的关键。

Phase 2(Month 7-12)总体总结:

  • ✅ 建立了SLO/SLI体系
  • ✅ 实现了完整的CI/CD流水线
  • ✅ 开发了运维平台,被全公司使用
  • ✅ 团队稳定性提升(故障时间减少70%)
  • ✅ 效率提升(发布效率提升5倍)
  • ✅ 写了15篇技术文章
  • ✅ 在公司技术大会分享经验
  • ⏭️ 具备了转型SRE的项目经验

阶段3:面试准备和求职(Month 13-15)

Month 13:简历优化和项目梳理

简历优化原则:

原则1:用数据说话
❌ 错误:“负责监控系统建设”
✅ 正确:“建立Prometheus监控体系,覆盖200+服务器、50+应用,
          故障发现时间从15分钟降低到30秒,MTTD降低96%”

原则2:突出业务价值
❌ 错误:“开发了自动化部署工具”
✅ 正确:“开发CI/CD平台,使发布效率提升5倍(从30分钟到5分钟),
          发布频率从每周1次提升到每天10次,支撑业务快速迭代”

原则3:体现技术深度
❌ 错误:“会用Kubernetes”
✅ 正确:“深入研究K8s Scheduler源码,优化调度策略,
          使集群资源利用率从60%提升到85%”

我的简历结构:
# 个人信息
姓名、电话、邮箱、GitHub、技术博客

# 个人优势(3-5点)
- X年运维经验,转型SRE,精通云原生技术栈
- 掌握Python/Go编程,开发过XX运维平台
- 建立过SLO体系和可观测性平台
- 主导过成本优化项目,年节省XXW

# 工作经历
公司名称  |  SRE工程师  |  时间

项目1:运维平台建设
- 背景:公司有50+应用,部署和监控分散,效率低
- 方案:自研IDP平台,统一部署、监控、日志
- 技术:Python FastAPI + Vue3 + K8s + Prometheus
- 成果:部署效率提升5倍,运维工单减少60%,100+人使用

项目2:可观测性体系建设
- 背景:故障发现慢,定位困难
- 方案:建立Metrics+Logs+Traces三位一体的可观测性平台
- 技术:Prometheus + ELK + Jaeger
- 成果:故障发现时间从15分钟降低到30秒,MTTD降低96%

项目3:SLO/SLI体系建设
- 背景:稳定性和快速迭代难以平衡
- 方案:建立SLO体系和Error Budget机制
- 成果:核心服务可用性从99.9%提升到99.95%,
        同时发布频率提升300%

# 技术技能
编程语言:Python(熟练),Go(了解)
云原生:Kubernetes(精通),Docker,Istio
监控:Prometheus(精通),Grafana,ELK,Jaeger
CI/CD:GitLab CI,ArgoCD,Jenkins
数据库:MySQL(熟练),Redis
其他:Linux,Ansible,Terraform

# 教育背景
学校、专业、学历

# 个人项目/开源贡献
- 技术博客:XX篇文章,XX万阅读
- GitHub:XX个star的开源项目

Month 14:技术准备

准备内容:

1. 算法和数据结构(LeetCode)
为什么SRE要刷题?
- 大厂面试必考
- 考察编程基础和思维能力

刷题计划:
- Easy:50道(重点)
- Medium:30道
- Hard:10道(选做)

推荐题目:
- 数组和字符串:two sum、三数之和、最长子串
- 链表:反转链表、合并链表、链表环
- 树:二叉树遍历、最大深度、路径和
- 动态规划:爬楼梯、最长公共子序列
- 图:岛屿数量、课程表

刷题技巧:
- 不要死磕,看题解后重写
- 重复刷,熟能生巧
- 总结套路和模板

2. 系统设计
常见题目:
- 设计一个短链接服务
- 设计一个限流系统
- 设计一个监控系统
- 设计一个高可用的Web服务

答题框架(SNAKE原则):
S - Scenario(场景):明确需求和规模
N - Necessary(必要):列出核心功能
A - Application(应用):画出架构图
K - Kilobit(数据):估算QPS、存储、带宽
E - Evolve(演进):优化和扩展

示例:设计监控系统
S:
- 监控1000台服务器
- 采集CPU、内存、磁盘、网络
- 支持10000个指标
- 1分钟采集间隔
- 数据保留30天

N:
- 数据采集
- 数据存储
- 数据查询
- 告警
- 可视化

A:
┌──────────┐
│  Agents  │ → ┌──────────┐ → ┌──────────┐ → ┌──────────┐
│  (1000)  │   │  Kafka   │   │Prometheus│   │ Grafana  │
└──────────┘   └──────────┘   └──────────┘   └──────────┘
                                  │
                                  ↓
                            ┌──────────┐
                            │AlertMgr  │
                            └──────────┘

K:
- QPS:1000台 × 10指标 × 1/60 = 167 writes/s
- 存储:1000 × 10 × 8字节 × 60 × 24 × 30 = 3.4GB/月
- 带宽:167 × 8字节 = 1.3KB/s(可忽略)

E:
- 水平扩展:Prometheus联邦
- 数据分层:热数据(7天)SSD,冷数据(30天)HDD
- 高可用:Prometheus HA + Remote Storage

3. Linux和网络基础
- TCP/IP协议
- 进程、线程、协程
- 内存管理
- I/O模型
- 常用命令和troubleshooting

4. 项目深挖
准备讲述项目的能力:
- 项目背景和目标
- 技术方案和架构
- 遇到的挑战和解决方案
- 项目成果和业务价值
- 你的贡献和收获

练习方法:
- 对着镜子讲
- 录音后回听
- 找朋友模拟面试

Month 15:投递和面试

面试经历:

投递策略:
1. 目标公司:
   - 一线互联网大厂(阿里、字节、腾讯、美团)
   - 独角兽(快手、B站、小红书)
   - 外企(Google、微软、亚马逊)

2. 投递渠道:
   - 内推(最有效)
   - 拉勾、BOSS直聘
   - 公司官网

3. 投递时间:
   - 周一到周三投递(HR处理快)
   - 避开假期

我的面试记录(15家公司):

字节跳动(Offer):
- 1面:算法(2道Medium)+ Linux基础
- 2面:系统设计(设计监控系统)+ 项目深挖
- 3面:Go语言 + K8s原理 + 场景题
- 4面:HR面(谈薪资、谈期望)
- Offer:3-1级别,40K×16

阿里巴巴(Offer):
- 1面:项目经历 + Python代码能力 + MySQL优化
- 2面:系统设计(设计高可用架构)+ K8s深度
- 3面:技术广度 + 解决复杂问题能力
- 交叉面:算法 + 项目
- HR面
- Offer:P6级别,35K×15.5

美团(Offer):
- 1面:算法 + 项目
- 2面:系统设计 + 监控
- 3面:技术深度 + 场景题
- HR面
- Offer:L6级别,38K×16

腾讯(二面挂):
- 1面:通过
- 2面:算法不行(2道Hard都没做出来)
- 反思:算法还需要加强

最终选择:字节跳动
理由:
1. 薪资最高
2. SRE团队规模大,成长空间大
3. 技术氛围好
4. 同事优秀

面试总结:
✅ 优势:
   - 项目经验丰富,有亮点
   - 技术博客和GitHub加分
   - 表达清晰,逻辑性强

⚠️ 不足:
   - 算法相对薄弱(刷题不够)
   - Go语言不够熟练
   - 某些深度问题答不上来

建议:
1. 项目经验是最大加分项,一定要有拿得出手的项目
2. 技术博客和GitHub很有帮助
3. 算法不能太弱,至少要能做Medium题
4. 系统设计要有自己的思路和框架
5. 表达能力很重要,要能讲清楚技术方案

阶段4:入职和适应(Month 16-18)

入职字节跳动后的感受:

Month 16:入职和交接
- 办理离职手续
- 工作交接(2周)
- 入职字节跳动
- 熟悉环境和流程

Month 17:快速学习期
- 学习公司技术栈
- 阅读文档和代码
- 参加培训和分享
- 了解业务和系统架构

挑战:
- 技术栈差异(Go为主,Python为辅)
- 系统复杂度(千万级用户,PB级数据)
- 工作节奏快(每天都有新挑战)

收获:
- 技术能力快速提升
- 视野开阔,接触到大规模系统
- 团队优秀,学到很多

Month 18:独立承担工作
- 负责某个服务的SRE工作
- 参与on-call轮值
- 独立处理故障
- 参与架构设计

成就感:
✅ 从传统运维成功转型为SRE
✅ 薪资翻倍(20K → 40K)
✅ 进入一线互联网大厂
✅ 技术能力显著提升
✅ 职业前景清晰

感悟:
转型不易,但值得。
18个月的努力,换来职业生涯的跃迁。
最重要的是:行动起来,持续学习,不要放弃。

实践案例:3个转型路径

路径1:传统运维→DevOps(难度:中等)

适合人群:运维经验2-5年,有一定自动化基础

时间:9-12个月
难度:⭐⭐⭐

关键技能:
- CI/CD工具链(GitLab CI、Jenkins)
- 容器和K8s基础
- Python/Shell脚本
- IaC(Terraform、Ansible)

学习路径:
Month 1-3:容器和K8s入门
Month 4-6:CI/CD流水线建设
Month 7-9:IaC和自动化
Month 10-12:项目实践和面试

预期薪资:20-35K

路径2:传统运维→SRE(难度:高)

适合人群:运维经验3-5年,愿意学习编程

时间:12-18个月
难度:⭐⭐⭐⭐

关键技能:
- 编程能力(Python/Go)
- K8s深度理解
- 可观测性体系
- 系统设计能力
- 高可用架构

学习路径:
Month 1-6:技能储备(编程、K8s、监控)
Month 7-12:项目实践(SLO、平台开发)
Month 13-15:面试准备
Month 16-18:入职适应

预期薪资:25-45K

路径3:开发→SRE(难度:低)

适合人群:后端开发,对基础设施感兴趣

时间:6-9个月
难度:⭐⭐

关键技能(已具备):
- ✅ 编程能力
- ✅ 系统设计
- ❌ Linux系统(需要补)
- ❌ K8s和云原生(需要补)
- ❌ 监控和可观测性(需要补)

学习路径:
Month 1-2:Linux系统和网络
Month 3-4:K8s和云原生
Month 5-6:监控和SRE理念
Month 7-9:项目实践和面试

预期薪资:30-50K
优势:开发转SRE相对容易,薪资也更高

最佳实践:转型成功的关键要素

1. 明确动机和目标

问自己3个问题:
1. 为什么要转型?(职业发展、薪资、技术成长)
2. 目标是什么?(进大厂、涨薪50%、成为技术专家)
3. 愿意付出什么?(时间、精力、可能的短期降薪)

只有动机明确,才能坚持下去。

2. 项目驱动学习

❌ 错误方法:看完所有书和视频再动手
✅ 正确方法:边学边做,带着项目目标学习

我的经验:
- 学Python时,同步开发批量管理工具
- 学K8s时,同步完成应用容器化
- 学监控时,同步建设监控体系

效果:
- 学得快(有目标,有动力)
- 记得牢(实战过,印象深)
- 有产出(可以写进简历)

3. 持续输出

为什么要写博客?
1. 沉淀知识,加深理解
2. 建立个人品牌
3. 面试加分项
4. 倒逼自己深入学习

我的输出:
- 18个月写了50+篇技术文章
- 总阅读量100万+
- 收获2000+粉丝
- 面试时多次被提及

平台选择:
- 掘金(推荐)
- 知乎
- CSDN
- 个人博客(GitHub Pages)

4. 在现有岗位实践

不要等到找到新工作再学习,
要在现有岗位实践SRE/DevOps理念。

我的实践:
- 传统运维岗位
- 主动推动容器化
- 建立SLO体系
- 开发运维平台
- 这些项目成为面试的核心竞争力

建议:
即使公司不支持,也可以在测试环境试点,
或者作为个人项目来做。

5. 找到导师或社群

转型不要闭门造车,要找到:
- 导师:已经转型成功的前辈
- 社群:志同道合的伙伴

我的经验:
- 加入SRE技术社群
- 线下Meetup认识行业专家
- 找到一位SRE mentor,定期请教
- 和几个朋友组成学习小组,互相监督

效果:
- 少走弯路
- 获得指导和反馈
- 互相鼓励,更容易坚持

6. 合理安排时间

我的时间分配(每周):
- 工作日晚上:3小时学习(21:00-24:00)
- 周末:10小时学习(每天5小时)
- 通勤时间:1小时(看文章、听播客)
- 总计:每周约20小时

18个月 = 78周
总投入 = 78 × 20 = 1560小时

建议:
- 不要熬夜,保证睡眠
- 周末留一天休息
- 告诉家人你的计划,获得支持

7. 设定里程碑和奖励

长期目标容易失去动力,要设定阶段性目标。

我的里程碑:
Month 3:完成第一个Python项目 → 奖励:买个机械键盘
Month 6:K8s部署10个应用 → 奖励:周末短途旅行
Month 9:完成运维平台开发 → 奖励:买个新电脑
Month 12:写完30篇博客 → 奖励:自己定
Month 15:拿到3个Offer → 奖励:好好犒劳自己

效果:
- 有盼头,有动力
- 看到自己的进步
- 更容易坚持

总结与展望

从传统运维到SRE,我用了18个月时间,实现了职业生涯的跃迁。这18个月,是我职业生涯中最充实、最有成就感的时光。

核心要点回顾

转型的关键要素:

  1. ✅ 明确动机和目标
  2. ✅ 补齐技能短板(编程、云原生、监控)
  3. ✅ 项目驱动学习
  4. ✅ 在现有岗位实践
  5. ✅ 持续输出和建立品牌
  6. ✅ 坚持和耐心

时间和投入:

  • 时间:12-18个月
  • 投入:每周20小时
  • 总计:1200-1500小时
  • 金钱:5000-10000元(课程、书籍)

预期回报:

  • 薪资:涨幅50-100%
  • 职位:从运维到SRE/DevOps
  • 技能:全栈能力
  • 前景:职业天花板显著提升

转型建议

适合转型的人:

  • ✅ 运维经验2年以上
  • ✅ 对编程不抗拒(最好有基础)
  • ✅ 愿意投入时间学习
  • ✅ 年龄30岁以下(不绝对)
  • ✅ 有职业危机感

不适合转型的人:

  • ❌ 完全不愿意学编程
  • ❌ 没有时间投入
  • ❌ 满足于现状
  • ❌ 年龄较大(>35岁)且家庭负担重

转型时机:

  • 最佳:工作2-5年,技术瓶颈初现
  • 可行:工作5-8年,仍有学习能力
  • 困难:工作8年以上,转型成本高

行业展望

SRE/DevOps的未来:

  1. 需求持续增长
    • 云原生普及,SRE需求旺盛
    • 传统运维岗位持续萎缩
    • DevOps成为标配
  2. 技术要求提升
    • 编程能力成为必须
    • 云原生技术成为标准
    • AIOps成为新方向
  3. 薪资水平
    • SRE薪资持续走高
    • 高级SRE年薪60-100W
    • 技术总监年薪100W+
  4. 职业发展
    • SRE → 架构师
    • SRE → 技术总监
    • SRE → CTO

写在最后

转型不易,但值得。

18个月前,我是一个迷茫的传统运维,每天重复着救火和重启服务器,看不到未来。

18个月后,我成为字节跳动的SRE,薪资翻倍,每天在写代码、设计架构、解决有挑战的问题,职业前景清晰。

这个转变,源于一个决定:不甘于现状,主动拥抱变化。

如果你也处于职业十字路口,也对现状不满,也想要更好的发展,那么:

从今天开始,制定你的转型计划,开始行动!

1年后,你会感谢今天做出改变的自己。

记住:最好的时机是10年前,其次是现在。

祝你转型成功!


本文是我真实的转型经历和经验总结。如有任何问题或想交流转型经验,欢迎在 云栈社区 等平台进一步探讨。愿我的经历能帮助到更多运维同行。




上一篇:2026年众筹LCD手机失败,护眼技术内卷下的小众情怀何去何从?
下一篇:服务器CPU飙高诊断:三步法从进程到代码快速定位根因
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-2 21:03 , Processed in 0.508216 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表