云原生的浪潮下,为什么运维人员适合学习Go语言?(22)

发布于2019-04-21 20:33:58

本文旨在为使用Go语言提供一个新的视角。你不要指望在这篇文章里看到代码或者学到什么新东西,我只是提供了一个开放的新视角,并将它分享给正在寻找新解决方案的系统运维/DevOps/Observability工程师们。

不久前,系统运维还是一个很常见的工作岗位,这个岗位负责更新软件、配置网络和编写bash脚本。然后DevOps出现了——这是开发人员与运维人员之间的一个交汇点。现在,随着系统变得越来越分布式且越来越复杂,可观察性成为有助于你了解系统健康状况的一个重要因素。

定义可观察性

人们早就开始了有关可观察性的讨论,并且现在还在继续。我从中学到了很多东西,并且很高兴能够参与其中。有些人可能不同意这个定义,而且在未来,我可能还会有不同的想法。

监控是指反复检查系统及其输出,以确保它们处于良好的状态。它可以说是运维版的集成测试,只是偏重于中断事故以及与警报和日志等工具相关的问题

在控制理论中,可观察性是一种系统度量,即根据系统外部输出来判断系统内部的健康状况。系统的可观察性和可控性是一组数学对偶。

可观察性是关于了解软件和系统的内部工作情况,提出问题,并通过外部观察获得问题的答案。可以是任意问题,不仅限于警报之类的问题。

很多现代用于运维和可观察性的工具都是用Go语言开发的。

这种转变如何在代码中体现出来?

一切都是从在代码中添加日志开始的,这绝对是所有调试工具的始祖。

我们还会经常写一些简单的bash脚本。

有时候你可能会想:“要解决这个问题,写个一次性小脚本就可以了”。但随着系统变得越来越复杂,我们的工作越来越复杂,这些脚本也越来越复杂。它们成倍增加,最终出现了一大堆遗留脚本。我们可以使用编程语言而不是脚本语言写些真正的代码,而不只是脚本

就像你无法想象一个餐厅厨师在一个高可用、高响应的复杂架构中使用常规的刀具维护多个服务——这需要一个易于维护的解决方案。Go语言提供了很多这方面的好处,接下来我们将详细介绍。

工具

这里列出的所有工具都是开源的。

使用Go语言重写的Ops工具

Kubernetes

谷歌在2003年开发了Borg,作为集群管理器,Kubernetes旨在能有效地调度数十万个作业,并让计算更加高效。它最初是用C++编开发的。

2014年,Kubernetes作为一个容器编配器发布,大型公司用它在生产环境中运行分布式服务。

Kubernetes是一个用于自动化容器化应用程序的部署、扩展和管理的系统。它将构成应用程序的容器分组为逻辑单元,以便于管理和发现。Kubernetes可以在不增加运维团队规模的情况下扩展和添加无限量的资源。它可以部署在本地,也可以在混合或公共云基础设施上运行。

Prometheus

Borg Mon也于2003年诞生,作为Borg的内部监控系统,它最初也是用C++开发的。

2012年,Prometheus开源:作为一个时间序列数据源,用于收集指标和生成警报。

时间序列通过指标名称和一组键值对来标识,从而可以支持强大的查询和高效存储,并内置了警报功能,它支持10种语言,可以从Docker和StatsD等来源导入数据。

Etcd

Chubby于2006年创建,是一个分布式锁管理器。有趣的是,它的SLO是99.99(4个9),为了达到这个SLO,开发团队经常不得不每季度执行长达13分钟的计划内中断!

Etcd是在2013年开发的:一个强大的一致性分布式键值存储,你可以读取和写入数据,而且为在一组计算机上存储数据提供了可靠的方法。

Etcd是Kubernetes的核心组件,被用于关键任务型分布式系统中,因为它可以优雅地处理网络分区导致的首领选举,并容忍机器故障。一个简单的用例是将数据库连接信息作为键值对保存在Etcd中。你可以监控这些值,在它们发生变更时,你的应用程序就可以使用新的值。Etcd现在成为CNCF的一个项目!

Docker

2006年,谷歌推出了cgroups,让你可以隔离进程,并限制其资源。2008年又推出了lxc,为内核模块带来了额外的功能。lxc用于命名空间,并限制进程可以看到哪些东西。

2013年,Docker发布了:它可以完成上述所有的工作,另外还提供了管道和工具来构建镜像和控制端口映射。

Docker用于容器化——操作系统级别的虚拟化。它是目前市场上最受欢迎的容器运行时,也是Kubernetes的核心组件。

使用Go语言开发的Ops工具

Helm

Helm是Kubernetes的包管理器,它是查找、共享和使用为Kubernetes开发的软件的最佳方式。Helm Charts可用于定义、安装和升级复杂的Kubernetes应用程序,它支持版本控制、共享和发布配置文件,不会让你迷失在意大利面式的代码中。

Grafana

Grafana是一个时间序列分析、监控和可视化平台。官方支持的一些数据源包括:Prometheus、InfluxDB和Elasticsearch。每个数据源都有一个根据其特性和功能定制的查询编辑器。每个数据源都绑定到一个面板,所有面板组合在一起构成一个仪表盘,可以控制时间段,也可以将时间序列数据与其他事件相关联。

Open Tracing Project

用于在分布式软件架构(例如微服务)中分析和监控应用程序,通过精确定位发生故障的位置来帮助调试复杂系统,并通过发现导致性能下降的原因来做出优化。

Open Tracing API项目正致力于创建更标准化的API和增强工具,它包含API规范、实现了规范的框架和库,以及项目文档。开发人员可以使用与厂商无关的API将增强添加到代码中。

Jaeger

Jaeger与Open Tracing兼容,是一种端到端的分布式跟踪,用于监控和排除复杂分布式系统中的事务。

Jaeger可用于分布式事务监控和上下文传播、性能和延迟优化、故障分析和服务依赖性分析。

Istio

一个服务网格框架,可配置的基础设施层,用于微服务架构。Istio使服务实例之间的通信变得更灵活、可靠、快速和安全。在将它添加到应用程序时,只需要为每个服务部署一个边车(代理),不需要更改应用程序代码!

它支持自动发现设备和服务、跟踪、监控、日志记录、平台可观察性、基于访问控制和身份验证的安全性、访问策略控制和流量控制。

CNCF

云原生计算基金会是上述很多项目的“大本营”。它是一个开源软件基金会,致力于推广云原生计算。该基金会构建了可持续发展的生态系统,并围绕一系列高质量的开源项目建立了一个社区,这些项目将容器作为微服务架构的一部分进行编排。

云原生计算使用开源软件将应用程序作为微服务来部署,将每个部分打包到容器中,并动态编排这些容器以优化资源利用。

Go语言为SRE带来的好处

简单地说就是:简单、可靠、快速。

使用Go语言——无论你在构建什么,专注于手头的工作,不要操心那些工具。

简单

这是部分支持的平台清单:

图片

可靠

快速

英文原文:https://blog.gopheracademy.com/advent-2018/go-devops/