2020s-的系统管理学习手册-二-

146 阅读35分钟

2020s 的系统管理学习手册(二)

原文:Linux System Administration for the 2020s

协议:CC BY-NC-SA 4.0

六、容器

这一章与前几章的方向略有不同。这将是我们讨论组织工作量以及如何管理该工作量的第一章。之前,我们讨论了平台、自动化和一般的 Linux 系统管理。在这一章的最后,我们将会更多地讨论平台,但是将会围绕本章的主题:容器展开。

本章将深入探讨集装箱化的世界,以及如何在其中管理工作负载。我们将讨论什么是容器,你如何开始使用它们,你应该做什么来管理它们,以及应该做什么和不应该做什么。最后,我们将结束这一章,讲述如何使用当今可用的工具来管理集装箱的全部资产。

本章的目标是帮助您对容器和用于管理它们的编排工具有一个基本的了解。

入门指南

作为一名 Linux 系统管理员,您很可能已经听说过容器;您可能已经在您的组织中使用它们了。

容器是 Linux 产业的下一个重大发展。作为一名 Linux 系统管理员,您必须完全了解它们是什么,它们是如何构建的,最重要的是,它们是如何管理的。

简而言之,容器是在它自己的隔离环境中管理的一个或多个进程和文件的集合。

虚拟机与容器

虚拟机是一个完整的操作系统,拥有自己的文件和资源,而容器是操作系统的一个独立部分,不仅拥有自己的二进制文件和文件,还与其主机操作系统共享库和二进制文件。容器是在被称为容器运行时的系统层之上创建和运行的(图 6-1 )。

图 6-1

演示虚拟机和容器所需的不同层

虚拟机和容器的区别如图 6-1 所示。

集装箱历史

容器的概念根本不是一个新概念,这个概念比 Linux 本身存在的时间还要长。容器在 20 世纪 70 年代末和 80 年代初开始了他们的概念之旅,首次引入了使用 chroot 来创建隔离环境。在 21 世纪早期,Solaris 和 FreeBSD 扩展了这一思想,实现了提供隔离的平台。

直到 Google 后来通过引入 Cgroups 引入了分离 CPU 和内存等资源的能力,容器世界才真正开始发展。有了 Cgroups 的概念,像 LXC (Linux 容器)和 systemd-nspawn 这样的公司可以创建他们自己的早期容器。LXC 着眼于创建完整的系统容器,其中 systemd-nspawn 可以管理命名空间进程并由 systemd 控制。两者都是容器的早期领导者。Docker 早期的大部分开发都基于 LXC,但后来放弃了 LXC,转而支持开始一个容器标准。这就是开放容器倡议(OCI)的诞生,并成为所有容器运行时的标准。

现在有许多容器运行时可以用来创建容器,这主要是因为所有的容器运行时都遵循这个标准。

容器运行时

容器运行时使得在您的系统上运行容器成为可能。容器运行时允许容器与主机内核对话并运行进程。

最初的容器运行时很简单,可以在隔离的环境中运行,但是随着时间的推移,这些运行时变得越来越复杂,需要多个层来管理复杂环境中的容器。为了理解当今创建和管理容器的完整流程,您需要了解容器运行时的三个类别:

  • 低级运行时或 OCI 运行时

  • 容器运行时接口

  • 集装箱发动机

低级或 OCI 运行时

使用容器时,最底层是 OCI 运行时。OCI 运行时主要关注容器生命周期。这是容器的基本创建和运行。

低级运行时有两种变体,本地的和“虚拟化的”

本机运行时

本地 OCI 运行时在运行 OCI 运行时的主机系统的同一个内核上运行它们的进程。

Note

由于主机与本机运行时共享其内核,因此人们担心受损的容器可能会影响运行它的主机。出于这个原因,您应该始终了解您可能构建到容器中的所有安全问题。

一些本地 OCI 运行时的例子是 runc、crun 和 containerd。

虚拟和沙盒运行时

与本机运行时不同,虚拟和沙盒运行时与主机内核更加隔离。

沙盒运行时

沙盒运行时创建了一个称为 unikernel 的代理层,它将请求代理到主机内核,减少了容器被破坏时可能出现的问题。截至本文撰写之时,可用的沙盒运行时是 gVisor 和 nabla-containers。

虚拟运行时

虚拟运行时不使用代理层,而是创建一个虚拟机来代替主机内核。这些运行时可能较慢,但提供了另一个强大的保护层。截至本文撰写之时,可用的虚拟运行时有 Katacontainers、Sysbox 和 bracket-container d 等。

容器运行时接口

随着容器工作负载的增长和 Kubernetes 等工具的发展,有必要摆脱内置于 kubelet 守护进程中的硬编码运行时。想法是创建一个新的接口,允许像 Kubernetes 这样的工具与任何容器运行时对话,而不需要在每次使用新的运行时重新编译 kubelets。这种新的接口允许更大的灵活性来切换出本地运行时。

CRI 需要能够做到以下几点:

  • 启动和停止窗格

  • 管理 pod 内的启动、停止和终止类型操作

  • 从容器注册表中提取和推送图像

  • 协助度量和日志检索

目前有两种主要的 CRI 选项能够完成上述步骤。它们是集装箱和 CRI-O。

包含在内

Containerd 是 Docker 用 runc 开发的一个高级运行时,它包含了 CRI 的所有功能,被认为是 CRI 的一个很好的例子。

把他养大

CRI-O 是一个更精简的 CRI 实现。Red Hat 目前支持将 CRI-O 集成到 Kubernetes 及其 OpenShift 产品中。Docker 被移除以支持迁移到 CRI 类型的架构,从而支持切换低级运行时的灵活性。

集装箱发动机

您需要理解的最后一类容器运行时是您可以实际创建一些容器的层。这一层是容器引擎。就像虚拟机需要虚拟机管理程序才能运行一样,容器需要容器引擎。

从“虚拟机与容器”一节的图表中,您可以看到容器引擎层在容器和操作系统之间的位置。这是集装箱发动机。

表 6-1 列出了目前使用的两种常见集装箱引擎;他们是多克和波德曼。在本章中,我们将使用 Podman 作为任何容器示例或练习的容器引擎。

表 6-1

容器引擎示例

|

工具名称

|

描述

| | --- | --- | | Docker | 发布于 2013 年 3 月。首批大量使用的容器运行时之一 | | Podman | 与 Docker 不同,Podman 不运行底层守护进程来运行容器 |

码头工人

今天,当我和人们谈论集装箱时,他们仍然经常称集装箱为“码头集装箱”Docker 是大多数人使用的第一个真正的容器引擎;许多人仍然在使用 Docker,并且仍然信赖它。

如果你是一个 Docker 或 Podman 的人,如果你只是在你的笔记本电脑或测试实验室使用它,这并没有太大的关系;最后,您想要做的就是基于图像创建一个容器。

然而,自从我第一次使用 Docker 以来,它已经变得有点难以安装了。过去,Docker 二进制文件可以与 dnf 或 yum 一起安装,但现在您可能需要启用单独的存储库或进行特殊订阅。如果你想选择 Docker,你需要阅读文档。

我已经使用以下命令在我的 Fedora 系统上安装了“Docker ”:

# dnf install docker -y

一旦安装了 Docker,您可能想要阅读关于如何使用 Docker 的手册页。

您需要了解如何启动容器,了解容器是否正在运行,以及完成后如何删除容器。表 6-2 列出了一些可以使用的 docker 参数选项。

表 6-2

Docker 帮助中的 Docker 示例选项

|

工具名称

|

描述

| | --- | --- | | start | 启动一个或多个停止的容器 | | stop | 拦住集装箱 | | ps | 列出正在运行的容器 | | attach | 将本地标准输入、输出和错误流附加到正在运行的容器 | | search | 在 Docker 注册表中搜索容器映像 | | history | 显示图像的历史 | | images | 显示所有已经提取到本地系统的图像 | | create | 创建新容器 | | build | 从 Dockerfile 文件构建映像 | | events | 从服务器获取实时事件 | | kill | 终止一个或多个正在运行的容器 | | rmi | 移除容器图像 |

托普曼

Podman 是在 Docker 之后出现的,在如何创建和管理容器方面与 Docker 相似。Podman 和 Docker 的一个主要区别是,Podman 不需要运行服务或守护程序。这是因为 Docker 运行在 runc 容器之上,而 Podman 不是。相反,波德曼直接使用 runc 容器。

所有 Docker 命令都应该与 Podman 一起工作;当您开始时,Podman 的帮助和手册页也将是一个很好的信息来源。

Podman 和 Docker 可以使用相同的图像和 Docker 文件,所以如果你找到任何 Docker 的例子,他们也应该和 Podman 一起工作。

安装 Podman 非常简单,只需为您的本地软件包管理系统运行 install 命令。对于 Fedora,安装 Podman 的命令是

# dnf install podman -y

要查看 Podman 的手册页,您可以运行

# man podman

如果手册页太长而无法阅读,而您只想开始阅读,请运行

# podman help

类似于 Docker,可以搜索图像,可以列出本地图像和容器。如果您有任何 docker 文件,您可以使用它们来构建自定义图像,最重要的是,您可以创建容器。

Podman 简单到足以让你摸不着头脑,在线上有大量 Podman 和 Docker 的例子。

如果你不熟悉码头工人或波德曼,不要太担心。我们将快速浏览一些实例,供您尝试。

容器图像

如果您要构建一个虚拟机,您需要在虚拟机管理程序中创建一个“虚拟机 Shell”,启动虚拟机,并安装操作系统。由于容器与操作系统共享库,它们通常不需要安装自己的操作系统。相反,容器映像是用容器运行其工作负载所需的文件和库创建的。

一个例子是将被用作 nginx web 服务器的容器映像。基本配置和库需要安装在映像中,因为不是所有运行容器运行时的主机都安装了 nginx。对于可能需要的任何应用服务器二进制文件,也是如此。

正是这种为应用程序传送二进制文件和文件的能力,真正允许容器完全可移植。在这一章中会有更多的介绍。

集装箱登记处

您可以想象容器图像变化会变得非常大;光是想想几个例子,你就能看到这个数字在增长。因此,存储这些图像以备后用非常重要。没有人会希望每次部署特定的工作负载时都创建新的映像。如果您有过构建应用服务器的经验,您会理解一些配置可能相当耗时。我不建议为每个新环境重复配置过程。

这就是容器注册变得有用的地方;它们不仅存储您为组织创建的自定义映像,还存储您可能拥有的特定工作负载的下载映像库。例如,您可以找到一个 php 容器映像,其中包含运行 php 应用程序所需的一切,而不是构建一个 php 映像。

您可以通过几种方式使用容器注册表。有云或互联网注册表,你可以从中提取你可能需要的图片。然后,您可以自定义这些映像,并将其推送到您的私有云存储库(如果您愿意),或者您也可以将它们推送到您的本地本地注册表。

云注册表

如果您要管理的资产不多,云注册表是处理图像的一个很好的方式。就像为您的资产中的少量系统构建资产管理平台没有意义一样,对于小型容器资产也是如此。如果您使用容器只是为了一些不经常改变的基本应用程序,那么将您的图像托管在云注册表中是非常合理的。

像 IBM 和 Google 这样的公司有云注册选项,可以让你托管你的容器映像。根据您的组织需求,Google 可能是一个不错的起点。他们提供 300 美元免费测试谷歌服务,包括注册表选项。审判结束后,当然会有一笔费用;就像评估遗产管理工具一样,你需要找出最适合你的方法。

本地注册表

如果您对容器映像存储有更深层次的需求,您可能希望考虑本地容器注册选项。可用的选项很大程度上取决于您需要的服务级别。这可能很简单,只是在一个断开的或有空气间隙的环境中有一个存储容器图像的地方,也可能更复杂,因为出于安全原因,您需要进行图像扫描。无论你的需求是什么,尝试和测试来确认什么适合你。

容器注册提供者

