[心得] 初階 DevOps/SRE 工程師是如何煉成的

看板Soft_Job (軟體人)作者時間5年前 (2021/03/12 15:58), 5年前編輯推噓32(32015)
留言47則, 33人參與, 5年前最新討論串1/1
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://www.ptt.cc/bbs/Soft_Job/M.1615535884.A.7C7.html

03/12 16:02, 5年前 , 1F
淚推學Go,最近碰到一堆Go的開源工具有小毛病得去修
03/12 16:02, 1F

03/12 16:02, 5年前 , 2F
或是自己加功能的情形,但自己又不會Go只好卯起來用
03/12 16:02, 2F

03/12 16:02, 5年前 , 3F
Reference亂trace
03/12 16:02, 3F
Go 滿好學的,可以給它一個機會~

03/12 16:07, 5年前 , 4F
幫推大致上都有提到。
03/12 16:07, 4F

03/12 17:14, 5年前 , 5F
推,真的感覺水很深,每間公司又深在不同地方(工具、
03/12 17:14, 5F

03/12 17:14, 5年前 , 6F
語言都不一定一樣)
03/12 17:14, 6F

03/12 17:44, 5年前 , 7F
03/12 17:44, 7F

03/12 17:49, 5年前 , 8F
推 這篇大綱很紮實 精華總整理
03/12 17:49, 8F

03/12 18:07, 5年前 , 9F
03/12 18:07, 9F

03/12 18:07, 5年前 , 10F
感謝分享 另外那個書單好像沒有出現在文末?
03/12 18:07, 10F

03/12 18:08, 5年前 , 11F
喔喔不好意思看到了 原來是中文書XDD
03/12 18:08, 11F
這些書都是翻譯書,資訊的原文書天瓏應該都找得到XD

03/12 18:20, 5年前 , 12F
03/12 18:20, 12F

03/12 18:28, 5年前 , 13F
03/12 18:28, 13F

03/12 18:33, 5年前 , 14F
推推,自己不小心接觸到SRE發現這條路也很有趣!感謝你
03/12 18:33, 14F

03/12 18:33, 5年前 , 15F
的心得,希望可以追上你的車尾燈XD
03/12 18:33, 15F

03/12 18:49, 5年前 , 16F
03/12 18:49, 16F

03/12 19:05, 5年前 , 17F
推,不過個人對 DevOps handbook 的感想比較複雜,理
03/12 19:05, 17F

03/12 19:05, 5年前 , 18F
念是對的,就是有些案例個人覺得比較不切實際...
03/12 19:05, 18F

03/12 19:05, 5年前 , 19F
感謝分享~
03/12 19:05, 19F

03/12 19:06, 5年前 , 20F
像是什麼半夜開會大家會更有效率,出問題就整個 Val
03/12 19:06, 20F

03/12 19:06, 5年前 , 21F
ue stream 上的人全部來開會之類的...只能學概念,整
03/12 19:06, 21F

03/12 19:06, 5年前 , 22F
套全學一定會落於形式。
03/12 19:06, 22F
換個角度,如果有人把書中那套照搬,也是很不敏捷的表現吧XD 敏捷/DevOps 的精神就是不斷的回應環境的變化呀~

03/12 19:14, 5年前 , 23F
這篇不錯,推
03/12 19:14, 23F

03/12 19:30, 5年前 , 24F
推推
03/12 19:30, 24F

03/12 19:45, 5年前 , 25F
很平常 還是繼續我的黑魔法
03/12 19:45, 25F

03/12 19:49, 5年前 , 26F
推?
03/12 19:49, 26F

03/12 19:49, 5年前 , 27F
抱歉按到?,它在!隔壁Q_Q
03/12 19:49, 27F

03/12 19:53, 5年前 , 28F
推一個 程式界前輩
03/12 19:53, 28F

03/12 20:54, 5年前 , 29F
大師
03/12 20:54, 29F

03/12 21:31, 5年前 , 30F
03/12 21:31, 30F

03/12 23:43, 5年前 , 31F
強者推
03/12 23:43, 31F

03/13 02:34, 5年前 , 32F
先推推
03/13 02:34, 32F

03/13 03:59, 5年前 , 33F
03/13 03:59, 33F
※ 編輯: IcecreamHsu (140.112.87.59 臺灣), 03/13/2021 09:19:38

03/13 10:04, 5年前 , 34F
03/13 10:04, 34F

03/13 10:06, 5年前 , 35F
謝分,問下 Reactive 是啥特質或意思?也是指臨危不亂嗎
03/13 10:06, 35F
臨危不亂和 Reactive 不太一樣哦 臨危不亂是講像是服務中斷時,你能不能頂住壓力,找出問題的癥結點 Reactive 講的是敏捷,能不能隨時因應環境的變化而行動,而不是僵固的維持本來的計 畫,同義詞是 responsive ※ 編輯: IcecreamHsu (49.216.170.213 臺灣), 03/13/2021 10:35:01

03/13 10:40, 5年前 , 36F
恭喜拿到offer,老實說特質什麼的都是場面話
03/13 10:40, 36F

03/13 10:43, 5年前 , 37F
SRE最重要的其實是,oncall記得隨身帶電腦
03/13 10:43, 37F

03/13 14:45, 5年前 , 38F
推,112 果然猛
03/13 14:45, 38F

03/13 14:54, 5年前 , 39F
那兩個字其實也不太一樣 @_@~ 一個比較像反射 一個
03/13 14:54, 39F

03/13 14:55, 5年前 , 40F
像是想過再去做動作
03/13 14:55, 40F

03/13 14:57, 5年前 , 41F
以系統來說 都叫reactive 但下面應該還要有responsiv
03/13 14:57, 41F

03/13 14:58, 5年前 , 42F
e elastic resilient最少三大類
03/13 14:58, 42F

03/13 23:17, 5年前 , 43F
推推 感謝分享
03/13 23:17, 43F

03/15 16:29, 5年前 , 44F
好文 ! 推
03/15 16:29, 44F

03/16 19:02, 5年前 , 45F
推推
03/16 19:02, 45F

03/17 09:22, 5年前 , 46F
詳細給推
03/17 09:22, 46F

03/17 16:42, 5年前 , 47F
詳細推
03/17 16:42, 47F
文章代碼(AID): #1WInyCV7 (Soft_Job)
文章代碼(AID): #1WInyCV7 (Soft_Job)