注意事项 佩雷夫 :原始文章的作者是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 Storage ,
Persistent Disks ,
Redis ,
Cloud SQL或其他托管数据库。
( 注意翻译 : 请在我们的文章“ Kubernetes的运算符:如何运行有状态的应用程序 ”中了解有关此内容的更多信息。)不可变意味着容器在其生命周期内将不会被修改:没有更新,补丁,配置更改。 如果您需要更新应用程序代码或应用补丁,请创建一个新映像并进行部署。 建议将容器配置(侦听端口,
运行时选项等)移至外部(在
Secrets和
ConfigMaps中) 。 无需构建新的容器映像即可对其进行更新。 您可以使用
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客户端库可用于此目的。 其他工具(如
OpenCensus和
Istio)使用相同的格式。
6.使应用程序的健康状态可用。
在生产环境中管理应用程序的功能是可以将其状态报告给整个系统。 该应用程序正在运行吗? 可以吗 准备接收流量了吗? 他的行为如何? 解决此问题的最常见方法是实施
健康检查 。 Kubernetes有两种类型:
活动性和就绪性探针 。
对于活动性探针,如果应用程序正在运行并且满足其主要依赖关系,则该应用程序必须具有HTTP端点,该端点返回“ 200 OK”响应。 对于就绪探针
(检查服务是否就绪),应用程序必须具有不同的HTTP端点,如果应用程序处于正常状态,初始化步骤已完成且任何正确的请求都不会导致错误,则返回响应“ 200 OK”。 如果应用程序已根据这些检查准备就绪,Kubernetes只会将流量定向到容器。 如果活跃性和准备状态之间没有差异,则可以将两个端点组合在一起。
有关更多信息,请参阅Google开发者倡导者Sandeep Dinesh的相关文章:“
Kubernetes最佳实践:使用就绪和活跃度探针设置运行状况检查 。”
7.仔细选择图像的版本
大多数公共和私人图像使用的标记系统类似于
“构建容器的最佳实践”中所述的标记系统。 如果映像使用的系统接近
语义版本控制 ,则必须考虑标记的细节。 例如,
latest
标签通常可以在图像之间移动-如果您需要可预测和可复制的装配和安装,则不能依赖它。
您可以使用
XYZ
标签(它们几乎总是不变),但是在这种情况下,请跟踪所有补丁和图像更新。 如果您的图像带有
XY
标签,这是一个很好的中间选择。 通过选择它,您将自动收到补丁,同时依赖于该应用程序的稳定版本。
译者的PS
另请参阅我们的博客: