作者IcecreamHsu ()
看板Soft_Job
标题[心得] 初阶 DevOps/SRE 工程师是如何炼成的
时间Fri Mar 12 15:57:59 2021
markdown 好读版:
https://tech-blog.jameshsu.csie.org/post/devops-entry-level-sre-road/
## 前言
背景是学生,大约两年的 SA/DevOps 学习经验,刚拿到 ByteDance 的 SRE offer,
所以应该可以算是 Entry-level 的 SRE 了,
会想写这篇分享是因为看到满多人对 DevOps/SRE 的印象是很吃经验,
不太可能让新鲜人做,对这种印象算一半认同(我就是反例XD),
另一方面也想让有兴趣的人知道该如何入门这个领域
详细的背景在前一篇 SRE 面试文(
#1WFpX6V3)写得比较多
### 什麽是 DevOps/SRE?
我无意在这篇谈 DevOps 的商业或管理价值,
也无意细分 DevOps Engineer 和 SRE 的区别,
很概括且从技术角度来说,DevOps 的重点是
1. 减少从设计、开发(需求、程式码)到测试、部署(程式)的时间
2. 加强回馈机制(包括但不限於监控、告警)
3. 过程中持续快速的叠代、学习
(改写 DevOps 三步工作法)
文末会附 DevOps 相关的书单
## 技能树
这一部份会以
https://roadmap.sh/devops 搭配讲解
以下的顺序以我个人学习、接触的时间轴做排列
### 语言
建议 Python、Go、JavaScript 三者至少要一个精通、一个熟练,第三个可以作为辅助。
会推荐这三个语言是因为这三个语言要写自动化的小工具时都很方便;
其次这三个语言各自有强项:
- Python:易於和其他人协作、精於 ML(对,SRE 有可能会需要 ML 辅助)
- Go:很多 DevOps 的工具包含 Prometheus, Kubernetes, Docker, Drone
都是 Go 写成的,要写网页後端也很轻松
- JavaScript:要写简单的网页前端一定要会 JS,
像 aws cdk 也是 TypeScript 的支援比较丰富
但也不是说一定要学这三个语言,例如学 java 就可以结合 jenkins 生态系,
所以就看怎麽运用自己的优势
### Linux/Shell Script
如果一开始接触的是 Windows 环境,可以去装 WSL 体验 Linux,
不管如何,走这一行一定要学习 Live in terminal,
基本的 cd, ls 就不用说了,跟字串处理有关的 grep, sed, awk, cut 也都要很熟
还有像 wget, curl 等等,要列出所有会用到的指令和工具实在是列不完
有好的 google 搜寻能力的话,stackoverflow 会是你很好的朋友
对 git 也应该至少要会基本的并可以用在专案上
Linux 除了主流的 Ubuntu 以外也可以多尝试其他 OS,例如 CentOS、Alpine 等等
这部份可以在挑选云端的虚拟机器 或是 run container 的时候去多多尝试
另外对 Linux 的观念包含档案系统、process management, DNS, DHCP 等等
也应该要有基本认知
### 架站 / SA 相关
会一门程式语言,而且对 Linux 够熟之後,就可以尝试架站了。
克难一点是可以用自己的机器架,
不过建议还是去租云端的机器(例如 aws, gcp, azure)
虽然有可能要花钱(免费的方案不是速度很慢就是不能用太久),
但有 public IP 和 24 小时不停机就是方便,也能学到更多东西
我个人很推用架站来学习,因为在过程中可以学到:
1. 处理网址要了解 DNS, IP, 域名的概念
2. (如果是云端环境) 学习如何 ssh, live in terminal
3. 设定 Web Server (nginx, apache, etc.)
4. 写网站前端(http, css, js)、後端(python, go, etc.)
5. 想要一个域名、一台机器但对应到多个网站时,
如何设定 Reverse Proxy 和 VM/Docker
6. 跟第三方签 certificate 设定 HTTPS
7. (如果要寄注册认证信) 装 Email Server (SMTP, Reverse DNS, DNS Server)
8. 在 Server 上 Debug
9. 监控网站流量、机器状态
至於网站要写什麽,如果没有想法可以往购物车或需要注册登入的网站去发想
新手建议先从前後端混合的框架开始写(例如 Python 的 Django),
比较不需要太多 JavaScript 的知识
也可以偷懒不写程式码,架 WordPress 或跟会写网站的朋友合作,
但学到的东西就会少很多,也容易沦为纯 Ops
### CI/CD
网站有雏型之後,慢慢的会开始觉得本机开发到要更新 Server 的程式的流程很麻烦,
特别是在频繁更新和 Debug 的时候,
这正是 DevOps 要解决的主要问题:缩短 Developers 和 Operation 的距离
具体的解决方式便是引入 CI/CD 的 Pipeline
CI/CD 简单来说即是让程式码的 build, test, deploy 自动化,
使得 developers 只要 push 到版控工具(github/gitlab, etc.),
後面就有机器自动的更新 server 的程式
有满多工具可以做到 CI/CD,
新手若无头绪我会建议使用 GitLab 内建的 CI/CD,
结合他们自家的版控功能做一条龙
也可以看自己擅长的语言决定用 jenkins 或 drone 或其他工具,大同小异
如果用 GitLab,推荐自己架一个 GitLab 和 Runner (跑 CI 的环境) ,
有人写了很方便的 docker-compose 可以一行架起来
### 容器(Containers)
随着网站规模愈来愈大,可能会在这台机器上架好几个网站,
gitlab, blog, prometheus 等等,
这些服务都建议尽量容器化用 Docker/Docker-compose 跑,
过程中会对 Containers 比较熟
如果有兴趣也可以玩 Kubernetes 或类似的容器管理平台,但 k8s 水很深,慎入
### 写小工具 / 接触开源
如果前面的部份都摸得差不多了,可以加强 Develop 的程度,
去多摸一门语言,或是深入研究本来会的语言的特性、OOP
也可以尝试写一些小工具,例如爬虫、middleware、metrics exporter 等等
同时在这个阶段尽可能的去接触开源,一开始会觉得挫折、看不懂是难免的
对规模较大的 repo 欣赏它的架构、规模小的 repo 尝试去看懂里面的 code
广泛阅读 open-source 的专案、技术文章,是这个阶段进步最快的方式
### 以专案为本
大量阅读 open-source 的程式码和技术文章的过程中,可能会读到很多没用过的技术,
但也比较能区分 Clean/Dirty Code,
这时候可以尝试做比较大型的专案,套用想学习的技术
如果有资源,可以做一个纯云端的专案,毕竟会徵 SRE 的公司很少有不上云的,
而且云端服务会提供很多服务,例如 Load Balancer、Auto Scaling 等等
又例如 SQL 要架在 EC2 还是用 Aurora 这些取舍都挺值得玩味的
(个人对 aws 比较熟,所以例子都举 a 家的)
实习也是做专案的方式之一,如果没办法实习,看能不能尽量接触多人开发的专案,
会对於软体开发的流程更熟悉,
例如切 staging/production 环境、开发如何切 branch, 开 issue 等等
这里节录部份我以前做过的 project 和用到的技术
- LeetCode 爬虫 (Go)
- Dcard 後端面试作业 (Go/Gin, Redis, Travis CI)
- 做 LineBot CI/CD Pipeline (aws: Route53, EKS (k8s), DynamoDB, S3; Vault)
- PTT 爬虫 (Go, Goroutine, Channel)
- Blackbox Monitoring (Prometheus, Grafana, AlertManager)
- RESTful API Server (Go/Gin, jwt, ELK,
MySQL, Unit/Integration Tests, Redis, Prometheus,
Vue/TypeScript, azure: AKS, VM)
### 补足 OS、Networking 知识
说得直白一点就是为了面试做准备啦,但这些知识或多或少也会在实战中用到
## 结论
在面试的 Q&A 环节,我问 ByteDance 的面试官「一个 SRE 应该具备哪些特质」,
他回答我要能临危不乱、Reactive、Think out of the Box,
後者直翻是跳脱框架,但从面试官的解释比较像是全局思考,
我个人会解读出两种层次,第一个层次是不能仅仅只在意 config 怎麽设定,
而要考虑整个架构的逻辑,包含前面提到的取舍,这才是体现一个 SRE 价值之所在
第二个层次是不要被工具绑架了,DevOps 注重的是流程和文化,
最近体验到的一个例子是已经有 Python 的自动化的 script,
就没必要引入其他的 CI/CD 工具,目的有达成最重要,这也是最近小的在努力的方向
除了技术以外,如果想要研究 DevOps 方法论的可以读 凤凰专案、DevOps Handbook
上面这两本是直接与 DevOps 相关,
另外也可以读一些管理学的书包含高德拉特的目标、第五项修炼,或是精实相关的书
SRE 一生都在和复杂系统打交道,也可以看看反脆弱和黑天鹅这一系列的书,
会对於一些神奇的方法论(例如 Chaos Engineering)比较理解缘由
不确定以上的内容对看的人有没有帮助,毕竟还很菜,
如果有什麽问题或指点请不吝提出
个人其他地方常用 ID 是 jameshwc,欢迎大家找我交流
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 192.198.168.41 (美国)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1615535884.A.7C7.html
1F:推 ethan86116: 泪推学Go,最近碰到一堆Go的开源工具有小毛病得去修03/12 16:02
2F:→ ethan86116: 或是自己加功能的情形,但自己又不会Go只好卯起来用03/12 16:02
3F:→ ethan86116: Reference乱trace 03/12 16:02
Go 满好学的,可以给它一个机会~
4F:推 okita3088: 帮推大致上都有提到。03/12 16:07
5F:推 BlacksPig: 推,真的感觉水很深,每间公司又深在不同地方(工具、03/12 17:14
6F:→ BlacksPig: 语言都不一定一样) 03/12 17:14
7F:推 a9101214: 推03/12 17:44
8F:推 cuteSquirrel: 推 这篇大纲很紮实 精华总整理 03/12 17:49
9F:推 eju901677: 推03/12 18:07
10F:推 Celinealone: 感谢分享 另外那个书单好像没有出现在文末? 03/12 18:07
11F:→ Celinealone: 喔喔不好意思看到了 原来是中文书XDD 03/12 18:08
这些书都是翻译书,资讯的原文书天珑应该都找得到XD
12F:推 jack931018: 推03/12 18:20
13F:推 patrick555: 推03/12 18:28
14F:推 ChangeXD: 推推,自己不小心接触到SRE发现这条路也很有趣!感谢你03/12 18:33
15F:→ ChangeXD: 的心得,希望可以追上你的车尾灯XD03/12 18:33
16F:推 AgileSeptor: 推03/12 18:49
17F:推 CodingDuck: 推,不过个人对 DevOps handbook 的感想比较复杂,理03/12 19:05
18F:→ CodingDuck: 念是对的,就是有些案例个人觉得比较不切实际...03/12 19:05
19F:推 hank8451: 感谢分享~03/12 19:05
20F:→ CodingDuck: 像是什麽半夜开会大家会更有效率,出问题就整个 Val 03/12 19:06
21F:→ CodingDuck: ue stream 上的人全部来开会之类的...只能学概念,整03/12 19:06
22F:→ CodingDuck: 套全学一定会落於形式。03/12 19:06
换个角度,如果有人把书中那套照搬,也是很不敏捷的表现吧XD
敏捷/DevOps 的精神就是不断的回应环境的变化呀~
23F:推 WaterLengend: 这篇不错,推03/12 19:14
24F:推 Fuyouny: 推推03/12 19:30
25F:→ superpandal: 很平常 还是继续我的黑魔法 03/12 19:45
26F:推 Lyu7: 推?03/12 19:49
27F:→ Lyu7: 抱歉按到?,它在!隔壁Q_Q 03/12 19:49
28F:推 Virness: 推一个 程式界前辈03/12 19:53
29F:→ Apache: 大师 03/12 20:54
30F:推 iwant2sleep: 推 03/12 21:31
31F:推 masturbateee: 强者推03/12 23:43
32F:推 IlovePLUSone: 先推推03/13 02:34
33F:推 taipoo: 推03/13 03:59
※ 编辑: IcecreamHsu (140.112.87.59 台湾), 03/13/2021 09:19:38
34F:推 black2575: 推03/13 10:04
35F:推 jackflu: 谢分,问下 Reactive 是啥特质或意思?也是指临危不乱吗03/13 10:06
临危不乱和 Reactive 不太一样哦
临危不乱是讲像是服务中断时,你能不能顶住压力,找出问题的症结点
Reactive 讲的是敏捷,能不能随时因应环境的变化而行动,而不是僵固的维持本来的计
画,同义词是 responsive
※ 编辑: IcecreamHsu (49.216.170.213 台湾), 03/13/2021 10:35:01
36F:推 LordCHTsai: 恭喜拿到offer,老实说特质什麽的都是场面话 03/13 10:40
37F:→ LordCHTsai: SRE最重要的其实是,oncall记得随身带电脑 03/13 10:43
38F:推 lee457088: 推,112 果然猛 03/13 14:45
39F:推 mmonkeyboyy: 那两个字其实也不太一样 @_@~ 一个比较像反射 一个 03/13 14:54
40F:→ mmonkeyboyy: 像是想过再去做动作 03/13 14:55
41F:推 mmonkeyboyy: 以系统来说 都叫reactive 但下面应该还要有responsiv 03/13 14:57
42F:→ mmonkeyboyy: e elastic resilient最少三大类 03/13 14:58
43F:推 gcobc19622: 推推 感谢分享 03/13 23:17
44F:推 m9j002: 好文 ! 推 03/15 16:29
45F:推 e007926: 推推 03/16 19:02
46F:推 shooter555: 详细给推 03/17 09:22
47F:推 demo1945: 详细推 03/17 16:42
48F:推 oopssugar: 推,感谢分享 03/24 23:09
49F:推 KAOKAOKAO: 推 03/30 12:07
50F:推 jjcome: 推 05/03 12:27
51F:→ chiu1505: 推! 04/11 12:11
52F:推 dyjo4949: 推 好文分享 正在DevOps的路上有感 03/02 05:05