导读
\\
- 这个列表并非详尽无遗,只是列举了技术基础、必须知道的技能和一些随机的想法。可以用它们作为一个清单来评估你自己或其他人,或者为下一次面试DevOps/SRE(Site Reliability Engineers,网站可靠性工程师)工作做准备。补充下,这个清单是比较个人的想法。\
免责声明
\\
这个清单由Sahil Sharma和作者共同完成。我们已经发布了它的第一个版本(DevOps和网站可靠性工程师必备技能清单)。本文是最新的版本更新。
\\
下一步是什么?更了解DevOps生态系统:
\\
- 首先,一定要了解文化要点的重要性:在这里(15点DevOps检查表 )可以读到更多信息。\\t
- 您应该掌握*nix系统并且很好地理解Linux发行版的工作原理。\\t
- 为产品设置选择一个操作系统。不需要掌握每一个操作系统,这会让你的工作陷入困境,选择其中一个并掌握它。\\t
- 能轻松使用终端,可能有一些GUI来管理服务器,但是无论如何,必须热爱终端,它更快、更安全,坦白说,一旦掌握了用起来会更容易。\\t
- 如何获取CPU/系统信息(cat /proc/version,/proc/cpuinfo,uptime,等。)\\t
- cron作业如何运作。在特定日期/时间/月设置cron作业。\\t
- 了解在机器上运行的操作系统是什么(cat /etc/lsb-release)\\t
- 了解不同的*nix操作系统之间的区别,以及了解在机器上运行的操作系统(例如cat /etc/lsb-release)\\t
- shell之间的区别:sh/dash/bash/ash/zsh\\t
- 如何设置和取消设置ENV变量。导出的ENV变量是临时的,如何导出永久的变量?\\t
- 什么是shell配置文件:〜/.bashrc,.bash_profile,.environment .. 如何为程序初始化文件“添加”设置?\\t
- 了解Vim,其配置(.vimrc)及其一些基本提示是必须的。\\t
- 日志如何在*nix系统中运行,什么是日志记录级别以及如何使用日志管理工具(rsyslog,logstash,fluentd,logwatch,awslogs ..)\\t
- swapping如何工作。swappiness是什么。(swapon -s,/proc/sys/vm/swappiness,sysctl vm.swappiness ..)\\t
- 能轻松使用脚本语言轻松自如。Bash是必须了解的(其他脚本语言也是非常有用的,如Python,Perl ..)。\\t
- 掌握有用的命令,例如进程监控命令(ps,top,htop,atop ..),系统性能命令(nmon,iostat,sar,vmstat..)和网络故障排除和分析(nmap,tcpdump,ping,traceroute,airmon,airodump ..)。\\t
- 你的备份策略是什么?如何测试备份的可靠性?\\t
- 你知道ext4,ntfs,fat?知道联合文件系统(Union FS)吗?\\t
- 如何在系统上查看/设置网络配置?\\t
- 如何在具有不同子网的计算机上设置静态/动态IP地址?(提示:CIDR)\\t
- 使用网络数据包分析来分析和了解网络的工作原理:tcpdump,Wireshark ..\\t
- 你熟悉OSI模型和TCP/IP模型的规范吗?TCP和UDP有什么区别?你知道vxlan吗?\\t
- 如何设置防火墙(iptables,至少知道ufw):设置规则,列出规则,路由流量,阻止协议/端口 ..\\t
- 如何查看/设置/备份路由器设置?\\t
- DNS如何工作?如何设置DNS服务器(Bind,Unbound,PowerDNS,Dnsmasq ..)?递归(recursive)和权威(authoritative)DNS有什么区别?如何排除DNS故障(nslookup,dig ..)\\t
- 熟悉DNS和A,AAAA,C,CNAME,TXT记录\\t
- 当你在浏览器中点击google.com时会发生什么?从浏览器的缓存、本地DNS缓存、本地网络配置(hosts文件)、路由、DNS、网络、Web协议中,缓存系统到Web服务器(如果深入分析,最基本的问题也很难回答)。\\t
- 熟悉CDN提供商(fastly,Akamai等)\\t
- 熟悉SSL/TLS的工作原理以及数字证书的工作原理(https)\\t
- 了解SSL证书(需要加密)\\t
- 熟悉更安全的协议和工具:TLS,STARTTLS,SCP,SSH,
\\tSFTP,FTPS ..\\t
- 了解PPTP,OpenVPN,L2TP/IPSec之间的区别\\t
- 学习为域设置记录集(可以使用Route53或CloudFlare等托管云服务)\\t
- SSH如何工作,如何调试它,如何生成ssh密钥以及无密码登录到其他计算机\\t
- 什么是init系统?你知道Systemd(自15.04以来由Ubuntu使
\\t用),Upstart(由Ubuntu开发),SysV ..\\t
- 用任何软件的源代码编译它(gcc,make和其他相关内容)\\t
- 如何通过终端用不同的格式压缩/解压缩文件(主要是:tar/tar.gz)\\t
- 如何设置Web服务器(Apache,Nginx ..)\\t
- 学习使用“awk,sed,sort,uniq”操作Nginx/Apache日志文件\\t
- Nginx和Apache有什么区别?什么时候使用Nginx?什么时候使用Apache?在同一个Web应用程序中,何时以及如何同时使用它们?\\t
- 如何设置反向代理(Nginx ..)\\t
- 如何设置缓存服务器(Squid,Nginx,Varnish ..)\\t
- 如何设置负载均衡器(HAproxy,Nginx ..)\\t
- 如何为您的微服务建立API网关(Ambassador,Kong,Traefik,Nginx ..)\\t
- 熟悉Systemd以及如何使用systemctl和journalctl等命令分析和管理服务\\t
- 熟悉OAuth、SAML、Auth0集成\\t
- 熟悉RESTful API,Webhooks,GraphQL,gRPC\\t
- 确保ES集群安全(XPack(商业),OpenSource:ReadOnlyREST,Search Guard)\\t
- 使用snapshot API或esdump进行ES备份(快照和增量)(注意:需要nodejs/npm)\\t
- 使用DB备份\\t
- 学习Python(pip + setup.py)和BASH。您是否开始使用Golang作为脚本语言?尝试一下吧。\\t
- 发展云计算技能。从选择云基础架构提供商开始:Amazon Web Services,Google Cloud Platform,Digitalocean,Microsoft Azure。或者使用OpenStack创建自己的私有云。\\t
- staging服务器怎么样?单元测试的测试策略是什么?端到端?真的需要staging服务器吗?Google下“staging servers must die”。\\t
- 阅读有关PaaS/Iaas/Saas/CaaS/FaaS/DaaS和无服务器架构的信息\\t
- 了解如何通过CLI中的Cloud Shell,或你的程序中的Cloud SDK,来使用和配置云资源\\t
- 了解如何使用至少一个配置管理和远程执行工具(Ansible,Puppet,SaltStack,Chef 等)。您的选择应基于以下标准:语法,性能,模板语言,推拉模型,性能,架构,与其他工具的集成,可伸缩性,可用性等等。\\t
- 用于image构建的Packer\\t
- 将Jenkins集成到CI/CD中\\t
- 设置Consul(用于服务发现)\\t
- 开始研究“基础架构即代码”(infrastructure as code),以及基础架构配置自动化工具,如Terraform和Packer\\t
- 开始研究容器和Docker。容器是底层架构(cgroups和namespaces),它是如何工作的?\\t
- 开始熟悉基本的Docker命令(logs/inspect/top/ps/rm)。另外得研究docker hub(push/pull image)\\t
- 开始研究容器编排工具:Docker Swarm,Kubernetes,Mesosphere DC/OS,AWS ECS\\t
- 阅读有关无状态和有状态应用程序的知识\\t
- 学习为您的应用程序构建小型的docker image(alpine比较合适)。仅安装所需的包就够了。\\t
- 了解默认运行服务的最常用端口号(如:SSH(22),Web(80),HTTP/S(443)等)\\t
- 从分布式角度学习网络(在容器世界中建立网络)。利用分布式系统中的8个谬论,让自己轻松应对。\\t
- 了解L4/L7负载均衡器。\\t
- 了解如何确保代理服务器和反向代理服务器的安全(Nginx,Traefik,Ambassador ..),并了解它们的网络系统是如何工作的。\\t
- 熟悉帮助创建可分发和可移植开发环境的工具(例如:Vagrant和Docker)。\\t
- 部署应用程序时,管理私密信息。Hashicorp Vault会帮助你。\\t
- 了解AWS SQS,Google PubSub或其它替代方案。\\t
- 熟悉Kafka,AWS Kinesis或其它替代方案。\\t
- 了解AWS RDS,大多数时候Ops发现很容易将普通任务委派给服务提供商以避免额外的工作,但这会带来一些费用。\\t
- 如果你在使用Kubernetes,那么了解它的所有组件和工作。\\t
- 学习如何首先处理K8s内置功能,然后学习Helm/Istio。\\t
- 了解监控的方式和内容(从操作系统和应用程序的角度来看)。\\t
- 一旦到了合适的阶段,接着会需要追踪(Tracing)来帮助理解和挖掘,并且应用程序需要直接支持它\\t
- 如果您正在处理(大)数据工程相关应用程序,那么得熟悉Hadoop,HBase,Zookeeper,Spark以及如何设置相关集群\\t
- 学习如何根据应用需求设置和调整Redis,如何添加身份验证。\\t
- 了解应用程序的性质:CPU密集型,内存密集型,I/O密集型,然后了解如何相应地进行处理。\\t
- 学习根据需要在不同类型的数据库之间进行选择:SQL,NoSQL,TSDB,图形数据库 ..\\t
- 学习管理IAM角色/权限以及如何管理不同用户的密钥(AWS IAM,GCP IAM ..)。\\t
- 如果您喜欢分享并帮助其他人解决遇到过的问题,请将代码发布到GitHub。\\t
- 学习对基础架构和应用程序进行基准测试以填补空白。\\t
- 不要直接去执行。先可视化最终目标、画图、与开发人员详细讨论、毫不犹豫地提问、让问题彻底变得愚蠢。\\t
- 不时做小型演示或PoC以便更好地理解。\\t
- 你熟悉IDE(Sublime Text,Atom,Eclipse ..)吗?\\t
- 深入了解DB(MySQL或任何其它你喜欢的数据库)。\\t
- 了解Redis/Memcache以及类似工具。\\t
- 了解微服务架构的优缺点,并开始构建类似的架构。\\t
- 了解如何配置和使用持续集成和持续交付工具,如Jenkins,Travis CI,Buildbot,GoCd。将这些工具与其它工具(如Selenium,构建工具,配置管理软件,Docker,云供应商的SDK等)集成是非常有帮助的。\\t
- 学习分布式版本控制系统Git及其基本命令(pull/push/commit/clone/branch/merge/logs等)。了解git工作流程。你知道如何将Git存储库恢复到以前的提交吗?\\t
- 如何使用SSH密钥。尝试使用Github,Bitbucket或Gitlab .. 来配置对repo/account的无密码访问。\\t
- 熟悉内核版本的混乱以及如何修补它们。\\t
- 了解如何生成校验(md5,SHA ..)以验证任何文件的完整性。\\t
- 了解单体(Monolithic)和微服务(Microservices)架构之间的区别。\\t
- 如何实现零宕机部署?制定回滚、自修复、自动扩展的策略是什么?\\t
- 了解可扩展性和高度分布式系统,如何让它们一直保持运行状态?\\t
- 熟悉API和服务:RESTfull,RESTful-like,API网关,Lambda函数,serverless计算,SOA,SOAP,JMS,CRUD ..\\t
- 如何确保基础架构、网络和运行的应用程序的安全?\\t
- 你知道什么是ChatOps吗?是否尝试过使用一个已知框架? Hubot,Lita,Cog?\\t
- 了解如何设置、配置和使用某些监控系统(Nagios,Zabix,Sensu,Prometheus ..)\\t
- 无论你做什么都“记录下来”,无论多么粗糙,做吧。稍后,你会感谢自己的。\\t
- 制作小的代码脚本以方便使用,记下命令或片段(通过StackOverflow,Github Gists或其它在线记事板),它会帮助你得到想要的东西。\\t
- 让Google,StackExchange,Quora和其它专业论坛成为您的朋友。\\t
- 读,读,读。在Twitter/StackOverflow上提问。\\t
- 参加会议。可以加入我们当地的聚会,如DevOpsLinks Community会议(班加罗尔),DevOpsLinks Community会议(伦敦)和DevOpsLinks Community会议(巴黎)。如果想组织当地的聚会,请联系我们,我们将为您提供帮助!\\t
- 与同一领域的研究员交谈并讨论您的问题。通过社区学习。\\t
- 加入我们的Slack频道并询问您的所有(菜鸟级)问题,都没问题!我们都是从开始起步的。\\t
- 不要试图解决所有问题。永远记住一件事:没有人是一座孤岛。你不能做、学习、实现一切。要了解对于手头的任务最重要的是什么。\\t
- 阅读DevOps词汇表(请Google它)\\t
- 关注开源项目(Kubernetes/Docker等)或者让您感到兴奋的东西。\\t
- 关注来自社区的志同道合的人,并了解最新的科技趋势。\\t
- 尝试搭建良好的开发实践以及坚实的架构。\\t
- 了解如何在生产级别进行扩展。\\t
- 了解如何在生产服务器中实时调试和跟踪运行的应用程序。\\t
- 关注一些合适的科技公司的技术博客(我们跟随:Google/Uber/Quora/Github/Netflix)。这是您可以直接从专家那里学习的地方,并有机会看到他们解决任何问题的方法。\\t
- 浏览一些新闻聚合器,如Reddit,hackernews,medium等。\\t
- 在twitter上关注志同道合的开发人员和技术公司。 (我总是阅读文章和观看谈话/会议,事后剖析(post-mortems)是我最喜欢的内容。我也关注一些github库看看我使用的技术发生了什么。)\\t
- 加入DevOpsLinks、Kaptain和Shipped!我们相信你会学到很多东西,即使你是专家,你仍然不得不更多地学习。\\t
- 阅读各种与技术相关的博客并订阅DevOps Newsletters。顺便说一句,我们有一份出版物,您可以提交您的文章并与社区分享。\\t
- 了解开源以及如何为开源项目做出贡献。\\t
- 如果系统出现问题,您应该能够进行事后剖析。详细记录出现了什么问题,以及如何防止它再次发生。\\t
- 尝试学习StackOverflow的专家如何解决问题。永远记住,方法是不断变化的,不像基础知识总是保持不变。\\t
- 读书。\\t
- 最后这点也很重要……不要假设任何事情,永远不要把现实视为理所当然,总是去尝试并享受旅程。\
如果您拥有以上大部分技能,则可以确保您具备DevOps、SRE和系统工程知识的先决条件。
\\
你无法一次性学习所有这些,但是具备这样一个思维模式是主要的。 即使去熟悉所有这些也肯定需要时间,但俗话说旅程很有趣。 你会失败很多次,并从错误中吸取教训,不要重蹈覆辙。
\\
永远记住,我们都是学生。我们通过碰撞和试验来学习。不要羞于失败,因为这就是学习的方式。
\\
我们希望听到您的反馈和建议:
\\
- 显然,针对这个清单的反馈和建议。\\t
- 您想学习哪种技术?(请与我们分享)。我们将推出一个DevOps在线学院,我们希望您成为我们的第一个贡献者,所以分享您的建议,不要害羞!\\t
- 其他的东西,我们将与您在未来分享,我们将很高兴听到您的建议和反馈!\
进一步联系
\\
我们会很高兴听到您的建议,并愿意为这个清单增加其它观点。
\\
为了取得联系,请订阅我们的一个或多个在线社区,因为这是了解最新信息并与我们以及社区保持联系的好方法:
\\
DevOpsLinks,一个来自世界各地的DevOps专业人士和从业者的社区。
\\
Shipped,一个专注于无服务计算、FaaS和其他有趣主题的技术的社区。
\\
Kaptain:一个Kubernetes社区中心,主要包括手工策划的时事通讯、团队聊天、培训和更多(即将推出)。
\\
如果您喜欢这篇文章,请通过订阅上述一个或多个在线社区与我们保持联系。
\\
请为我们鼓掌并分享给您的粉丝。
\\
原文链接: The Must Know Checklist For DevOps \u0026amp; Site Reliability Engineers
\\
感谢张婵对本文的审校。