DevOps这个词,从2009年被提出,到现在已经快十年了。这十年间,DevOps从一个小众概念,变成了软件开发领域的主流实践。越来越多的团队,开始采用DevOps的方法和工具,来提升软件交付的效率和质量。
但是,很多团队对DevOps的理解,还停留在比较浅的层面。他们以为,DevOps就是用Jenkins做CI/CD,用Docker做容器化,用Kubernetes做编排。只要把这些工具搭起来,就算是DevOps了。
其实不是。DevOps不是简单的工具堆砌,而是一种文化和思维方式的转变。工具只是手段,文化才是核心。在掌握了基础的工具和流程之后,如何进一步提升DevOps实践的水平?今天,我想分享一些进阶技巧,这些技巧,可能是你在日常工作中忽略了的,但却能带来质的提升。
一、基础设施即代码:不止是写脚本
基础设施即代码(Infrastructure as Code,IaC),是DevOps的核心实践之一。很多团队,已经开始用Terraform、Ansible、Puppet等工具,来管理基础设施。但是,很多人对IaC的理解,还停留在"用脚本代替手动操作"的层面。
其实,IaC的精髓,不在于用脚本,而在于把基础设施当作软件来管理。这意味着,你的基础设施代码,应该和应用代码一样,有版本控制,有代码审查,有测试,有CI/CD流水线。
1. 基础设施代码也要做代码审查
很多团队,应用代码会做严格的代码审查,但是基础设施代码,却经常是一个人写完就直接跑了。这其实是很危险的。基础设施代码的一个小错误,可能会导致整个服务宕机,甚至数据丢失。
所以,基础设施代码,也应该和应用代码一样,走Pull Request流程,有人审查,有人批准,才能合并和执行。审查的重点,包括安全性、可靠性、成本、可维护性等方面。
2. 基础设施代码也要写测试
应用代码有单元测试、集成测试,基础设施代码也应该有测试。比如,你可以用Terratest、InSpec等工具,来测试你的基础设施是否符合预期。测试的内容,可以包括:服务器是否正确创建、安全组是否正确配置、服务是否正常启动、端口是否正确开放等。
写测试,看起来增加了工作量,但是,它能帮你在早期发现问题,避免在生产环境出故障。而且,有了测试,你就可以放心地重构基础设施代码,不用担心改坏了什么。
3. 基础设施代码也要模块化和复用
很多团队的基础设施代码,是一堆大而全的脚本,复制粘贴,到处都是。这样的代码,很难维护,也很容易出错。
好的做法是,把基础设施代码模块化。比如,你可以把VPC、子网、安全组、负载均衡、数据库等,封装成可复用的模块。然后,在不同的环境(开发、测试、生产)中,通过参数化的方式,调用这些模块。这样,既减少了重复代码,又保证了不同环境的一致性。
二、混沌工程:主动制造故障来提升可靠性
混沌工程(Chaos Engineering),是Netflix在2011年提出的概念,目的是通过主动制造故障,来测试系统的弹性和可靠性。这些年,混沌工程越来越受到重视,很多大厂都在实践。
但是,很多团队对混沌工程的理解,还停留在"随机杀进程"的层面。其实,混沌工程是一门严谨的科学,有它的方法论和最佳实践。
1. 从稳态假设开始
混沌工程的第一步,不是直接搞破坏,而是先定义系统的稳态假设。什么是稳态假设?就是你认为系统在正常情况下,应该表现出什么样的行为。比如,"系统的P99延迟应该小于200毫秒","系统的错误率应该低于0.1%","系统的可用性应该达到99.9%"。
有了稳态假设,你才能在注入故障之后,判断系统是否偏离了稳态,从而评估系统的弹性。
2. 从小范围、可控的实验开始
很多人一听混沌工程,就觉得要在生产环境随便搞,这其实是误解。混沌工程,应该从小范围、可控的实验开始。比如,你可以先在测试环境做实验,然后在生产环境的一个小集群做实验,最后再逐步扩大范围。
而且,实验应该有明确的终止条件。一旦系统偏离稳态超过阈值,就应该立即停止实验,恢复系统。这样,即使实验出了问题,也不会造成太大的影响。
3. 关注 blast radius(爆炸半径)
混沌工程中,一个很重要的概念是blast radius,也就是故障可能影响的范围。在设计实验的时候,你应该尽量控制blast radius,避免实验影响到太多用户。
比如,你可以只在一个可用区注入故障,而不是整个区域;只对一小部分用户注入故障,而不是所有用户;只在流量低峰期做实验,而不是高峰期。这样,即使实验出了问题,影响也有限。
三、可观测性:不止是监控和日志
可观测性(Observability),是这两年DevOps领域的热门概念。很多人以为,可观测性就是监控加日志,其实不是。监控和日志,只是可观测性的一部分。
可观测性,来源于控制论,指的是通过系统的外部输出,推断系统内部状态的能力。在软件系统中,可观测性通常包括三个支柱:指标(Metrics)、日志(Logs)和链路追踪(Tracing)。
1. 指标:关注趋势和异常
指标,是可观测性的基础。通过指标,你可以了解系统的整体健康状况,发现趋势和异常。常见的指标,包括CPU使用率、内存使用率、磁盘使用率、网络流量、请求量、延迟、错误率等。
但是,很多团队的指标,只关注基础设施层面,不关注业务层面。其实,业务指标更重要。比如,对于电商网站,下单量、支付成功率、购物车放弃率等业务指标,比CPU使用率更能反映系统的健康状况。所以,你应该同时关注基础设施指标和业务指标。
2. 日志:结构化和上下文
日志,是排查问题的重要依据。但是,很多团队的日志,是混乱的、非结构化的,很难分析。好的日志,应该是结构化的,包含足够的上下文信息。
结构化日志,就是用JSON等格式,把日志的各个字段(时间、级别、服务、实例、请求ID、用户ID、错误信息等)分开存储。这样,你就可以方便地查询、过滤、聚合日志。
而且,日志应该包含足够的上下文信息。比如,每一条日志,都应该带上请求ID,这样,你就可以通过请求ID,把一次请求的所有日志串起来,方便排查问题。
3. 链路追踪:看清请求的全貌
在微服务架构中,一个请求,可能会经过多个服务。出了问题,你很难知道是哪个服务出了问题,也很难知道请求在各个服务中的耗时分布。链路追踪,就是用来解决这个问题的。
通过链路追踪,你可以看到一个请求,从进入系统到返回响应,经过了哪些服务,每个服务花了多长时间,哪里是瓶颈。这样,排查问题和性能优化,就有了明确的方向。
现在,主流的链路追踪工具,有Jaeger、Zipkin、SkyWalking等。如果你还没有接入链路追踪,建议尽快接入,它会给你带来很大的帮助。
四、安全左移:把安全融入开发流程
安全,一直是DevOps中的薄弱环节。很多团队,安全是在上线前,由安全团队做一次扫描,发现问题再修复。这种"右移"的安全模式,效率很低,而且经常因为时间紧,而忽略了一些安全问题。
安全左移(Shift Left Security),就是把安全融入到开发流程的早期,从需求、设计、编码、测试,到部署,每个环节都考虑安全。这样,安全问题可以在早期发现和修复,成本更低,效率更高。
1. 代码中的安全扫描
在代码提交的时候,就应该做安全扫描。比如,你可以用SonarQube、Checkmarx等工具,做静态应用安全测试(SAST),扫描代码中的安全漏洞。也可以用Snyk、Dependabot等工具,扫描依赖包中的已知漏洞。
这些扫描,应该集成到CI流水线中,代码一提交就自动跑。如果发现高危漏洞,就直接阻断构建,不让有问题的代码合并。
2. 镜像和容器的安全扫描
容器化之后,镜像的安全也很重要。你应该在镜像构建完成后,做安全扫描,看看镜像中有没有已知的漏洞。常用的工具有Trivy、Clair、Aqua等。
而且,你应该尽量使用精简的基础镜像,比如Alpine,减少攻击面。不要在镜像中包含不必要的工具和库。运行容器的时候,也应该遵循最小权限原则,不要用root用户运行,不要挂载不必要的目录。
3. 基础设施的安全配置
基础设施的安全配置,也很重要。比如,安全组是不是开放了不必要的端口?数据库是不是公网可访问?IAM权限是不是过大?这些问题,都可能导致安全事故。
你可以用Terraform的安全扫描工具,比如Checkov、tfsec,在基础设施代码提交的时候,就扫描安全配置问题。也可以用云服务商提供的安全配置检查工具,定期检查生产环境的安全配置。
五、度量:用数据驱动改进
DevOps的改进,不能靠感觉,要靠数据。你需要建立一套度量体系,来衡量DevOps的成效,发现瓶颈,驱动改进。
DevOps的度量,通常包括四个关键指标,也就是DORA(DevOps Research and Assessment)提出的四个指标:部署频率、变更前置时间、变更失败率、平均恢复时间。
1. 部署频率
部署频率,指的是团队部署到生产环境的频率。部署频率越高,说明团队的交付能力越强。高绩效团队,通常是每天多次部署,甚至随时部署。
但是,部署频率不是越高越好。如果为了追求高频率,而降低了质量,那就得不偿失了。所以,部署频率应该和其他指标一起看,综合评估。
2. 变更前置时间
变更前置时间,指的是从代码提交,到部署到生产环境的时间。这个时间越短,说明团队的交付效率越高。高绩效团队,通常变更前置时间在一小时以内。
变更前置时间长,通常说明CI/CD流水线有瓶颈,或者测试、审批环节太慢。你可以通过分析变更前置时间,找到瓶颈,优化流程。
3. 变更失败率
变更失败率,指的是部署到生产环境后,导致服务降级或故障的比例。这个比例越低,说明团队的交付质量越高。高绩效团队,通常变更失败率在15%以下。
变更失败率高,说明测试不够充分,或者代码质量有问题。你需要加强测试,提升代码质量,降低变更失败率。
4. 平均恢复时间
平均恢复时间(MTTR),指的是从故障发生,到服务恢复正常的平均时间。这个时间越短,说明团队的故障响应和恢复能力越强。高绩效团队,通常MTTR在一小时以内。
MTTR长,说明故障发现慢,或者排查和恢复慢。你需要提升可观测性,完善故障响应流程,缩短MTTR。
六、写在最后
DevOps的进阶,没有终点。今天分享的这些技巧,只是DevOps进阶路上的一部分。还有很多其他的实践,比如GitOps、AIOps、平台工程等,都值得深入学习和实践。
但是,不管技术怎么发展,DevOps的核心始终是文化和协作。工具只是手段,人才是核心。只有团队真正理解了DevOps的文化,建立了良好的协作机制,DevOps才能真正落地,发挥价值。
希望今天分享的这些技巧,能给你带来一些启发。如果你有其他的DevOps进阶技巧,欢迎在评论区留言,我们一起交流。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录