如果您需要一个容器注册表,有许多选项可供选择。就像我们在本书中讨论的大多数东西一样,有社区产品,也有企业产品。使用社区产品,您可以获得基本的功能,并且在大多数情况下还可以获得非常好的特性。借助企业产品,您可以获得安全性和合规性扫描的所有优势。

选择时,你需要再次考虑从价格到功能的一切。

实践中的集装箱

现在,理论上已经涵盖了容器的基础知识,让我们获得一些创建容器工作负载的实践经验。

先决条件

对于本书的这一部分,如果您希望测试将要讨论的一些配置,您需要准备好以下内容。

购物单
  • 具有 root 权限的 Linux 系统

  • 从 Linux 系统访问互联网

  • 安装软件包的能力

系统准备

在我们创建任何容器或配置之前,您需要准备您将使用的系统。

安装软件包

如果您不熟悉这个过程,请使用官方文档安装 Podman、Docker 或任何运行时包。在大多数情况下,这将像运行“dnf install podman -y”或“apt-get -y install podman”一样简单。

Docker 安装可能与 Podman 有点不同,因为您可能需要启用额外的存储库来获得所需的包。请查看官方文档以确定这一点。

Note

对于这一部分,我将使用波德曼;出于这个原因,使用 Podman 来避免额外的配置或谷歌搜索可能是值得的。

创建容器

在接下来的几页中,我们将介绍开始使用基本容器所需的基本实践经验。本节的目标不是让您成为容器专家,而是向您展示如何创建一个简单的容器环境来积累经验。

Warning

以下练习不适用于生产或实际环境。他们没有足够的弹性,会给你带来比他们的价值更多的问题。对于生产类型的环境,您将需要更多地关注容器编排工具。

拖动容器图像

在创建或运行容器之前,您需要从云注册中心获取一个基础映像,或者,如果您走在前面,从本地注册中心获取。

要从注册表中提取正确的映像,您应该知道容器工作负载将运行什么。容器会是 nginx 服务器吗?你打算运行一个 php 应用程序吗?还是你有完全不同的想法?

查找容器图像

一旦您知道您将运行什么类型的容器,您就可以搜索与您的预期工作负载非常相似的容器映像。如果您想找到一个 nginx 映像来运行一个基本的 web 服务器容器,您应该运行类似下面的内容:

#podman search nginx

输出将列出包含 nginx 关键字的所有可用图像。注意星星的数量,如果图片来自官方来源:

INDEX      NAME                     DESCRIPTION              STARS  OFFICIAL
docker.io  docker.io/library/nginx  Official build of Nginx.   15732  [OK]
...output reduced

拖动容器图像

从您使用 podman search 命令发现的可用容器映像列表中,您现在可以将映像提取或下载到您的本地系统。正是这个过程允许您在本地对任何想要运行的容器使用映像。

要从前面的搜索命令中提取容器图像,可以使用与下面非常相似的命令:

# podman pull docker.io/library/nginx

输出应该类似于以下内容:

#root@localhost ~]# podman pull docker.io/library/nginx
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob fca7e12d1754 [==============>-------] 20.6MiB / 25.4MiB
Copying blob 858292fd2e56 done
Copying blob 1c84ebdff681 done
Copying blob a4723e260b6f done
Copying blob b380bbd43752 done
Copying blob 745ab57616cb done

如果您需要将容器映像保存到另一个系统的便携式存储设备上,可以将其作为归档文件下载。

本地容器图像

要查看您下载了哪些容器映像,您可以运行类似下面的命令。这些映像可用于在本地系统上创建容器。

# podman images

输出应该类似于以下内容:

[root@localhost ~]# podman images
REPOSITORY                 TAG         IMAGE ID      CREATED        SIZE
docker.io/library/nginx    latest      87a94228f133  3 weeks ago    138 MB

运行容器

如果您找到了想要使用的容器映像,并且成功地下载或获取了它,那么您可以在您的测试系统上运行该映像的一个基本容器实例。要从以前下载的 nginx 映像运行基本的 nginx 容器,您可以运行类似于下面的命令:

[root@localhost ~]# podman run -d --name kentest -p 8080:80 nginx

输出将是创建的容器的 ID:

95bf289585a8caef7e9b9ae6bac0918e99aaac64d46b461180484c8dd1efa0a4

命令中的“-d”选项告诉 podman 从正在运行的容器中分离出来,让它在后台运行。“-p”设置容器将监听的端口。

运行容器

一旦创建了容器,您可能想看看它是否正在运行。最简单的方法是运行容器列表命令,如下所示:

[root@localhost ~]# podman container list
CONTAINER ID  IMAGE   COMMAND   CREATED  STATUS PORTS                NAMES
95bf289585a8  dock....  nginx...  7 sec...   Up     0.0.0.0:8080->80/tcp kentest

从这个列表中,您可以看到您已经设法在本地系统上启动的所有容器。nginx 示例运行在所有接口上,并监听端口 8080。

图 6-2 中的截图显示了 nginx 在本地主机的 8080 端口上服务请求。

图 6-2。

自定义图像和容器

既然我们知道了如何从在线映像注册中心下载和运行基本容器,我们就可以探索如何定制一个映像来承载您自己的工作负载。

创建一个波德曼图像注册表

在接下来的几节中创建的定制图像需要存储在本地注册表中。无需购买或支付任何在线服务来充当容器注册表,我们可以在您的本地系统上设置一个。为此,我们将创建一个基本的 podman 注册中心,并将我们的新图像推送到本地容器运行注册中心。

为要存储的数据创建目录
# mkdir -p /var/lib/registry

创建注册表容器

创建运行容器的命令如下:该命令包含一个“-v”参数,它告诉容器将一个目录从主机系统挂载到正在运行的容器。在这种情况下,这是为了在容器重启时帮助容器注册中心保留容器映像。

# podman run --privileged -d --name registry -p 5000:5000 -v /var/lib/registry:/var/lib/registry --restart=always registry:2

将 Podman 设置为使用不安全的注册表

因为容器注册中心通常希望是安全的,所以您需要告诉 podman 使用不安全的注册中心。您可以将您的注册中心配置为使用签名证书,但是您应该遵循 podman 文档。

要设置 podman 使用不安全的注册表,您需要编辑“/etc/containers/registries . conf”文件并找到“[registries . unsecured]”部分。在“[registries . unsecure]”部分下,找到“registries = [ ]”行,并将其更新为“registries = ['localhost:5000']”。

最后,在保存 registries.conf 文件后,您需要重新启动 podman 服务:

# systemctl restart podman

使用波德曼注册表

现在,有了上一节中配置的自己的本地 podman 注册表,您现在可以将自己的映像添加到注册表中进行保护。然后,在构建新的应用程序或映像时,您可以从自己的注册表中提取映像。

标记图像

当您下载了本地图像后,您需要做的第一件事是用您的内部 podman 注册表标记它们。这样,您可以指示 podman 将图像推送到本地注册中心,而不是远程注册中心。可以把它看作是改变容器图像路径的一种方式。

要标记图像,可以运行 podman tag 命令。如果我们以目前使用的 nginx 为例,我们可以用下面的命令标记 nginx 图像:

# podman tag docker.io/library/nginx localhost:5000/nginx

推送图像

标记好 nginx 映像后,下一步是将 nginx 映像推送到或上传到本地存储库。这可以通过以下命令完成:

# podman push localhost:5000/nginx

远程注册表

如果您在不同的主机上创建了一个 podman 注册表,并在网络接口而不是回送地址上公开了该注册表,如果您愿意,也可以标记您的映像并将其推送到该地址。只需确保打开所有防火墙端口,允许流量通过 podman 注册表。

这同样适用于任何内部映像注册表;只要您拥有推送图像的能力和权限,podman 标记和推送命令将允许您使用本地注册表。

自定义图像

到目前为止,我们所做的只是使用容器图像,而没有添加任何我们自己的定制。

没有任何内容的 web 服务器有什么用呢?容器图像也是如此;如果你不在 nginx 或 apache web 服务器上托管任何 web 内容,那么运行它们又有什么意义呢?

让我们来看看如何向 web 服务器添加我们自己的定制内容。

Dockerfile

为了理解如何向容器映像添加一些基本的定制,我们需要使用一个构建文件。这个构建文件通常被称为 Dockerfile 文件。Podman 和 Docker 都可以使用 Dockerfiles。

这些 docker 文件用于在容器映像中创建您想要的任何定制。将这些文件视为映像安装文件。

要使用 Dockerfile,您只需创建一个名为 Dockerfile 的新文件。不要更改名称或添加任何扩展名。该文件需要存在于当前目录中,或者您需要在运行 podman build 命令时指定位置。

例子

像以前一样,我们来看一个例子。对于本例,我们将构建一个安装了 apache httpd 的 CentOS 映像。一旦安装了 web 服务器包,该示例将从我的 GitHub 帐户中下载一个示例 HTML 文件。最后,我们将运行一个包含新图像的新容器。

下拉 CentOS 图像

在我们开始之前,您需要下载 CentOS 的一个版本:

# podman pull docker.io/library/centos

Dockerfile

接下来,您需要创建一个 Dockerfile 文件。请记住,Dockerfile 应该准确地命名为“Dockerfile”当您尝试构建新映像时,请确保您与 docker 文件在同一个目录中。

在我的例子中,Dockerfile 将获取它所能找到的最新的 CentOS 图像,如果您还没有获取的话。一旦映像可用,yum 将安装“httpd”和“git”包。这些将构成我们的自定义映像所需的所有包。随意添加任何你想用的东西,比如 PHP。一旦安装了这些包,git 克隆将下载我们的 web 内容的源代码,并将其移动到/var/www/html 目录供 web 服务器使用。在这个例子中,我写了一个非常基本的 HTML 页面。这可以是你想要的任何东西,所以如果你想尝试一些不同的东西,可以根据你自己的内容来改变。

下面是我用的 Dockerfile 的样子:

FROM centos:latest
RUN yum -y install httpd git; \
git clone https://github.com/kenhitchcock/basicwebapp.git; \
mv basicwebapp/index.html /var/www/html/index.html
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
EXPOSE 80

构建图像

要基于我们之前的 docker 文件构建映像,您需要确保与您的 docker 文件在同一个目录中,然后运行 podman build 命令:

# podman build -t centos .

Note

的“.”告诉 podman 命令使用当前目录。这就是为什么在运行 build 命令时,需要与 Dockerfile 在同一个目录中。构建的图像的名称可以是您想要的任何名称,只需更改“-t”参数后面的文本。此示例使用 CentOS 名称。

创建容器

使用新构建的容器映像和定制内容,我们可以运行并测试新映像:

# podman run  -p 80:80 -dit localhost/centos

Challenge

apache web 服务器的默认端口是 80。作为一项挑战,尝试找出如何定制您的 docker 文件以使用不同的端口。

确认容器正在运行

要仔细检查您的容器是否已经实际启动,您可以运行以下命令:

# podman ps

输出应该类似于以下内容:

# podman ps
CONTAINER ID   IMAGE                      COMMAND               CREATED       STATUS             PORTS               NAMES
08832f29f46e   localhost/centos:latest    /usr/sbin/httpd -...  24 hours ago  Up 12 minutes ago  0.0.0.0:80->80/tcp  elated_jepsen

删除容器

要删除容器,首先需要停止容器,然后才能删除它。这可以通过类似于下面的命令来完成:

# podman stop 08832f29f46e
# podman rm 08832f29f46e

输出应该类似于

# podman rm 08832f29f46e
08832f29f46edab6bdd41227a542bf494f926831d099a0a83ee8838bfe71fdf9

集装箱业务

随着对什么是容器以及如何管理它们有了更好的理解,您现在需要理解什么是好的和坏的实践。

云原生

在处理容器化工作负载时,您需要理解的第一件事是云原生意味着什么。

对云原生的最简单解释是,它是使用云技术以轻量级和快速的方式部署工作负载的实践。

云原生工具通常涉及在私有或公共云中使用自动化、可扩展的平台、容器、服务网格,并且通常具有不可变的基础设施。使用这些工具和许多其他工具可以实现高速度的产品工作负载发布。网飞就是一个很好的例子。网飞每天发布大约 100 个生产版本,通过使用自动化和其他工具将轻量级、快速的工作负载简化到生产中。

良好做法

保持小规模

运行任何容器或云原生工作负载的首要规则是保持工作负载尽可能小。不建议创建千兆字节大小范围内的工作负载。工作负载越小,部署和可伸缩性就越好。如果您的工作负载需要更高的规模,那么您可能需要重新设计工作负载的编写方式。这可能是将工作负载分解为微服务,并从那里开始工作。

如果您被迫创建大型工作负载部署,请始终向后推。从长远来看,运行较小工作负载的好处是值得的。

动态部署

永远不要手动部署工作负载。代码应该提交到您的源代码控制中,并推向生产。利用管道工具、源代码控制 webhooks 和任何其他可以触发工作负载部署的工具。

在图 6-3 中可以看到这样一个基本示例。

图 6-3。

可攀登的

任何将部署在云类型环境中或被视为云原生的工作负载或应用程序都必须是可扩展的。当需求增加时,扩展能力对于良好的云工作实践至关重要。如果您正在部署的工作负载不能动态扩展,您需要考虑重新架构工作负载。无法动态扩展是过时工作负载和潜在旧代码的症状。

“会云吗”?

仅仅因为您正在部署到云平台中,并不意味着您的工作负载是云本地的。还有许多其他事情可以使工作负载成为云本地的,但是当您想知道您的工作负载是否是针对云的时,您应该问的三个问题是

  • 工作量小吗?

  • 工作负载可以扩展吗?

  • 工作负载可以动态部署吗?

带着前面的问题,你现在可以问自己,“它会云吗”?如果您对任何一个问题的回答都是否定的,那么在有效地迁移或部署到云环境之前,您还有很多工作要做。

不要试图将虚拟机构建到容器或云原生风格的超大规模服务器中,以免落入陷阱。仅仅因为你能并不总是意味着你应该。当你不能利用云计算的优势时,这样做的陷阱会回来咬你。大型工作负载可能会导致效率低下和浪费,抵消您可能期望的成本节约。

如果您需要大型工作负载,那么容器或云平台可能不是您现在需要的。后退一步,首先仔细观察工作负载,重构代码,将整体分解成更小的应用程序,这些应用程序可以按照云的意图“云”。

不良做法

有很多好的做法,也有很多不好的做法。这些被称为反模式。这里有几个应该尽可能避免的常见做法。

容器不是虚拟机

容器与虚拟机不同,不应被同等对待。容器是一个只有一个用途的简化实体。这种实践确保云原则保持不变。如果您试图复制虚拟机所做的事情,那么您可能还没有准备好使用容器。

不同的图像

诱惑可能是对不同的环境使用不同的映像,因为这似乎是构建工作负载映像的更安全的方法。但是,构建用于测试的测试映像、用于开发的开发映像和用于生产的生产映像可能会出现未经测试和签署的差异。测试环境中使用的映像很可能没有漏洞,但生产环境中使用的映像却有。因此,在您的环境中迁移应用程序烘焙的映像。通过这种方式,您可以确保安全检查已经完成,代码已经过适当的测试,并且最重要的是,已经签字同意投入生产使用(图 6-4 )。

图 6-4。

关于如何测试和提升图像的基本想法应该类似于图 6-4 。

从代码构建产品

这一点和上一点类似。不要将容器映像直接投入生产。您的映像应该在开发中构建,然后通过不同的登台环境进行提升。您最终可能会遇到不同代码被部署到不同系统的情况。拥有一个从中央映像注册表进入生产环境的单一入口点将大大降低发生这种情况的风险。您还可以确信测试的代码就是部署的代码。

核心秘密或配置

应用程序应该不知道平台配置或秘密。硬编码的需求应该是应用程序不是云原生的警钟。配置和机密应该由将要部署应用程序的平台来管理;其他任何事情通常都被认为是不好的做法和潜在的安全风险。

构建幂等容器

构建容器应该是一个幂等的过程。您的 docker 文件不应该试图对它正在构建的映像进行外部更改。不应提交任何代码或推送任何外部更改。简单地说,容器构建应该遵循类似于图 6-5 的流程。

图 6-5。

构建容器映像应该只关注容器运行所需的内容。流程应该如图 6-5 所示一样简单。

集装箱发展

到目前为止,在这一章中,我们已经简单地介绍了如何开发容器。我们探讨了一些简单的好的和坏的实践,希望能让您对什么是原生云有一个好的了解。对于本节,让我们了解如何使用容器开发来创建有意义的工作负载。

发展考虑

编码语言

为容器编写代码与为本地开发环境或笔记本电脑编写代码没有什么不同。您仍然可以选择和使用您喜欢的开发语言,并且仍然可以将代码推送到您喜欢的源代码控制平台。没有硬性规定说你不能使用某一种语言。然而,并不是所有的开发语言都是一样的。使用旧语言可能不会像新语言那样有效地转换到云中。在开始编写任何新的应用程序之前,花些时间看看下面的一些选项。表 6-3 列出了目前在容器化应用中使用的一些开发语言选项。

表 6-3

开发语言或框架

|

语言名

|

描述

| | --- | --- | | Quarkus | 针对云环境优化的 API Java 框架 | | React | 用于 UI 开发的 Java 框架 | | Python, Ruby | 通用高级编程语言 | | Golang | 快速而强大,通常用于物联网设备 | | .Net | 如果你需要坚持使用基于微软的语言 |

代码编辑器

要编写有用的代码,你需要练习,并且拥有一个足够好的编辑器,而不会倾家荡产。有几个可供你使用,但它总是归结为个人喜好和你愿意生活中没有什么功能。表 6-4 列出了一些可以使用的代码编辑器选项。

表 6-4

代码编辑器

|

工具名称

|

描述

| | --- | --- | | VSCode | 免费使用,简单易懂,并有一个伟大的插件和附加选择 | | Eclipse | 强大的编辑器,能够添加应用服务器进行代码测试。通常是一个 Java 开发工具 | | NetBeans | 另一个 Java 编辑器 | | Notepad++ | 比标准文本编辑器更高级,当您选择有限时,这是一个有用的选择 | | Vim | 并不总是安装在 Linux 系统上,但是可以用来开发代码。插件可以安装,但往往比 GUI 选项更受限制 | | Nano, Emacs | 可以使用更多的命令行编辑器,但是缺少 GUI 工具提供的丰富特性 |

Tip

VSCode 可以免费使用,有很棒的插件,而且使用起来非常简单。在你花太多时间在其他编辑器上之前,试试 VSCode,如果发现更好的就改。

源代码管理

不管你希望使用哪种源代码控制平台,只要确保你使用一个就行了。不使用源代码控制对于任何开发人员或组织来说都是一个巨大的错误。您失去了以有效的集中方式对代码进行同行评审的能力,并且您面临着代码丢失的风险。不值得冒这个险。表 6-5 列出了可用于控制源代码的源代码控制选项。

表 6-5

源代码管理选项

|

工具名称

|

描述

| | --- | --- | | Git | 基本 git 可以部署在任何 Linux 系统上;代码可以被推和拉 | | GitHub | 基于互联网的 Git 源代码控制平台 | | GitLab | 类似于 GitHub,只是您可以在内部运行自己的 GitLab | | Bitbucket | 另一个可以在内部运行的 Git 产品 | | Subversion | Git 之前流行的选项,目前正在失去流行性 | | Mercurial | 处理各种规模的项目,这是一项免费的分布式控制管理服务 | | Microsoft Team Foundation Server | 微软开发的源代码控制系统 |

Note

Git 可能是当今最流行的源代码控制系统。尽快熟悉它。

集装箱加工

一旦您开发了代码并且有了容器的想法,您将想要开始简化您的容器映像创建。有很多方法可以做到这一点,既有正确的,也有不那么正确的。您还将有相当多的工具可供选择。

CI/CD

首先要研究的领域是您的集装箱运输系统。这就是所谓的持续集成和持续交付系统。这些将有助于将您的工作负载部署到您的各种环境中,并使您能够灵活地利用您的容器映像或工作负载部署做更多的事情。表 6-6 列出了 CI/CD 管道的一些可用选项。

表 6-6

CI/CD 选项

|

工具名称

|

描述

| | --- | --- | | Jenkins | 流行的免费开源工具,易于使用,有很多插件选项 | | TeamCity | 与 Visual Studio 集成,对 Windows 开发和测试很有用。有免费和专有选项 | | GitLab | 能够直接从 GitLab 存储库构建和运行任务 | | Travis CI | 可以自动检测 GitHub 中的提交,并在托管的 Travis CI 平台上运行测试 | | Tekton | 另一个开源 CI/CD 工具,支持跨不同云或本地平台的部署 |

Jenkins 示例

Jenkins 是当今最流行的流水线工具之一,可以免费用于测试。要了解 Jenkins 管道代码的样子,下面是一个使用伪代码的基本示例:

node {
    def app

    stage('Clone repository') {
        /* Basic comment about cloning code*/
        checkout scm
    }

    stage('Build image') {
        /* Build your container image */
        app = docker.build("jenkinsproject/helloworld")
    }

    stage('Test image') {
        /* Run your unit testing of some type */
        app.inside {
            sh 'echo "Tests passed"'
        }
    }

    stage('Push image') {
        /* With a verified image, push your image to a registry */
        docker.withRegistry('https://someregistry.com', 'registry-credentials') {
            app.push("${env.BUILD_NUMBER}")
            app.push("latest")
        }
    }
}

从这个 Jenkins 示例中,您可以看到在管道中使用了阶段;您可以为不同的任务添加任意多的任务。例如,您可能希望添加一个安全图像扫描阶段。理想情况下,您希望构建尽可能多的自动化和测试。

Challenge

作为一个学习挑战,在您的沙盒环境或笔记本电脑上部署一个 Jenkins 容器。看看您是否可以编写自己的定制 Jenkins 文件来构建一个新的容器映像,该映像是由 git 中更新的源代码触发的。

专门的映像构建者

