Google的7种最佳容器做法

注意事项 佩雷夫 :原始文章的作者是Google Cloud Architect的ThéoChamley。 在针对Google Cloud博客的出版物中,他简要介绍了自己公司的更详细指南,即“ 操作容器的最佳做法 ”。 在其中,Google专家不仅在使用Google Kubernetes Engine的过程中收集了操作容器的最佳实践,而且不仅涉及广泛的主题:从安全到监视和日记。 那么,哪种容器做法对Google最重要?



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

在本文中,我们将列出您需要了解的知识以及如何在Kubernetes中有效运行容器。 那些希望深入研究细节的人应该阅读《 操作容器最佳实践》材料,并注意我们之前的容器组装文章

1.使用本机容器机制进行日志记录


如果应用程序在Kubernetes集群中运行,则日志不需要太多。 集中式日志记录系统可能已集成到您正在使用的群集中。 如果使用Kubernetes引擎,则由Stackdriver Logging负责。 注意 :如果您使用自己的Kubernetes安装,我们建议您仔细看一下我们的开源解决方案-loghouse 。)不要使您的生活变得复杂,并使用本机机制来记录容器。 将日志写入stdout和stderr-它们将被自动接收,保存和索引。

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

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


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

无状态意味着任何状态(任何类型的持久数据)都存储在容器外部。 为此,根据需要,可以使用不同类型的外部存储: Cloud StoragePersistent DisksRedisCloud SQL或其他托管数据库。 注意翻译在我们的文章“ Kubernetes的运算符:如何运行有状态的应用程序 ”中了解有关此内容的更多信息。)

不可变意味着容器在其生命周期内将不会被修改:没有更新,补丁,配置更改。 如果您需要更新应用程序代码或应用补丁,请创建一个新映像并进行部署。 建议将容器配置(侦听端口, 运行时选项等)移至外部(在SecretsConfigMaps中) 。 无需构建新的容器映像即可对其进行更新。 您可以使用Cloud Build轻松创建带有图像组合的管道。 注意为此,我们使用dapp开源工具。)


使用吊舱中安装的ConfigMap作为配置更新Kubernetes中的部署配置的示例

3.避免使用特权容器


您不是以root用户身份在服务器上运行应用程序,对吗? 如果攻击者闯入应用程序,则他将获得root用户访问权限。 相同的注意事项适用于不运行特权容器。 如果要更改主机上的设置,可以使用Kubernetes中的securityContext选项为容器提供特定的功能 。 如果需要修改sysctls,Kubernetes为此有一个单独的注释 。 通常,请尝试最大程度地使用init和sidecar容器来执行此类特权操作。 他们不需要内部或外部流量的可访问性。

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

4.避免以超级用户身份运行


我们已经讲过特权容器,但是如果除此之外,您不以root用户身份在容器内运行应用程序,那就更好了。 如果攻击者发现具有能够以root特权在应用程序中执行代码的远程漏洞,然后他可以通过一个尚不为人所知的漏洞退出容器,那么他将在主机上获得root权限。

避免这种情况的最佳方法是首先不要以root用户身份运行任何内容。 为此,您可以在Dockerfile使用USER指令,或者在Kubernetes中使用runAsUser。 集群管理员还可以使用Pod安全策略配置强制实施。

5.使应用程序易于监视。


像日志记录一样,监视是管理应用程序必不可少的部分。 在Kubernetes社区中,流行的监视解决方案是Prometheus ,该系统可自动检测需要监视的Pod和服务。 注意 :另请参阅有关使用Prometheus和Kubernetes进行监视的详细报告 。)Stackdriver能够监视Kubernetes集群,并包括自己的Prometheus版本以监视应用程序。


Stackdriver中的Kubernetes资讯主页

Prometheus希望应用程序将度量标准转发到HTTP端点。 Prometheus客户端库可用于此目的。 其他工具(如OpenCensusIstio)使用相同的格式。

6.使应用程序的健康状态可用。


在生产环境中管理应用程序的功能是可以将其状态报告给整个系统。 该应用程序正在运行吗? 可以吗 准备接收流量了吗? 他的行为如何? 解决此问题的最常见方法是实施健康检查 。 Kubernetes有两种类型: 活动性和就绪性探针

对于活动性探针,如果应用程序正在运行并且满足其主要依赖关系,则该应用程序必须具有HTTP端点,该端点返回“ 200 OK”响应。 对于就绪探针(检查服务是否就绪),应用程序必须具有不同的HTTP端点,如果应用程序处于正常状态,初始化步骤已完成且任何正确的请求都不会导致错误,则返回响应“ 200 OK”。 如果应用程序已根据这些检查准备就绪,Kubernetes只会将流量定向到容器。 如果活跃性和准备状态之间没有差异,则可以将两个端点组合在一起。

有关更多信息,请参阅Google开发者倡导者Sandeep Dinesh的相关文章:“ Kubernetes最佳实践:使用就绪和活跃度探针设置运行状况检查 。”

7.仔细选择图像的版本


大多数公共和私人图像使用的标记系统类似于“构建容器的最佳实践”中所述的标记系统。 如果映像使用的系统接近语义版本控制 ,则必须考虑标记的细节。 例如, latest标签通常可以在图像之间移动-如果您需要可预测和可复制的装配和安装,则不能依赖它。

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

译者的PS


另请参阅我们的博客:

Source: https://habr.com/ru/post/zh-CN425085/


All Articles