DevOps & SRE 必備技能清單
導讀
- 這個列表並非詳盡無遺,只是列舉了技術基礎、必須知道的技能和一些隨機的想法。可以用它們作為一個清單來評估你自己或其他人,或者為下一次面試DevOps/SRE(Site Reliability Engineers,網站可靠性工程師)工作做準備。補充下,這個清單是比較個人的想法。
免責宣告
這個清單由ofollow,noindex">Sahil Sharma 和作者 共同完成。我們已經發布了它的第一個版本(DevOps和網站可靠性工程師必備技能清單 )。本文是最新的版本更新。
下一步是什麼?更瞭解DevOps生態系統:
- 首先,一定要了解文化要點的重要性:在這裡(15點DevOps檢查表 )可以讀到更多資訊。
- 您應該掌握*nix系統並且很好地理解Linux發行版的工作原理。
- 為產品設定選擇一個作業系統。不需要掌握每一個作業系統,這會讓你的工作陷入困境,選擇其中一個並掌握它。
- 能輕鬆使用終端,可能有一些GUI來管理伺服器,但是無論如何,必須熱愛終端,它更快、更安全,坦白說,一旦掌握了用起來會更容易。
- 如何獲取CPU/系統資訊(cat /proc/version,/proc/cpuinfo,uptime,等。)
- cron作業如何運作。在特定日期/時間/月設定cron作業。
- 瞭解在機器上執行的作業系統是什麼(cat /etc/lsb-release)
- 瞭解不同的*nix作業系統之間的區別,以及瞭解在機器上執行的作業系統(例如cat /etc/lsb-release)
- shell之間的區別:sh/dash/bash/ash/zsh
- 如何設定和取消設定ENV變數。匯出的ENV變數是臨時的,如何匯出永久的變數?
- 什麼是shell配置檔案:〜/.bashrc,.bash_profile,.environment .. 如何為程式初始化檔案“新增”設定?
- 瞭解Vim,其配置(.vimrc)及其一些基本提示是必須的。
- 日誌如何在*nix系統中執行,什麼是日誌記錄級別以及如何使用日誌管理工具(rsyslog,logstash,fluentd,logwatch,awslogs ..)
- swapping如何工作。swappiness是什麼。(swapon -s,/proc/sys/vm/swappiness,sysctl vm.swappiness ..)
- 能輕鬆使用指令碼語言輕鬆自如。Bash是必須瞭解的(其他指令碼語言也是非常有用的,如Python,Perl ..)。
- 掌握有用的命令,例如程序監控命令(ps,top,htop,atop ..),系統性能命令(nmon,iostat,sar,vmstat..)和網路故障排除和分析(nmap,tcpdump,ping,traceroute,airmon,airodump ..)。
- 你的備份策略是什麼?如何測試備份的可靠性?
- 你知道ext4,ntfs,fat?知道聯合檔案系統(Union FS)嗎?
- 如何在系統上檢視/設定網路配置?
- 如何在具有不同子網的計算機上設定靜態/動態IP地址?(提示:CIDR)
- 使用網路資料包分析來分析和了解網路的工作原理:tcpdump,Wireshark ..
- 你熟悉OSI模型和TCP/IP模型的規範嗎?TCP和UDP有什麼區別?你知道vxlan嗎?
- 如何設定防火牆(iptables,至少知道ufw):設定規則,列出規則,路由流量,阻止協議/埠 ..
- 如何檢視/設定/備份路由器設定?
- DNS如何工作?如何設定DNS伺服器(Bind,Unbound,PowerDNS,Dnsmasq ..)?遞迴(recursive)和權威(authoritative)DNS有什麼區別?如何排除DNS故障(nslookup,dig ..)
- 熟悉DNS和A,AAAA,C,CNAME,TXT記錄
- 當你在瀏覽器中點選google.com時會發生什麼?從瀏覽器的快取、本地DNS快取、本地網路配置(hosts檔案)、路由、DNS、網路、Web協議中,快取系統到Web伺服器(如果深入分析,最基本的問題也很難回答)。
- 熟悉CDN提供商(fastly,Akamai等)
- 熟悉SSL/TLS的工作原理以及數字證書的工作原理(https)
- 瞭解SSL證書(需要加密)
-
熟悉更安全的協議和工具:TLS,STARTTLS,SCP,SSH,
SFTP,FTPS .. - 瞭解PPTP,OpenVPN,L2TP/IPSec之間的區別
- 學習為域設定記錄集(可以使用Route53或Flare/">CloudFlare等託管雲服務)
- SSH如何工作,如何除錯它,如何生成ssh金鑰以及無密碼登入到其他計算機
-
什麼是init系統?你知道Systemd(自15.04以來由Ubuntu使
用),Upstart(由Ubuntu開發),SysV .. - 用任何軟體的原始碼編譯它(gcc,make和其他相關內容)
- 如何通過終端用不同的格式壓縮/解壓縮檔案(主要是:tar/tar.gz)
- 如何設定Web伺服器(Apache,Nginx ..)
- 學習使用“awk,sed,sort,uniq”操作Nginx/Apache日誌檔案
- Nginx和Apache有什麼區別?什麼時候使用Nginx?什麼時候使用Apache?在同一個Web應用程式中,何時以及如何同時使用它們?
- 如何設定反向代理(Nginx ..)
- 如何設定快取伺服器(Squid,Nginx,Varnish ..)
- 如何設定負載均衡器(HAproxy,Nginx ..)
- 如何為您的微服務建立API閘道器(Ambassador,Kong,Traefik,Nginx ..)
- 熟悉Systemd以及如何使用systemctl和journalctl等命令分析和管理服務
- 熟悉OAuth、SAML、Auth0整合
- 熟悉RESTful API,Webhooks,GraphQL,RPC/">gRPC
- 確保ES叢集安全(XPack(商業),OpenSource:ReadOnlyREST,Search Guard)
- 使用snapshot API或esdump進行ES備份(快照和增量)(注意:需要nodejs/npm)
- 使用DB備份
- 學習Python(pip + setup.py)和BASH。您是否開始使用Golang作為指令碼語言?嘗試一下吧。
- 發展雲端計算技能。從選擇雲基礎架構提供商開始:Amazon Web Services,Google Cloud Platform,Digitalocean,Microsoft Azure。或者使用OpenStack建立自己的私有云。
- staging伺服器怎麼樣?單元測試的測試策略是什麼?端到端?真的需要staging伺服器嗎?Google下“staging servers must die”。
- 閱讀有關PaaS/Iaas/Saas/CaaS/FaaS/DaaS和無伺服器架構的資訊
- 瞭解如何通過CLI中的Cloud Shell,或你的程式中的Cloud SDK,來使用和配置雲資源
- 瞭解如何使用至少一個配置管理和遠端執行工具(Ansible,Puppet,SaltStack,Chef 等)。您的選擇應基於以下標準:語法,效能,模板語言,推拉模型,效能,架構,與其他工具的整合,可伸縮性,可用性等等。
- 用於image構建的Packer
- 將Jenkins整合到CI/CD中
- 設定Consul(用於服務發現)
- 開始研究“基礎架構即程式碼”(infrastructure as code),以及基礎架構配置自動化工具,如Terraform和Packer
- 開始研究容器和Docker。容器是底層架構(cgroups和namespaces),它是如何工作的?
- 開始熟悉基本的Docker命令(logs/inspect/top/ps/rm)。另外得研究docker hub(push/pull image)
- 開始研究容器編排工具:Docker Swarm,Kubernetes,Mesosphere DC/OS,AWS ECS
- 閱讀有關無狀態和有狀態應用程式的知識
- 學習為您的應用程式構建小型的docker image(alpine比較合適)。僅安裝所需的包就夠了。
- 瞭解預設執行服務的最常用埠號(如:SSH(22),Web(80),HTTP/S(443)等)
- 從分散式角度學習網路(在容器世界中建立網路)。利用分散式系統中的8個謬論,讓自己輕鬆應對。
- 瞭解L4/L7負載均衡器。
- 瞭解如何確保代理伺服器和反向代理伺服器的安全(Nginx,Traefik,Ambassador ..),並瞭解它們的網路系統是如何工作的。
- 熟悉幫助建立可分發和可移植開發環境的工具(例如:Vagrant和Docker)。
- 部署應用程式時,管理私密資訊。Hashicorp Vault會幫助你。
- 瞭解AWS SQS,Google PubSub或其它替代方案。
- 熟悉Kafka,AWS Kinesis或其它替代方案。
- 瞭解AWS RDS,大多數時候Ops發現很容易將普通任務委派給服務提供商以避免額外的工作,但這會帶來一些費用。
- 如果你在使用Kubernetes,那麼瞭解它的所有元件和工作。
- 學習如何首先處理K8s內建功能,然後學習Helm/Istio。
- 瞭解監控的方式和內容(從作業系統和應用程式的角度來看)。
- 一旦到了合適的階段,接著會需要追蹤(Tracing)來幫助理解和挖掘,並且應用程式需要直接支援它
- 如果您正在處理(大)資料工程相關應用程式,那麼得熟悉Hadoop,HBase,Zookeeper,Spark以及如何設定相關叢集
- 學習如何根據應用需求設定和調整Redis,如何新增身份驗證。
- 瞭解應用程式的性質:CPU密集型,記憶體密集型,I/O密集型,然後瞭解如何相應地進行處理。
- 學習根據需要在不同型別的資料庫之間進行選擇:SQL,NoSQL,TSDB,圖形資料庫 ..
- 學習管理IAM角色/許可權以及如何管理不同使用者的金鑰(AWS IAM,GCP IAM ..)。
- 如果您喜歡分享並幫助其他人解決遇到過的問題,請將程式碼釋出到GitHub。
- 學習對基礎架構和應用程式進行基準測試以填補空白。
- 不要直接去執行。先視覺化最終目標、畫圖、與開發人員詳細討論、毫不猶豫地提問、讓問題徹底變得愚蠢。
- 不時做小型演示或PoC以便更好地理解。
- 你熟悉IDE(Sublime Text,Atom,Eclipse ..)嗎?
- 深入瞭解DB(MySQL或任何其它你喜歡的資料庫)。
- 瞭解Redis/Memcache以及類似工具。
- 瞭解微服務架構的優缺點,並開始構建類似的架構。
- 瞭解如何配置和使用持續整合和持續交付工具,如Jenkins,Travis CI,Buildbot,GoCd。將這些工具與其它工具(如Selenium,構建工具,配置管理軟體,Docker,雲供應商的SDK等)整合是非常有幫助的。
- 學習分散式版本控制系統Git及其基本命令(pull/push/commit/clone/branch/merge/logs等)。瞭解git工作流程。你知道如何將Git儲存庫恢復到以前的提交嗎?
- 如何使用SSH金鑰。嘗試使用Github,Bitbucket或Gitlab .. 來配置對repo/account的無密碼訪問。
- 熟悉核心版本的混亂以及如何修補它們。
- 瞭解如何生成校驗(md5,SHA ..)以驗證任何檔案的完整性。
- 瞭解單體(Monolithic)和微服務(Microservices)架構之間的區別。
- 如何實現零宕機部署?制定回滾、自修復、自動擴充套件的策略是什麼?
- 瞭解可擴充套件性和高度分散式系統,如何讓它們一直保持執行狀態?
- 熟悉API和服務:RESTfull,RESTful-like,API閘道器,Lambda函式,serverless計算,SOA,SOAP,JMS,CRUD ..
- 如何確保基礎架構、網路和執行的應用程式的安全?
- 你知道什麼是ChatOps嗎?是否嘗試過使用一個已知框架? Hubot,Lita,Cog?
- 瞭解如何設定、配置和使用某些監控系統(Nagios,Zabix,Sensu,Prometheus ..)
- 無論你做什麼都“記錄下來”,無論多麼粗糙,做吧。稍後,你會感謝自己的。
- 製作小的程式碼指令碼以方便使用,記下命令或片段(通過StackOverflow,Github Gists或其它線上記事板),它會幫助你得到想要的東西。
- 讓Google,StackExchange,Quora和其它專業論壇成為您的朋友。
- 讀,讀,讀。在Twitter/StackOverflow上提問。
- 參加會議。可以加入我們當地的聚會,如DevOpsLinks Community會議(班加羅爾) ,DevOpsLinks Community會議(倫敦) 和DevOpsLinks Community會議(巴黎) 。如果想組織當地的聚會,請聯絡我們,我們將為您提供幫助!
- 與同一領域的研究員交談並討論您的問題。通過社群 學習。
- 加入我們的Slack頻道 並詢問您的所有(菜鳥級)問題,都沒問題!我們都是從開始起步的。
- 不要試圖解決所有問題。永遠記住一件事:沒有人是一座孤島。你不能做、學習、實現一切。要了解對於手頭的任務最重要的是什麼。
- 閱讀DevOps詞彙表(請Google它)
- 關注開源專案(Kubernetes/Docker等)或者讓您感到興奮的東西。
- 關注來自社群 的志同道合的人,並瞭解最新的科技趨勢。
- 嘗試搭建良好的開發實踐以及堅實的架構。
- 瞭解如何在生產級別進行擴充套件。
- 瞭解如何在生產伺服器中實時除錯和跟蹤執行的應用程式。
- 關注一些合適的科技公司的技術部落格(我們跟隨:Google/Uber/Quora/Github/Netflix)。這是您可以直接從專家那裡學習的地方,並有機會看到他們解決任何問題的方法。
- 瀏覽一些新聞聚合器,如Reddit,hackernews,medium等。
- 在twitter上關注志同道合的開發人員和技術公司。 (我總是閱讀文章和觀看談話/會議,事後剖析(post-mortems)是我最喜歡的內容。我也關注一些github庫看看我使用的技術發生了什麼。)
- 加入DevOpsLinks 、Kaptain 和Shipped !我們相信你會學到很多東西,即使你是專家,你仍然不得不更多地學習。
- 閱讀各種與技術相關的部落格並訂閱DevOps Newsletters。順便說一句,我們有一份出版物 ,您可以提交您的文章並與社群分享。
- 瞭解開源以及如何 為開源專案做出貢獻。
- 如果系統出現問題,您應該能夠進行事後剖析。詳細記錄出現了什麼問題,以及如何防止它再次發生。
- 嘗試學習StackOverflow的專家如何解決問題。永遠記住,方法是不斷變化的,不像基礎知識總是保持不變。
- 讀書。
- 最後這點也很重要......不要假設任何事情,永遠不要把現實視為理所當然,總是去嘗試並享受旅程。
如果您擁有以上大部分技能,則可以確保您具備DevOps、SRE和系統工程知識的先決條件。
你無法一次性學習所有這些,但是具備這樣一個思維模式是主要的。 即使去熟悉所有這些也肯定需要時間,但俗話說旅程很有趣。 你會失敗很多次,並從錯誤中吸取教訓,不要重蹈覆轍。
永遠記住,我們都是學生。我們通過碰撞和試驗來學習。不要羞於失敗,因為這就是學習的方式。
我們希望聽到您的反饋和建議:
- 顯然,針對這個清單的反饋和建議。
- 您想學習哪種技術?(請與我們分享)。我們將推出一個DevOps線上學院,我們希望您成為我們的第一個貢獻者,所以分享您的建議,不要害羞!
- 其他的東西,我們將與您在未來分享,我們將很高興聽到您的建議和反饋!
進一步聯絡
我們會很高興聽到您的建議,並願意為這個清單增加其它觀點。
為了取得聯絡,請訂閱我們的一個或多個線上社群,因為這是瞭解最新資訊並與我們以及社群保持聯絡的好方法:
DevOpsLinks ,一個來自世界各地的DevOps專業人士和從業者的社群。

Shipped ,一個專注於無服務計算、FaaS和其他有趣主題的技術的社群。

Kaptain :一個Kubernetes社群中心,主要包括手工策劃的時事通訊、團隊聊天、培訓和更多(即將推出)。

如果您喜歡這篇文章,請通過訂閱上述一個或多個線上社群與我們保持聯絡。
請為我們鼓掌並分享給您的粉絲。
原文連結:The Must Know Checklist For DevOps & Site Reliability Engineers
感謝張嬋對本文的審校。