利用非 Docker 组件构建容器映像。像 Buildah ( https://buildah.io/ )和 Kaniko ( https://github.com/GoogleContainerTools/kaniko )这样的工具更安全,因为它们在用户空间的 docker 文件中运行每个命令。Buildah 和 Kaniko 都不需要运行 Docker 守护进程来构建映像。

图像注册表

当您开发应用程序和容器内容时,您将需要一个地方来存储这些图像。如果您想在需要时进行测试和构建,这是可以的,但是作为一个良好的实践,建议您在开始构建应用程序组合时就开始存储容器映像。如果您打算将任何东西部署到一个真实的环境中,那么强烈推荐这种做法。

在本章前面,我们讨论了如何建立一个波德曼图像注册表;为了扩展这一点,考虑提供存储以确保您的容器不是短暂的。例如,波德曼有能力创建卷;当您创建这些卷时,可以将它们装入您的容器中。

使用像 OpenShift 或 Kubernetes 这样的编排平台可以提供图像注册,但默认情况下通常是短暂的。确保装载了存储卷,以免丢失任何映像。

开发编辑器插件

使用您选择的开发编辑器,查找并安装有助于容器开发调试的插件。可以帮助 Dockerfile 或 Jenkinsfile 创建的插件肯定会对你有所帮助。

Tip

如果您需要免费且易于使用的东西,VSCode 是一个很好的选择。总的来说,对我来说这是一个赢家,但你自己测试一下。

林挺工具

在推送或提交任何类型的代码之前,无论是 YAML 还是 Dockerfiles,都要使用林挺工具。对于 Dockerfiles,有一个很好的在线林挺工具,你可以复制并粘贴你的 docker files 内容进行检查。

www.fromlatest.io/#/

DevSecOps

当今平台管理领域的一个关键词是 DevOps。DevOps 是一套重要的实践和工具,它在开发人员和运营团队之间架起了一座桥梁。DevSecOps 是对这一概念的补充,其中每个人都对安全负责。

DevSecOps 工具

DevSecOps 使开发人员和操作团队能够理解安全性需求,并将安全性构建到他们的工具中。

管道

在没有使用 DevOps 或 DevSecOps 实践的标准情况下,安全团队需要在每次构建新系统或平台时扫描并报告问题。安全团队负责组织的安全,如果发生违规事件,他们必须回答一些棘手的问题。因此,他们在扫描时非常小心,确保在真实环境中不会暴露任何漏洞。此过程可能涉及额外的安全工具,可能需要一段时间才能完成。如果新的平台或系统不断发布,这也可能是一项令人沮丧的工作。

通过遵循 DevSecOps 实践,可以将安全性考虑因素构建到管道或映像构建工具中。有了这个过程,开发人员和运营团队负责安全,从而大大减少了与安全团队的来回奔波。

安全门

借助 Jenkins 等管道工具中内置的安全性,可以构建安全门,如果某个映像由于某种原因未能通过安全扫描,可以停止构建过程,从而在发布到实际环境之前进行补救。

GitOps

当今庄园管理和容器平台管理的另一个关键词是 GitOps。

“GitOps 是一个运营框架,采用了用于应用程序开发的 DevOps 最佳实践,如版本控制、协作、合规性和 CI/CD 工具,并将它们应用于基础架构自动化。”

https://about.gitlab.com/topics/gitops/

GitOps 工具箱

下面是一些有用的工具,可以帮助你学习 GitOps。您可以使用许多其他工具和变体,但是由于这个主题可以单独作为一本书的主题,所以我只提到了几个。

饭桶

使用 GitOps 的第一步是开始使用 Git。这可以是 GitLab、Bitbucket 或 GitHub,任何允许 CI/CD 管道检测合并请求的 Git 平台。

基础设施作为代码

然而,从技术上讲,它不是一个工具,你为自动化或配置你的平台所写的一切都应该是代码的形式。这可能是 YAML 为您的 OpenShift 或 Kubernetes 配置或 Ansible 建立一个新系统。一切都应该从代码中构建或配置;任何地方都不应使用手动配置。

管道工具

选择管道工具,并将其配置为在 git 环境中检测合并或拉取请求。每次进行新的更改时,都应该启动管道来构建或部署新的应用程序版本或构建新的系统。

阿尔古德

另一个越来越常用的 GitOps 工具是 ArgoCD。ArgoCD 有助于 GitOps 工作流,可用作独立工具或 CI/CD 管道的一部分。

在配置 OpenShift 或其他 Kubernetes 变体时,ArgoCD 与 Git 一起充当“事实的来源”。维护容器编排平台的状态很有用。这与 SaltStack 等资产管理工具如何维护其管理的资产中的系统状态非常相似。

ArgoCD 通过 pull 或 merge 请求的方式关注任何配置文件的更改,从而与 Git 协同工作。当 Git 中合并了一个变更时,ArgoCD 会提取新的配置,并配置该配置所针对的平台(图 6-6 )。

图 6-6。

图 6-6 显示了 ArgoCD 配置应采用的基本流程。

容器编排

在定期部署应用程序的环境中,几个容器可能会迅速增加到数百个甚至数千个。为了管理这种增长,对容器编排的需求变得更加重要。Kubernetes、Docker Swarm 和 OpenShift 等工具为管理员提供了管理大量容器工作负载并确保其可用性的能力。每种工具都有自己的优点和缺点,可能需要花更多的章节来详细讨论;然而,由于我们目前并没有过多地关注容器编排,所以现在让我们只涉及一些基础知识。

它是做什么的?

容器编排是在最终用户使用容器之前必须存在于容器之上的层。一个好的容器编排工具应该具有以下特性:

  • 可攀登的

  • 灵活的

  • 安全的

  • 自动化的

  • 使用方便

这些属性确保容器工作负载能够得到有效和安全的管理,能够插入到 CI/CD 系统中,并具有动态更新的内容。

为什么不用波德曼?

例如,使用像 Podman 这样的东西来托管一系列 pod 和 Kubernetes 之间的区别在于,Podman 不能让您监控性能和调整 pod 的数量来自动处理额外的负载。

Podman 不具备为特定工作负载在不同节点之间创建隔离网络的灵活性。

由 Kubernetes 或 OpenShift 等编排层提供的所有这些更高级别的配置和自动化服务都是针对大型资产部署的。波德曼有能力容纳大量内部装有许多容器的容器,但缺乏大规模管理这些容器的能力。添加更多的节点和连接 pod 网络将被证明更加复杂,并且会破坏容器编排层易于使用的目的。

Podman 适用于本地或小型部署,但不适用于大规模部署。你可以开发自己的包装工具来管理 Podman,但是你只是在重复发明轮子。最好的办法是投入时间使用 Kubernetes 或其他企业产品,如 OpenShift,如果你能得到它的话。如果不行,你还可以使用名为 OKD 的社区产品。

业务流程选项

忽必烈忽必烈忽必烈忽必烈忽必烈忽必烈忽必烈忽必烈忽必烈忽必烈

Kubernetes,或 K8s,是一个开源项目,最初由 Google 开发,基于他们最初的“Borg”系统(集群管理器系统)。

红帽是 Kubernetes 正式上线前的首批贡献者之一。

2015 年,谷歌向 CNCF(云原生计算基金会)捐赠了 Kubernetes 项目。

库伯内斯·福克斯

由于 Kubernetes 是开源的,今天有许多 Kubernetes 的下游版本,如 Red Hat 的 OpenShift,VMware 版本的 Kubernetes,以及许多云平台,如 AWS 和 Azure,它们提供自己的托管服务。

这些云托管服务允许终端用户部署其容器工作负载,而无需构建自己的编排平台或管理任何与之相关的系统。用户注册一个帐户,获得分配的资源,并部署工作负载。

OpenShift 和 Kubernetes 可以部署在云中和本地,它们需要安装、配置和管理。如果您需要部署非常大的资产,并且乐于自己完成所有管理工作,这将非常有用。

主组件

Kubernetes 有一些基本的集群组件,使它能够为 pod 和其中的容器提供编排。

控制平面

控制平面由以下部分组成:

  • 存储所有集群配置的 ETCD 键值数据库

  • 通过 JSON over http 提供 Kubernetes API 的 API 服务器

  • 负责调度节点上工作负载的调度程序

  • 控制器管理器用于管理不同的 Kubernetes 控制器

控制平面由一群主节点提供;这些节点在它们之间复制配置,以确保控制继续提供群集功能。

节点

节点是 Kubernetes 集群的工人。他们负责托管用户部署的容器工作负载。节点由几个子组件组成:

  • Kubelet 确保节点的状态和运行在其上的容器的健康。

  • Kube-proxy 负责将流量路由到您的容器。

  • 容器运行时。

命名空间

名称空间旨在提供一种方法来隔离一个 Kubernetes 集群,以便多个用户可以部署工作负载,而无需相互通信。

达蒙塞特

通常,调度程序负责将 pod 放在资源可用的节点上,以确保不会只有一个节点过载。然而,当您需要强制一个 pod 在每个节点上运行时,可以使用 Daemonsets。日志容器通常就是这种情况。

工作节点组件

工作负载对象是在工作节点上部署和使用的对象。如果不是所有工作节点,也是大多数工作节点都使用以下内容。

分离舱

集装箱在吊舱中运行;这些豆荚是在工作者节点上产生的。通常,一个容器在一个 pod 中运行,但是这并不是一个硬性的规则。

服务

服务是将同一应用程序的多个单元绑定在一起的东西。当不同的工作节点上产生多个 pod 时,您需要平衡它们之间的流量。服务是提供该“服务”的层

默认情况下,所有容器都是短暂的,这意味着在 pod 重新启动或重新创建后,它们无法存储数据。通过将卷或永久卷安装到 pod,您可以从以前销毁或重启的 pod 中恢复任何数据。

配置映射

在容器中,有时需要配置配置文件。例如,web 服务器可能需要配置有关其托管的网站的详细信息。Configmaps 使您能够将配置从容器映像抽象到编排平台。当使用 configmap 部署 pod 时,将在部署阶段应用配置,类似于使用 Dockerfiles 配置容器映像的方式。

openshift(打开 hift)

OpenShift 之前是 OpenShift,是一家叫 Makara 的公司的 PaaS 产品。Red Hat 在 2010 年收购了 Makara 的 PaaS 平台,该平台在当时是基于 Linux 容器技术的专利。

早期开班

在 OpenShift 3.0 之前,Red Hat PaaS 平台是专有的和定制开发的。收购后,Red Hat 花了两年时间发布了第一个开源版本,然后又花了三年时间从定制平台转向当时更“成熟”的 Kubernetes。

OpenShift 3.0 是 Red Hat 首次将 Docker 用于容器运行时,将 Kubernetes 用于编排层。

OpenShift 3.11 是 OpenShift 3 的最后一个次要版本,也是 Docker 用作容器运行时的最后一个版本。

当前 OpenShift

Red Hat 目前有 OpenShift 4.9 可供公众使用。“硬编码”Docker 的分离已经允许 OpenShift 4.x 转移到容器运行时接口方法,在该方法中可以使用任何低级容器运行时。

OpenShift 已经发展成熟,成为企业的领先容器编排平台,因此已经成为许多组织的头号容器编排产品。Red Hat 的持续投资继续增长 OpenShift 新功能和收购。

高级集群安全性(StackRox)、高级集群管理、监控、日志记录和许多其他企业级功能使 OpenShift 成为任何大型混合云组织的首选产品。

OpenShift 组件

由于 OpenShift 是基于 Kubernetes 的,所以大多数组件都非常相似,并且以非常相似的方式命名。当然也有一些变化,比如 Kubernetes 中的名称空间在 OpenShift 中被称为项目。Kubernetes 的 kube 命令是 OpenShift 的“oc”命令,但最重要的是,以下是一些主要的区别。

产品

OpenShift 是一个产品,不是 Kubernetes 那样的项目。Kubernetes 是一个任何人都可以参与的社区项目。如果 Red Hat 认为这些变化有用的话,它们会进入 OpenShift。

企业

企业与社区的争论再次强调,OpenShift 是一个企业产品,而 Kubernetes 是一个社区项目。像 Google 这样的公司提供付费的企业支持选项,但是仍然基于社区项目。

安全

OpenShift 的构建考虑到了安全性,为安全性意识更强的组织提供了采用机会。最近对 StackRox 的收购进一步强化了这一观点。

Web 控制台

OpenShift 默认有一个 web 控制台。Kubernetes 要求您单独部署它,并让集群 kube-proxy 将流量导向控制台。

更多的

虽然没有列出所有的差异,但 Red Hat OpenShift 在 Kubernetes 上还提供了其他功能,如图像管理和企业存储解决方案。如果你感兴趣,你应该按照本书中推荐的大多数产品去做。建立一个概念证明,并自己比较不同之处。

摘要

在本章中,向您介绍了以下内容:

  • 概述什么是容器,它们的运行时,如何构建容器,以及如何定制容器

  • 容器的一些实际用途以及如何创建本地容器注册表

  • 云原生意味着什么以及使用容器的各种好的和坏的实践

  • 不同的容器工具以及 DevSecOps 和 GitOps 实践

  • 容器编排以及可供您使用的选项

七、监控

任何新的 Linux 系统在被贵组织的生产或现场环境接受之前,必须具备哪些最重要的特性?给出的常见答案是监控、日志记录和安全性。同样有充分理由的是,任何没有被监控、记录或保护的系统都只会导致灾难,并且几乎在每一种情况下都会被任何严肃的运营团队拒绝。

本章将深入探讨 Linux 系统应该具备的首要功能之一:监控。我们将讨论过去使用过的工具,以及大多数 Linux 发行版都有哪些现成的工具。然后,我们将看看过去五年中使用的一些更新的工具和趋势。

最后,我们将从监控的角度讨论开发人员和应用程序的要求,如何更好地监控应用程序,以及如何与开发人员讨论如何开发应用程序来支持这一点。本章不会给出所有不同监控用例的所有答案。它将告诉您可以做些什么,以及哪些工具可以帮助您解决当前的一些监控问题。它甚至会产生一些你没有意识到你需要问的问题。

Linux 监控工具

几乎从 Linux 出现开始,就有工具可以监控系统上发生的事情。这些工具可以像“top”命令一样简单,也可以像使用 systemtap 一样复杂,以了解当一个新设备添加到您的系统中时内核正在做什么。

一旦你知道了如何使用 Linux 系统的基本知识,下一个合乎逻辑的步骤应该是知道如何确认你的系统是健康的,以及如何确保它保持健康。为此,有许多不同的工具可以显示您的系统状态。

程序控制

默认过程命令,ps 和 top

默认情况下,在大多数(如果不是全部的话)Linux 发行版上,您会发现“top”和“ps”命令。它们不仅向您显示系统上运行的所有进程,还会给您进程 ID 号,该 ID 号可用于终止已失效或挂起的进程。

如果您不确定某个特定的进程是否正在运行,例如 apache web 服务,您可以运行类似下面的命令:

# ps -ef | grep httpd

也可以使用“top”或其他命令,但是您可能很难在列表中搜索您的流程。使用“ps”和“grep”将使输出更快更清晰。

Note

在第二章中,我们看了“top”和其他一些工具,它们可以用来查找系统中正在运行的进程。我们还讨论了如何杀死进程以及如何识别僵尸进程。

查看进程

查看所有进程和每个进程的父进程的一个快速而好的工具是“pstree”命令。以下是 pstree 的基本输出,但输出有所减少:

# pstree
systemd─┬─ModemManager───3*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─abrt-dbus───2*[{abrt-dbus}]
        ├─3*[abrt-dump-journ]
        ├─abrtd───2*[{abrtd}]
        ... [reduced for length]
        ├─thermald───{thermald}
        ├─udisksd───4*[{udisksd}]
        ├─upowerd───2*[{upowerd}]
        ├─uresourced───2*[{uresourced}]
        └─wpa_supplicant

资源密集型流程

“ps”命令有用还有另一个原因。我相信你经历过一个占用大量 CPU 或内存的过程。如果您试图弄清楚进程是如何从“top”或类似的命令中消耗资源的,那么发现有问题的进程有时会有点棘手。以下是两个“ps”命令,您可以使用它们来查找前五个 CPU 和内存密集型进程。

内存密集型进程
# ps -auxf | sort -nr -k 4 | head -5

CPU 密集型进程
# ps -auxf | sort -nr -k 3 | head -5

Tip

有关使用 ps 的更多选项,请查看 ps 帮助和 ps 手册页。

磁盘和 IO

可能会出现磁盘性能缓慢或磁盘已满的情况。一些可以用于磁盘和 IO 监控的有用工具现在仍在使用,如"iostat、" "iotop、" "du、"df"

iostat 和 iotop

iostat”和“iotop”是提供输入输出系统信息的基本工具:

# iostat
Linux 5.13.4-200.fc34.x86_64 (localhost.localdomain)       22/11/21      _x86_64_       (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          28.17    0.06   12.21    0.11    0.00   59.46

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
dm-0              1.16         1.79        59.42        24.16   16712024  554638596  225476964
nvme0n1           1.15         1.79        59.43        24.24   16724756  554741532  226295700
zram0             0.20         0.16         0.64         0.00    1482776    6013392          0

# iotop
Total DISK READ:         0.00 B/s | Total DISK WRITE:    108.61 K/s
Current DISK READ:       0.00 B/s | Current DISK WRITE:    3.19 K/s
    TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
 733973 be/4 ken         0.00 B/s   57.50 K/s  0.00 %  0.00 % chrome --type=utility --utility-sub-type=network.mojom.NetworkService --field-trial-han~be2ad25, --shared-files=v8_context_snapshot_data:100 --enable-crashpad [ThreadPoolForeg]
 729143 be/4 root        0.00 B/s   51.11 K/s  0.00 %  0.00 % [kworker/u8:6-btrfs-endio-write]
      1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd rhgb --system --deserialize 51
      2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
      3 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_gp]
      4 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_par_gp]

