根据 Google 的说法,使用容器的 7 种最佳实践

笔记。 翻译。:原文作者是 Théo Chamley,Google 云解决方案架构师。 在 Google Cloud 博客的这篇文章中,他提供了其公司更详细指南的摘要,称为“操作容器的最佳实践” 在其中,Google 专家收集了在使用 Google Kubernetes Engine 等环境下操作容器的最佳实践,涉及广泛的主题:从安全性到监控和日志记录。 那么根据 Google 的说法,最重要的容器实践是什么?

根据 Google 的说法,使用容器的 7 种最佳实践

Kubernetes引擎 (基于 Kubernetes 的服务,用于在 Google Cloud 上运行容器化应用程序 - 约。 翻译) 是运行需要扩展的工作负载的最佳方法之一。 Kubernetes 如果大多数应用程序被容器化,将确保它们顺利运行。 但如果您希望应用程序易于管理并希望充分利用 Kubernetes,则需要遵循最佳实践。 它们将简化应用程序的操作、监控和调试,并提高安全性。

在本文中,我们将列出在 Kubernetes 上有效运行容器所需了解和执行的一系列事项。 那些希望深入了解细节的人应该阅读材料 操作容器的最佳实践,也请关注我们的 较早的帖子 关于组装容器。

1.使用原生容器日志机制

如果应用程序运行在 Kubernetes 集群上,则不需要太多日志。 您正在使用的集群中可能已经内置了集中式日志记录系统。 在使用 Kubernetes Engine 的情况下,这是负责的 Stackdriver 日志记录. (笔记。 翻译。:如果您使用自己的 Kubernetes 安装,我们建议您仔细查看我们的开源解决方案 - 木屋.) 让您的生活保持简单并使用本机容器日志记录机制。 将日志写入 stdout 和 stderr - 它们将被自动接收、保存和索引。

如果需要,您还可以将日志写入 JSON格式。 这种方法将使向它们添加元数据变得容易。 有了它们,Stackdriver Logging 将能够使用此元数据搜索日志。

2. 确保容器是无状态且不可变的

为了使容器在 Kubernetes 集群中正常运行,它们必须是无状态且不可变的。 一旦满足这些条件,Kubernetes 就可以完成其工作,在需要的时间和地点创建和销毁应用程序实体。

无状态 意味着任何状态(任何类型的持久数据)都存储在容器外部。 为此,根据需要,可以使用不同类型的外部存储: 云储存, 永久磁碟, Redis的, SQL云 或其他托管数据库。 (笔记。 翻译。:请阅读我们的文章了解更多相关信息“Kubernetes 的 Operator:如何运行有状态应用程序»。

不可变的 意味着容器在其生命周期内不会被修改:没有更新、补丁、配置更改。 如果您需要更新应用程序代码或应用补丁,请创建新映像并部署它。 建议将容器配置(监听端口、运行时环境选项等)移至外部 秘密 и 配置映射。 无需构建新的容器映像即可更新它们。 要轻松地使用图像组装创建管道,您可以使用 云构建. (笔记。 翻译。:我们使用开源工具来实现这些目的 DAPP.)

根据 Google 的说法,使用容器的 7 种最佳实践
使用挂载在 pod 中的 ConfigMap 作为配置来更新 Kubernetes 中的 Deployment 配置的示例

3.避免特权容器

您不会在服务器上以 root 身份运行应用程序,对吗? 如果攻击者进入该应用程序,他将获得 root 访问权限。 同样的注意事项也适用于不运行特权容器。 如果需要更改主机上的设置,可以为容器指定特定的设置 能力 使用选项 securityContext 在 Kubernetes 中。 如果你需要改变 系统命令, Kubernetes 有 单独的摘要 为了这。 一般来说,尽量充分利用 在里面- 和 sidecar 容器来执行类似的特权操作。 它们不需要可供内部或外部流量访问。

如果您管理集群,则可以使用 Pod 安全策略 用于限制特权容器的使用。

4.避免以 root 身份运行

特权容器已经讨论过,但除此之外,如果您不在容器内以 root 身份运行应用程序,那就更好了。 如果攻击者在具有 root 权限的应用程序中发现允许执行代码的远程漏洞,之后他能够通过未知的漏洞离开容器,他将获得主机上的 root 权限。

避免这种情况的最好方法是首先不要以 root 身份运行任何东西。 为此,您可以使用指令 USER в Dockerfile или runAsUser 在 Kubernetes 中。 集群管理员还可以使用以下命令配置强制行为 Pod 安全策略.

5. 使应用程序易于监控

与日志记录一样,监控是应用程序管理的一个组成部分。 Kubernetes 社区中流行的监控解决方案是 普罗米修斯 - 自动检测需要监控的 Pod 和服务的系统。 (笔记。 翻译。: 另请参阅我们的 详细报告 关于使用 Prometheus 和 Kubernetes 进行监控的主题。) 堆栈驱动程序 能够监控 Kubernetes 集群,并包含自己的 Prometheus 版本用于应用程序监控。

根据 Google 的说法,使用容器的 7 种最佳实践
Stackdriver 上的 Kubernetes 仪表板

Prometheus 希望应用程序将指标转发到 HTTP 端点。 可用于此 普罗米修斯客户端库。 其他工具也使用相同的格式,例如 开放人口普查 и Istio.

6. 提供应用程序的健康状态

生产中的应用程序管理得益于其将其状态传达给整个系统的能力。 应用程序正在运行吗? 可以吗? 您准备好接收流量了吗? 他表现如何? 解决这个问题最常见的方法就是实施健康检查 (健康检查)。 Kubernetes 有两种类型: 活性和就绪性探针.

用于活性探针 (活力检查) 应用程序必须有一个 HTTP 端点,如果它可以正常工作并且满足其基本依赖性,则该端点会返回“200 OK”响应。 用于就绪探针 (服务准备情况检查) 如果应用程序处于健康状态、初始化步骤已完成并且任何有效请求都不会导致错误,则应用程序必须有另一个返回“200 OK”响应的 HTTP 端点。 仅当应用程序根据这些检查准备就绪时,Kubernetes 才会将流量路由到容器。 如果活跃状态和就绪状态之间没有差异,则可以合并两个端点。

您可以在 Google 开发者倡导者 Sandeep Dinesh 的相关文章中阅读更多相关内容:“Kubernetes 最佳实践:使用就绪性和活性探针设置运行状况检查“。

7. 仔细选择您的镜像版本

大多数公共和私人图像使用类似于中描述的标记系统 构建容器的最佳实践。 如果图像使用接近的系统 语义版本控制,有必要考虑标记的细节。 例如,标签 latest 可以频繁地从一个图像移动到另一个图像 - 如果您需要可预测和可重复的构建和安装,则不能依赖。

您可以使用标签 X.Y.Z (它们几乎总是不变),但在这种情况下,请跟踪图像的所有补丁和更新。 如果您使用的图像有标签 X.Y,这是一个中庸之道的好选择。 通过选择它,您将自动接收补丁,同时依赖应用程序的稳定版本。

译者PS

另请阅读我们的博客:

来源: habr.com

添加评论