杜和 df

这些用于显示磁盘使用情况和磁盘安装位置:

# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs         12G     0   12G   0% /dev
tmpfs            12G  181M   12G   2% /dev/shm
tmpfs           4.7G  2.0M  4.7G   1% /run
/dev/dm-0       238G   93G  144G  40% /
tmpfs            12G   61M   12G   1% /tmp
/dev/dm-0       238G   93G  144G  40% /home
/dev/nvme0n1p1  976M  272M  638M  30% /boot
tmpfs           2.4G  216K  2.4G   1% /run/user/1000

# du -h /etc
0       /etc/.java/.systemPrefs
8.0K    /etc/.java/deployment
8.0K    /etc/.java
0       /etc/NetworkManager/conf.d
0       /etc/NetworkManager/dispatcher.d/no-wait.d
0       /etc/NetworkManager/dispatcher.d/pre-down.d
0       /etc/NetworkManager/dispatcher.d/pre-up.d
0       /etc/NetworkManager/dispatcher.d
0       /etc/NetworkManager/dnsmasq-shared.d
0       /etc/NetworkManager/dnsmasq.d
28K     /etc/NetworkManager/system-connections
32K     /etc/NetworkManager
... [reduced for length]
80K     /etc/gimp/2.0
80K     /etc/gimp
28K    /etc/pcp/derived
28K    /etc/pcp
37M    /etc/

中央处理器

可以使用发行版附带的许多工具和可以很容易安装的工具来检查系统上的 CPU 统计数据。下面是两个比较常用的工具。

顶端

大多数 Linux 系统管理员会使用 top 命令并按“1”键。这将产生类似于以下内容的输出:

top - 23:56:10 up 108 days,  1:38,  1 user,  load average: 1.31, 1.73, 1.54
Tasks: 373 total,   2 running, 370 sleeping,   0 stopped,   1 zombie
%Cpu0  : 10.0 us,  2.3 sy,  0.0 ni, 87.0 id,  0.0 wa,  0.3 hi,  0.3 si,  0.0 st
%Cpu1  :  6.6 us,  7.9 sy,  0.0 ni, 83.8 id,  0.0 wa,  1.0 hi,  0.7 si,  0.0 st
%Cpu2  : 10.7 us,  3.3 sy,  0.0 ni, 85.3 id,  0.0 wa,  0.3 hi,  0.3 si,  0.0 st
%Cpu3  : 10.3 us,  3.6 sy,  0.0 ni, 83.4 id,  0.3 wa,  2.0 hi,  0.3 si,  0.0 st
MiB Mem :  23679.7 total,   3091.2 free,  13131.6 used,   7456.8 buff/cache
MiB Swap:   8192.0 total,   6207.6 free,   1984.4 used.   8940.7 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   2021 ken       20   0 1448452 123008  73736 S  18.2   0.5 252:05.89 Xorg
 728039 ken       20   0  749048  52472  36696 S   6.9   0.2   6:54.61 gnome-system-mo

从前面的输出中,您可以看到我的笔记本电脑中有四个内核。可以看到平均负载大约为 1.33,这意味着我的四个 CPU 中大约有 1.33 个正在用于运行进程。

系统的工具

另一个有用的 CPU 统计命令是 mpstat 命令。“mpstat”命令显示每个可用 CPU 的活动。

要查看每个 CPU 的所有统计信息,可以运行以下命令:

# mpstat -P ALL

记忆

检查系统内存的一些方法包括查看/proc/meminfo 文件或运行类似“free”或“top”的命令。以下是您可以在系统上做的一些事情,以便更好地了解它的内存。

自由的

提供系统内存所需的所有信息的基本实用程序:

# free -h
        total    used    free   shared   buff/cache   available
Mem:     23Gi    12Gi   3.2Gi    1.2Gi        7.2Gi       8.8Gi
Swap:   8.0Gi   1.9Gi   6.1Gi

页面大小

如果您需要了解系统的页面大小,可以使用以下命令:

# getconf PAGESIZE

巨大的页面尺寸

在进行应用服务器调整时,可能会要求您启用或检查是否启用了大页面调整。您可以在/proc/meminfo 文件中检查这一点:

# cat /proc/meminfo |grep Hugepage
Hugepagesize:       2048 kB

最不发达国家

另一个有用的工具是“pmap”实用程序。"pmap"报告一个进程的内存映射。pmap“可以很有用的找到内存瓶颈的原因。

虚拟内存

偶尔确实会发生需要研究虚拟内存或 slabinfo 相关问题的情况。“vmstat”工具对于这种调查很有用。

显示虚拟内存状态

可以运行 vmstat 工具来提供关于您的系统的不同信息。

运行基本 vmstat 命令,如下所示:

# vmstat

将给出以下输出,在表 7-1 中有解释:

表 7-1

vmstat 输出说明

|

vmstat 列

|

描述

| | --- | --- | | r | 等待运行时的进程数 | | b | 处于不间断睡眠状态的进程数 | | swpd | 使用的虚拟内存 | | free | 空闲内存 | | buff | 用作缓冲区的内存 | | cache | 用作缓存的内存 | | si | 从磁盘换入的内存 | | so | 内存交换到磁盘 | | bi | 从块设备接收的块 | | bo | 发送到块设备的块 | | in | 每秒中断数 | | cs | 每秒的上下文切换次数 | | us | 运行非内核代码的时间百分比 | | sy | 运行内核代码的时间百分比 | | id | 空闲时间的百分比 | | wa | 等待 IO 所用时间的百分比 |

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b  swpd     free     buff  cache    si  so  bi   bo  in  cs us sy id wa st
 0  0  2032024  2086144  1056  8923084   2   8  21  701  40  50 28 12 59  0  0

网络

当您需要排除故障或确认端口正在监听流量时,监控网络配置或流量的工具非常有用。以下是我过去用过的几个工具。

Netstat

当我需要检查端口是否在监听流量时,我倾向于使用的第一个工具是“netstat”命令。

netstat”命令将显示网络连接、接口统计等。我用来检查哪些端口正在监听的最常用命令如下:

# nestat -nap | grep LIST
# netstat -planet

Note

Netstat 仍然是 net-tools 包的一部分,但在某个时候将被删除,因为 netstat 现在已经过时了;最好使用 ss 命令。

悬浮物

要获得一些关于套接字统计的快速信息,可以使用“ss”命令。

要在带有 ss 的 Linux 系统上查看所有 TCP 和 UDP 套接字,可以使用以下命令:

# ss -t -a

伊普鲁

如果您喜欢使用 initiative 工具来查看网络统计数据,您可以使用“iptraf”命令。“iptraf”可用于监控各种网络统计数据,包括 TCP 信息、UDP 计数、接口负载信息、IP 校验和错误以及其他有用信息的负载(图 7-1 )。

图 7-1。

# iptraf-ng

图 7-1 是打开 iptraf-ng 时呈现给你的画面。

当我需要监控特定接口的流量时,这个工具帮了我不少忙。它不是默认安装的,但是如果你还没有安装的话,绝对值得使用。

从主屏幕,您可以选择监控 IP 流量;在那里,您选择想要监控的接口,然后观察该接口上的连通性。

Tcpdump

大多数(如果不是全部)网络工程师会使用 wireshark 来监控网络流量。“tcpdump”命令允许 Linux sysadmin 转储特定网络接口、所有接口或特定服务(如 DHCP 或 DNS)上的流量。

如果您想要监控接口 eth0 上所有向端口 80 发送流量的流量,对于 web 服务器,您可以运行类似的命令:

# tcpdump -n -i eth0 -s 0 -w tcpdumpoutput.txt src or dst port 80

然后可以使用 wireshark 工具打开前面命令的输出文件(图 7-2 )。

图 7-2。

Note

一个有用的方法来寻找任何可能在您的网络上传输的明文。

网虫

如果您在 Linux 系统上遇到网络负载的高突发,并且想知道谁应该对此负责,您可以尝试“nethogs”工具来查看哪个 PID 导致了带宽情况(图 7-3 )。

图 7-3。

# nethogs

NetHogs 按进程名(如 Firefox 和 chrome)对带宽进行分组,如图 7-3 所示。

iftop

这是一个非常类似于“top”的简单命令,但用于界面信息(图 7-4 )。

图 7-4。

# iftop

从图 7-4 中,您可以看到 iftop 的布局类似于常规的 top 输出,只是更侧重于网络数据。

图形工具

Gnome 系统监控器

像 Gnome 这样的 Linux 桌面并不是没有你可以使用的监控工具。熟悉 Windows 的人都知道“任务管理器”,这是一个简单的工具,可以让你大致了解正在运行的进程和系统的当前性能。Gnome 系统监控器并没有太大的不同。第一个选项卡给出了进程列表,第二个选项卡列出了正在使用的 CPU 和内存资源,最后一个选项卡给出了已挂载文件系统的明细(图 7-5 )。

图 7-5。

从图 7-5 中,您可以看到当前在您的 Linux 系统上运行的所有进程。

克西斯加德

如果 Gnome 工具对您不起作用,您还可以使用名为 ksysguard 的 KDE 工具。Gnome 系统监控器和 KDE ksysguard 工具的区别在于 ksysguard 有监控远程系统的能力。可以创建新的选项卡,并且可以监控来自远程系统的不同资源。对于快速简单的监控工具非常有用,只需很少甚至不需要真正的配置工作(图 7-6 )。

图 7-6。

与 Gnome 系统监控器类似,您也可以查看系统上运行的所有进程,如图 7-6 所示。

历史监控数据

到目前为止,我们已经研究了一些可以在 Linux 发行版上使用的有用的监控工具,但是都有一个问题(可能除了 tcpdump)。这些工具都没有保存历史数据。显示的统计数据是当前时间来自系统的实时数据。一个简单的例子,想看看前一天的 CPU 负载情况。Top 和其他这样的命令没有任何用处。

这就是前面提到的工具用于当前系统活动和实时系统检查的原因。在问题发生后试图使用它们进行根本原因分析将会使您的选择有限。

特别行政区

查询历史系统指标的一个有用工具是“sar”“sar”实用程序随 sysstat 软件包一起安装。除了“sar”,sysstat 包还有其他一些实用程序,比如 iostat、mpstat 和 nfsiostat。

sar”实用程序将系统统计信息和指标存储在本地系统文件中,以后可以查询这些文件中的系统统计信息。sar 文件可在以下位置找到:

/var/log/sa/

表 7-2 中解释了常见的 sar 参数。

表 7-2

sar 选项

|

转换

|

描述

| | --- | --- | | d | 块设备统计 | | r | 内存利用率 | | u | CPU 利用率 | | F | 文件系统统计 |

性能副驾驶员

在我看来,一个比“sar”更好使用的工具是随 pcp 包一起安装的工具。pcp 包安装了一些用于指标查询和指标收集的有用工具。表 7-3 列出了与 pcp 包一起安装的工具。

表 7-3

电脑工具

|

名字

|

描述

| | --- | --- | | pmstat | 关于您的系统、CPU、内存等的实时信息。 | | pminfo | 列出了可以查询的指标 | | pmval | 查看度量数据 | | pmlogger | 将度量数据存储到文件中,pmval 以后可以查询这些文件 |

vnstat

不要忘记网络指标,vnstat 工具是保存历史网络信息的另一个有用工具。vnstat 记录选定接口每小时、每天和每月的网络流量。

中央监控

现在对本地监控和指标收集工具有了很好的理解,我们现在可以转到开源世界中可用的中央监控工具。这些工具可用于从一个位置监控您的整个房产,并保留历史数据,以便日后进行潜在的根本原因分析。

纳吉奥斯

许多人可能知道并在某个时候开始使用的第一个工具是 Nagios。Nagios 是另一个递归的开源名称。纳吉奥斯的意思是“纳吉奥斯不会坚持要成为圣徒。”

版本

Nagios 有一个社区和一个付费产品,可以安装在大多数 Linux 发行版上。然而,CentOS 和 RHEL 是企业级 Nagios XI 产品现阶段的支持平台。然而,Nagios Core 可以安装在许多不同的 Linux 发行版上。如果您决定使用付费产品,最好与供应商讨论这些选项。

核心

Nagios 的社区支持版是核心版本,它提供了 Nagios 的基本监控功能,但是需要您使用社区论坛来获得帮助和支持。

那吉乌斯十一世

Nagios 的企业或付费解决方案附带了标准核心组件以及更多。这还包括通过电话和电子邮件对产品的所有支持。

基于代理的

Nagios 由一个服务器和基于代理的部署组成,带有一些可以使用的代理选项。

nrpe!nrpe

Nagios 远程插件执行器(NRPE)使用托管在客户端系统上的脚本。NRPE 可以监控磁盘使用、系统负载或登录用户总数等资源。Nagios 使用 check_nrpe 插件定期轮询远程系统上的代理。

NRPE 还可以与 Windows 代理插件通信,允许 Nagios 在远程 Windows 机器上执行脚本和检查指标。

Note

NRPE 已被弃用,在此仅供参考。

NRDP 的

NRDP 或 Nagios 远程数据处理器是您可以使用的另一个 Nagios 代理。NRDP 具有灵活的数据传输机制和处理器,允许 NRDP 轻松扩展和定制。NRDP 使用标准端口和协议(HTTP 和 XML ),可以用来代替 NSCA (Nagios 服务检查接受者)。

NSClient++

作为 Nagios 的 Windows 代理,NSClient++监听 TCP 端口直到 12489。用于从这个附加组件收集信息的 Nagios 插件称为 check_nt。

NSClient++类似于 NRPE,因为它允许 Nagios 监控内存使用、CPU 负载、磁盘使用等。

NCPA(全国大学生体育协会)

可以使用的最后一种试剂是 NCPA 试剂。NCPA 或 Nagios 跨平台代理是 Nagios Enterprises 维护的一个开源项目。

NCPA 可以安装在 Windows 和 Linux 上。与其他代理不同,NCPA 利用 API 为 Nagios 收集信息和度量。主动检查是通过“NCPA 监听器”服务的 API 完成的,而被动检查是通过“NCPA 被动”服务发送的。

Nagios Forks

也可以使用 Nagios 中的许多分支。Nagios 的一些分支如下:

  • 伊辛加

  • 守护进程

  • 真肯

所有这些都与 Nagios 有相似之处,但随着时间的推移,它们已经发展成了自己的解决方案。例如,Icinga 十多年来一直在开发自己的功能。

装置

Nagios 的安装可以通过几种方式完成,Nagios 文档站点上有很好的文档记录:

  • 遵循官方文档,一步一步地运行。

  • 构建虚拟机并运行自动化脚本。

  • 提取 Nagios 容器映像并运行容器。

推荐的方法是使用像 Ansible 这样的自动化工具在专用系统中部署 Nagios,但是为了快速测试和运行,请使用容器。

普罗米修斯

Prometheus 是一个开源警报和事件监控系统,它将数据存储在一个时间序列数据库中。Prometheus 是存储度量数据的中心位置,通常与其他软件配合使用,以提供整体监控解决方案。

出口商

出口商是普罗米修斯时间序列数据库的数据来源。在客户机或服务器系统上可以使用多个导出器。有专门的出口商用于不同的目的;在获取节点信息的情况下,有一个专用的 node_exporter,它将导出本地系统指标,如 CPU 或内存利用率。

警报工具

任何与其重量相当的监控平台都必须有一种方法来告诉 Linux 系统管理员什么时候出现了问题。这通常是您的警报工具。一个有用的开源工具是 Alertmanager,它可以用来触发基于 Prometheus 指标的警报。

仪表板

尽管 Prometheus 确实有一个可以用来查询指标的 web UI,但是将指标发送到仪表板工具更有意义。例如,Grafana 就是一个很好的选择,它是当今最流行的开源工具之一。

查询语言

PromQL 是用于创建仪表板和警报的查询语言。

装置

同样建议安装 Nagios,我会建议安装 Prometheus。文档非常清晰,并且经过深思熟虑。如果您想手动安装,安装步骤非常简单,但是我仍然建议您使用自动化方法。互联网上有很多可以为你做这件事的角色,或者,如果你愿意,也有一些容器映像可以用来部署一个容器。

忽必烈还是 openshift

像 Kubernetes 或 OpenShift 这样的平台也可以在其上部署 Prometheus,但它们往往用于平台本身。您需要创建一个新的名称空间,并部署您自己的 Prometheus 和 Grafana 来用于外部系统监控。

配置

一旦安装,普罗米修斯不需要太多的配置就可以开始。通常名为 prometheus.yaml 的简单 YAML 文件可用于所有配置。普罗米修斯官方网站的基本配置如下:

global:
  scrape_interval:     15s
  evaluation_interval: 15s

rule_files:
  # - "first.rules"
  # - "second.rules"

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ['localhost:9090']

全球的

全局部分用于普罗米修斯全局配置。例如,告诉普罗米修斯多久刮一次。

规则 _ 文件

rule_files 部分是我们希望 Prometheus 使用的自定义规则。这种情况下的示例配置没有任何 rule_files 可使用。

Scrape_configs

scrape_configs 部分告诉 Prometheus 要收集哪些指标。在配置示例中,将通过端口 9090 联系本地主机,并在/metrics 端点上搜索指标。

启动普罗米修斯

通常,监控平台应该从服务启动,Prometheus 也可以配置为这样做。在启动 Prometheus 时,您至少应该指定一个参数,这就是您正在使用的 Prometheus 配置文件的名称。

要手动启动 Prometheus,可以从 Prometheus 安装目录运行以下命令:

# ./prometheus --config.file=prometheus.yml

谢谢你

Prometheus monitoring 本身就相当不错,可以从一个简单的监控平台提供您可能想要的一切,除了可能的长期历史数据或高可用性。

这就是可以利用灭霸的地方。灭霸旨在提供一个高度可用的解决方案,可以从多个 Prometheus 部署中保持无限制的指标保留。

灭霸是以普罗米修斯为基础的,要求在同一个网络中至少有一个普罗米修斯实例。灭霸通过一系列组件管理指标收集和查询。

边车

sidecar 是允许灭霸连接到普罗米修斯实例的组件。然后,它可以读取数据进行查询或上传到云存储。

商店网关

这允许查询云对象存储桶内的度量数据。

压土机

这将压缩或压缩数据,并对存储在云存储桶中的数据应用保留。

接收器

这是负责从 Prometheus 的远程写入功能接收数据的组件。接收者还可以公开指标或将其上传到云存储。

尺子/规则

这用于根据灭霸的数据评估记录和警报规则。

问题

这利用了 Prometheus 的 v1 API 从底层组件获取和查询数据。

查询前端

通过使用 Prometheus 的 v1 API,查询前端可以一次评估所有实例的 PromQL 查询。

灭霸基本布局

图 7-7 是各种灭霸组件如何相互通信的基本示意图。

图 7-7。

企业监控

对拥有不同团队的大型组织进行监控通常是一个有争议的话题,主要是因为不同的团队都希望使用更适合他们的工具。有一些优秀的专有 Windows 工具,也有相当好的开源 Linux 工具可以使用。因为这本书关注的是开源技术和 Linux 的采用,所以让我们简单看一下您可以使用的一些开源企业监控工具。

扎比克斯

Zabbix 是一个很好的企业级监控工具,可以用来监控您的资产。Zabbix 引以为豪的是,他们可以监控从服务器平台到网络系统的任何东西。Zabbix 是一个基于服务器和代理的系统,但也可以在不使用代理的情况下监控一些设施。

企业支持

Zabbix 有一个付费的支持设施,可以用于企业支持,或者你可以通过社区论坛来支持自己。

装置

安装相对简单,在 Zabbix 网站上有很好的文档。他们有一种非常好的方式,通过一系列基于您的偏好的选择框来呈现安装步骤。

有用的功能

Zabbix 可以提供一些非常好的特性。例如,直接通过 JMX 监控基于 Java 的应用程序的能力,使用 VMware 工具监控虚拟机的能力,以及与 Puppet 或 Chef 等系统管理工具集成的能力。

CheckMk

另一个很好的企业监控工具是 CheckMk。CheckMk 是一个像 Zabbix 一样的可扩展解决方案,可以监控从标准 Linux 平台到物联网设备的各种系统。

企业支持

CheckMk 提供了一个免费版本和一个企业付费解决方案,免费版本具有无限的监控功能,您可以在其中支持自己,企业付费解决方案具有额外的功能。

装置

支持主要的企业 Linux 发行版,CheckMk 文档中有关于您正在使用的发行版的详细步骤。

有用的功能

CheckMk 一直着眼于未来构建他们的平台。他们内置了监控 Docker、Kubernetes 和 Azure 等工具。

整体解决方案是可扩展的,并且将在具有分布式布局(多个数据中心)的大型组织中很好地工作。自动化是确保配置和设置尽可能简单的主要开发点之一。

OpenNMS(打开 NMS)

我安装的第一个监控工具是 OpenNMS,那是很多年前我第一次接触开源技术的时候。在为这本书进行研究时,我印象深刻地看到,OpenNMS 不仅仍然是一个开发的产品,而且看起来也非常令人印象深刻。

企业支持

像大多数企业平台一样,通常有两种选择:带有社区支持的“免费”版本和企业付费版本。

OpenNMS 版本如下:

  • Horizon:社区驱动和支持的版本

  • Meridian:基于订阅的服务,提供最新稳定的企业版

装置

OpenNMS 的安装不像其他可用的工具那么简单,但同时安装起来也并不十分困难。官方文档足够清晰,并且会一步一步地指导您完成所有需要做的事情。如果你遇到困难,也有一个很好的社区论坛来回答问题。

有用的功能

真正突出的一个特性是 OpenNMS 使用 Grafana 作为仪表板工具,在我看来,这是一个非常好的举措,这主要是因为当今越来越多的用户正在开发自己的仪表板。

OpenNMS 指标也可以通过多种方法收集,包括 JMX、WMI、HTML、XML 等等。

仪表盘

监控的一个方面几乎与收集的指标一样重要,那就是以有意义的格式查看指标的能力。这就是仪表板工具至关重要的地方。

这些年来,我遇到过一些监控工具,它们过去和现在都很好,但在浏览器中看起来很糟糕。对于一些应用程序监控工具,我还发现仪表板很难配置。调整窗口大小是一场噩梦,连接外部工具总是不可能。

似乎我不是唯一一个受这些工具困扰的人,一些聪明人已经开始开发专用的仪表板工具,可以与各种工具集成。

仪表板工具

表 7-4 列出了一些现在可以使用的仪表板工具。

表 7-4

仪表板工具

|

名字

|

描述

| | --- | --- | | Grafana | 当今最流行的仪表板工具。最初发布于 2013 年 | | Chronograf | 如果您的大部分指标来自 InfluxDB 数据库,这将是一个非常好的工具 | | Netdata | 一个基于插件的仪表板工具,支持度量显示的推拉架构 | | Kibana | 主要与 Elasticsearch 和 Logstash 一起使用,以形成 ELK 堆栈 |

格拉凡娜

由于 Grafana 是当今最受欢迎的工具,因此值得探究 Grafana 提供了什么。

格拉夫纳是什么

Grafana 是一个开源的基于插件的仪表板工具,具有广泛的数据源选项,可用于显示指标而无需复制任何数据。Grafana 几乎可以部署在今天使用的所有平台上,从 Windows 到 Debian(图 7-8 )。

图 7-8。

Grafana 仪表板的基本示例如图 7-8 所示。

使用 Grafana

有几种方法可以使用 Grafana:

  • 在内部安装您自己的环境。

  • 使用托管的 Grafana 云服务。

云服务

如果您不想在本地运行自己的 Grafana 实例,可以在云中运行您的仪表板。免费的永久计划包括 Grafana,10K 普罗米修斯系列,50 GB 日志,等等。

现场安装

Grafana 有几种部署方式:

  • 按照 Grafana 文档页面上的官方文档进行手动安装。

  • 使用 podman 提取预构建的 Grafana 容器映像,并运行 Grafana 容器。

Recommendation

使用像 Ansible 这样的自动化工具,并下载一个预构建的 Ansible 角色来为您进行部署。

数据源

在创建仪表板之前,您需要有一个从中提取指标数据的源。这些是你的数据来源。在尝试创建仪表板之前,您需要创建一个数据源。Grafana 支持许多数据源,包括以下一些:

  • Alertmanager

  • AWS 云观察

  • Azure 监控器

  • 弹性搜索

  • InfluxDB

  • 关系型数据库

  • 一种数据库系统

  • 普罗米修斯

  • 贼鸥

仪表板创建

一旦有了数据源,就可以开始创建仪表板了。Grafana 能够创建许多不同的仪表板,当您首次登录时,可以从 Grafana 主屏幕创建这些仪表板。

如果您希望下载预构建的仪表板或希望共享您的配置,可以导入和导出仪表板。

嵌板

一旦您有了第一个仪表板,您将想要开始创建您的指标可视化。为此,仪表板使用面板。可以使用多个面板来显示您从预配置的数据源中选择的指标。每个面板都有一个特定于面板中所选数据源的查询编辑器(图 7-9 )。

图 7-9。

可以复制面板以进行快速配置,并且可以定制为您的时间序列数据使用不同的颜色,如图 7-9 所示。

要排列所有面板,您需要创建行;行是所有面板的逻辑分隔线。为了便于组织,可以将面板拖到不同的行中。

救援

当您添加了新的面板或行时,请始终记住保存您的仪表板。如果您碰巧打开了一个新的仪表板,您的更改将会丢失。

应用程序监控

应用程序监控是一种特殊的监控,它可能有点复杂,而且通常在资源和时间上都更昂贵。应用程序监控要求基础设施工具和开发应用程序的开发人员公开可以监控的指标。

跟踪工具

跟踪工具通过使用专门的日志记录来“跟踪”应用程序及其事务的执行路径。通常,开发人员使用这些来帮助确定特定问题发生的位置。

不应将跟踪与事件监控相混淆。事件监控主要由 Linux 系统管理员用于高级故障排除,通常不会太“嘈杂”在那里,用“追踪”噪声是好的。信息越多,故障排除就越能准确地缩小根本原因的范围。

现在有一些可以使用的跟踪工具。像 AppDynamics 这样的专有平台是具有丰富功能的优秀工具,但价格昂贵。幸运的是,也有开源的选择,因为我们主要关注的是开源的,我们可以跳过那些不开源的。

贼鸥

Jaeger 最初由优步开源,其灵感来自于 OpenZipkin 和 Dapper 项目,用于监控和故障排除基于微服务的分布式系统。因此,耶格承诺帮助解决以下问题:

  • 分布式事务监控

  • 性能和延迟优化

  • 根本原因分析

  • 服务依赖分析

  • 分布式上下文传播

分布式跟踪

在 Jaeger 之前,Zipkin 是作为基于 Google Dapper 项目的开源项目开发的。Zipkin 是一个基于 Java 的应用程序,它为用户提供了一个界面来查看来自一系列数据后端的跟踪数据。Zipkin 支持 RabbitMQ 和 Kafka 这样的传输机制。

Zipkin 可以作为容器部署,也可以通过下载最新的二进制文件在本地运行。所有这些步骤在 Zipkin 官方网站上都有详细的记录。

公开指标

监控工具的好坏取决于它们所能收集的数据。对于标准平台监控,可以使用代理提取指标,这些代理反过来与运行它们的系统对话,以返回它们需要的数据。然而,应用程序需要从应用程序内部公开数据,以便监控代理可以将数据传递给监控平台。在那里,可以配置警报以及任何控制面板。

“开发者”怎么讲

作为 Linux 系统管理员,我们需要构建包含应用程序指标的监控系统;为此,开发人员需要确保编写的代码能够公开指标。开发可以使用 Jaeger 这样的追踪软件追踪的应用程序也是如此。

在尝试诊断问题时,与开发人员进行对话并构建概念验证应用程序来展示跟踪的好处以及公开的应用程序指标是至关重要的。随着您的应用程序组合的增长,拥有这些工具将大大减少潜在的停机时间和消防。尽早构建这些良好的实践比以后再尝试改进它们更值得。如果您的应用程序使用第三方,这可能会更加困难。

摘要

在本章中,向您介绍了以下内容:

  • 什么样的监控工具可以从标准的 Linux 发行版中运行

  • 可以从 Linux 桌面使用的图形替代监控工具

  • 什么工具可以用来在标准 Linux 发行版上存储历史指标数据

  • Nagios、Prometheus 和灭霸等中央监控解决方案

  • 企业监控开源工具,如 OpenNMS 和 CheckMk

  • 可以用来以简洁的方式显示度量数据的仪表板工具

  • 用于跟踪的应用程序监控工具,以及应用程序指标对资产管理的重要性

八、日志记录

在这一章中,我们将重点讨论一个我们作为 Linux 系统管理员花费大部分时间进行故障诊断的主题:日志。

我们将探索您可以使用的不同日志记录系统,如何读取日志,如何增加我们从日志中获得的信息,以及如何保护我们的系统,使日志不会给我们带来更多问题。最后,我们将探索日志应该如何以简洁和安全的方式卸载到外部日志记录系统。

Linux 日志系统

有几个不同的选项可用于系统和应用程序日志。默认情况下,所有 Linux 系统都安装了 syslog 来管理本地日志。有一些 syslog 的替代品可以使用,或者您可以选择开发自己的系统。

我们将简要介绍的两个日志系统是 Rsyslog 和 Fluentd。

rsyslog(rsyslog)

Rsyslog 默认安装在所有 Linux 系统上,并且几乎总是被使用,它是一个非常快速的日志记录系统,能够从运行在 Linux 平台上的几乎所有系统接收日志。Rsyslog 不仅可以从任何地方接收日志,还可以将日志从文件卸载到 MongoDB。

模块化的

Rsyslog 以模块化的方式设计,允许用户选择他们想要使用 rsyslog 的内容。目前有许多可用的模块,从 snmp 陷阱配置到内核日志。有关您可以使用的所有不同模块的完整列表,请访问 rsyslog 官方网站:

www.rsyslog.com/doc/v8-stable/configuration/modules/index.html

装置

如果由于某种非常奇怪的原因,rsyslog 没有被默认安装,您可以从您的标准包管理系统安装,比如 dnf 或 apt:

# dnf install rsyslog

如果您选择将 rsyslog 容器用作中央日志记录系统,也可以运行它。需要围绕存储和连接进行更多思考。

服务

默认情况下,rsyslog 服务处于启用和启动状态,但可以通过标准的 systemd 方式停止或禁用:

# systemctl status rsyslog

配置文件

rsyslog 的配置文件通过两个配置位置进行处理:

  • 整体中央配置文件"/etc/rsyslog.conf"

  • 的”。d "要存储的自定义配置文件的目录"/etc/rsyslog.d/"

您需要熟悉 Rsyslog 配置的三个主要部分:

  • 全球指令

  • 模板

  • 规则和操作

全球指令

rsyslog 的通用全局配置。示例包括启用和禁用附加模块和库位置。

模板

模板使您能够格式化记录日志的方式,并允许动态生成文件名。如果您正在构建一个中央 rsyslog 系统,并且想要记录发送日志的系统的主机名,那么这是一个非常有用的配置。

规则

规则由选择器和操作组成。这些字段设置了将记录的内容以及日志将发送到的位置。

选择器字段

选择器字段由两部分组成,设施和优先级。这两部分由“.”分开性格。

以下条目是有效的工具类型:auth、authpriv、cron、daemon、kern、lpr、mail、news、syslog、user、uucp 和 local0 到 local7。

以下条目是可以使用的有效优先级:调试、信息、通知、警告、错误、关键、警报、紧急。

通配符“*”可用于替换区段字段的设施和优先级中的一个或两个。

选择器字段的示例可以是“*.*”、“auth.*”和“auth.debug”。

行动领域

动作字段通常由日志文件的位置组成。但是,如果您愿意,其他操作也可以应用于特定的选择器。例如,写入数据库或将日志文件发送到远程日志系统。

行动也可以相当灵活;可以配置不同的协议、端口和接口来向远程系统发送日志。如果您运行一个专用的日志记录网络而不影响生产网络,这是很有用的。

Tip

利用不同的选择器来监控系统中不同文件中的关键错误。然后,这些日志可以导出到远程系统,以便在仪表板上立即发出警报。

流利

Fluentd 是一个开源项目,最初由一家名为 Treasure Data 的公司创建。

基于插件

Fluentd 是用 C 和 Ruby 编写的,它让用户能够灵活地使用 Fluentd。Fluentd 拥有超过 125 个用于输入和输出的插件,几乎可以用于任何可用的系统或云提供商。

大规模使用

使用 Fluentd 运行大规模环境是完全可能的,用户案例报告称 Fluentd 可以处理超过 50,000 个发送数据的系统。

装置

Fluentd 可以通过几种方式安装:标准包安装、从源代码安装或从容器运行。

先决条件

安装 Fluentd 之前,需要满足几个先决条件:

  • 配置 NTP。

  • 将最大文件描述符增加到 65535。

  • 针对性能敏感型环境优化网络内核参数。

  • 使用粘滞位符号链接/硬链接保护。

关于这些先决条件的更多信息可以在 Fluentd 的官方安装文档中找到。

手动安装

根据您的系统,可以通过运行与您的发行版匹配的脚本或安装所需的 Ruby gems 来安装 Fluentd。对于不受支持的平台,建议使用 gem 安装;对于受支持的平台,如 RHEL,建议使用 Fluentd 提供的脚本进行安装。

详细步骤应始终遵循官方文档。

集装箱部署

Fluentd 也可以作为容器来部署,并且经常以这种方式部署。官方文档详细强调了成功部署需要遵循的所有步骤。

基本的高级步骤如下:

  1. 从可靠或可信的来源获取 Fluentd 容器映像。

  2. 创建一个基本的 fluentd.conf 配置文件。

  3. 运行容器并发送日志。

Note

除了前面的步骤,还会有更多的步骤。此外,不要忘记你的防火墙。

配置

Fluentd 的主要配置文件是 fluentd.conf 文件。可以在官方在线文档或手册页中找到配置参数。基本配置文件如下所示:

<source>
  @type http
  port 9880
  bind 0.0.0.0
</source>
<match **>
  @type stdout
</match>

理解日志

让日志可用是发现或防止问题的第一步。理解日志实际告诉你的是另一个非常重要的步骤。

日志文件在哪里

在所有主要的企业级 Linux 发行版中,日志文件通常存储在“/var/log”目录中。这个目录通常应该安装在一个单独的磁盘分区上,以避免根文件系统在发生任何失控的日志记录时被填满。

Tip

如果您遵循任何强化准则,则/var/log 应该始终位于单独的分区上。

如何读取日志文件

可以使用安装在 Linux 发行版上的各种工具来查看日志。在普通系统上,您至少可以使用“vi”工具,但是您可以安装和使用任何您更喜欢的文本编辑器。

Warning

不要在生产系统上使用 vim 之类的工具打开几千兆字节大小的大型日志文件。文件内容将消耗大量内存,并可能导致您的问题。将大型日志复制到不同的系统以避免任何问题。

基础设施日志

告诉您关于 Linux 系统的事件、服务和系统的所有信息的日志是您的基础设施日志。这些日志是在 rsyslog.conf 配置文件中配置的标准日志,告诉您系统在后台正在做什么。这些日志将用于对任何系统问题进行故障排除,并可用于在问题发生前查找问题。

重要日志

应该监控系统问题的日志如下。

/var/日志/消息

该日志用于存储有关系统的所有一般事件和信息。其他发行版如 Ubuntu 或 Debian 使用一个名为 syslog 的日志文件。如果您需要对任何问题进行故障诊断,该日志应该始终是您首先检查的地方之一。它可能没有所有的信息,但当你不知道从哪里开始时,它可以让你开始。

/var/log/secure

该日志文件用于身份验证事件。这个日志或 Ubuntu 和 Debian 中的/var/log/auth.log 是解决认证失败或登录尝试的最佳起点。

/var/log/boot.log

这一个的目的相当简单。这用于解决与引导相关的问题。这是一个非常有用的日志,可以用来查看系统停机的时间。

dmesg 日志所在位置

这用于记录有关系统硬件更改和故障的信息。如果您在检测添加或删除新硬件时遇到问题,这将非常有用。

(登录中)

如果使用 yum 作为软件包管理系统的发行版,您可以看到所有添加、更新或删除的软件包的历史记录。

在哪里登录/cron

这是一个简单的日志,用于捕获所有成功或失败的 cron 相关任务。

应用程序日志

根据您的应用程序或您使用的应用服务器,日志文件可以存储在任何地方。应用程序开发人员需要确保记录重要信息,以便解决问题或跟踪事件。增加或减少冗长的能力也应该包括在内。

良好实践

应用程序日志记录的一些良好实践应该包括以下内容。

对日志使用/var/log 目录

确保所有日志都在/var/log 目录中,最好是在应用程序专用的子目录下。如果应用程序无法调整日志的发送位置,则可以将它们的目录符号链接到/var/log 目录。

安全

在保存长期历史记录时,应该保护包含敏感信息的日志。日志目录的权限应该锁定给有权读取日志的用户和组。ACL 的使用有助于保持日志的安全。

警告或以上

生产中的日志绝不能处于调试模式。日志应仅设置为警告或错误。这将使日志保持较小,并且仅在出现问题或报告错误时才进行报告。将日志级别设置得太低会导致/var/log 磁盘被填满。

Warning

在生产中调试从来都不是一个好主意。如果经常需要这样做,那么您的应用程序没有得到正确的测试,应该建议您不要部署新版本,除非经过严格的测试。

增加冗长度

当问题发生时,可能需要获得比已经提供的更多的信息。

日志详细级别

编写良好的应用程序或平台都倾向于能够增加或减少日志的详细程度。在设置日志记录级别时,用户通常可以使用以下日志级别:

  • 致命的

  • 错误

  • 警告

  • 信息

  • 调试

  • 微量

生产应用程序或平台的默认设置通常应该设置为“警告”或“错误”如前所述,不建议在生产中调试,原因有二:

  1. 打开调试通常需要重启应用程序或平台,当平台上有实时流量时,这并不容易做到。

  2. 调试将增加磁盘使用量,并增加系统的额外负载。如果应用程序或平台出现重大问题,调试日志可能会快速增长,并可能会填满所有日志磁盘。

然而,当出现非常罕见的需求时,将日志详细度设置为“Debug”肯定会记录更多的信息,但会被限制为应用程序或平台认为是调试消息的信息。要得到你需要的信息,最好是从“警告”开始,一直到“追踪”,直到得到你需要的信息。一旦完成,总是将日志级别设置回“警告”或“错误”

日志维护

一个好的 Linux 系统管理员会确保所有的日志在不被使用的时候被循环使用和归档。一个优秀的 Linux 系统管理员将日志维护内置到所有的系统配置自动化中,再也不用担心这个问题了。

如果您以前从未管理过日志,则以下情况很可能是真的:

  • 到目前为止,你很幸运。

  • 您支持的平台没有记录足够的信息,因此不会成为问题。

  • 日志被转发到由其他人管理的专用日志平台。

日志管理工具

Logrotate

对于任何 Linux 系统管理员来说,进行日志维护的第一步是配置 Logrotate。Logrotate 可以旋转、压缩和邮寄日志文件。Logrotate 由以下配置文件和目录管理:

  • /etc/logrotate.conf 文件

    • 用于全局配置
  • /etc/logrotate.d

    • 自定义配置文件
装置

缺省情况下,Logrotate 安装在所有 enterprise Linux 发行版和大多数社区发行版上。

Logrotate 通过其手册页提供文档,为您提供足够的入门信息,包括示例。

日志转发

日志转发是当今大多数人的首选。像 Fluentd 这样的企业工具是将本地日志转移到一个中心位置的好方法。它消除了本地系统长期保留日志的需要,并减少了磁盘占用空间。

中央测井系统

现在有一些可以使用的中央日志记录系统,既有专有的也有开源的。在过去十年中,中央日志领域的知名公司有 Splunk、网络安全管理软件产品、Rsyslog、ElasticStack 和 Fluentd。最后三个是开源的,值得花时间去了解。

弹性堆叠

也称为 ELK stack,由表 8-1 中列出的四种工具组成。

表 8-1

弹性堆叠工具

|

工具

|

描述

| | --- | --- | | Elasticsearch | 用于日志分析和搜索 | | Kibana | 弹性搜索的用户界面 | | Logstash | 用于日志摄取 | | Beats | 用于向 Logstash 发送日志记录信息的代理 |

流利

正如本章前面所讨论的,Fluentd 可以用作本地日志记录的替代品,也可以用作集中式日志记录平台。要将 Fluentd 用作中央日志记录平台,您的网络中需要有两个元素。

日志转发器

日志转发器监控本地系统上的日志,筛选所需的信息,然后将信息发送到中央系统。对于 Fluentd,这将是一个日志聚合器。

Fluentd 有一个名为 Fluent Bit 的日志转发器,Fluentd 推荐使用。

Fluentd 转发器配置的示例如下所示:

<source>
  @type forward
  port 24224
</source>
<source>
  @type http
  port 8888
</source>
<match example.**>
  @type forward
  <server>
    host 192.168.100.1
    port 24224
  </server>
  <buffer>
    flush_interval 60s
  </buffer>
</match>

日志聚合器

日志转发器的目的地是日志聚合器。它们由不断运行并接受日志信息进行存储的守护程序组成。然后,可以将日志导出或迁移到云环境中进行异地存储。

Fluentd 日志聚合配置示例可能类似于以下内容:

<source>
  @type forward
  port 24224
</source>
# Output
<match example.**>
  # Do some stuff with the log information
</match>

rsyslog(rsyslog)

如果您不想使用标准 enterprise Linux 发行版之外的任何东西,您可以坚持使用 Rsyslog 进行集中日志记录。

Rsyslog 聚合器

与 Fluentd 配置为使用日志转发器和聚合器非常相似,Rsyslog 也可以配置为使用日志转发器和聚合器。Rsyslog 可以配置为通过 tcp 或 udp 发送和接收日志。Rsyslog 也可以配置为使用证书安全地发送和接收日志。

作为 Rsyslog 服务器作为中央日志记录系统接收日志的最低要求,您需要确保具备以下条件:

  1. 防火墙被禁用或配置为允许 tcp/udp 端口 514 或 6514,这取决于您是否使用转发日志的证书方法。

  2. 如果启用了 SELinux,您将需要配置 SELinux 以允许 rsyslog 流量将消息记录到您的中央系统:

    semanage -a -t syslogd_port_t -p tcp 514
    semanage -a -t syslogd_port_t -p udp 514
    
    
  3. 配置 NTP。

  4. 配置 rsyslog.conf 使模块能够接收日志:

    $ModLoad imtcp
    $InputTCPServerRun 514
    
    
  5. 重新启动 rsyslog 服务。

Rsyslog 货运代理

要将日志发送到中央 Rsyslog 服务器,还需要在 Linux 客户机系统上配置 rsyslog.conf 文件,以便将日志发送到中央服务器。使用 tcp 集中发送所有日志的简单配置如下:

*.*  @@192.168.0.1:514

Note

一个@用于 udp,而两个@@用于通过 tcp 发送。

与中央 Rsyslog 服务器一样,一旦更新了配置文件 rsyslog.conf,就需要重新启动 rsyslog 服务:

# systemctl restart rsyslog

摘要

在本章中,向您介绍了以下内容:

  • 不同的 Linux 日志系统,包括 rsyslog 如何被 Fluentd 取代

  • 如何理解日志以及在哪里可以找到它们

  • Linux 系统中的重要日志是什么,这些日志有什么用途

  • 日志维护以及可以使用什么工具来防止日志填满您的 Linux 系统

  • 可以使用什么将日志发送到中央日志记录系统