课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
系统运维和软件运维其实在基础操作层面上的技术是比较接近的。今天,我们就一起来了解一下,使用容器来进行日志记录都有哪些操作要求。
使用容器的原生日志记录机制
重要性:高
作为应用程序管理的一部分,日志中包含宝贵的信息,可让人了解应用程序中发生的事件。Docker 和Kubernetes 致力于简化日志管理。
在传统服务器上,你可能需要将日志写入特定文件并处理日志轮换以避免填满磁盘。如果有高级日志系统,则可以将这些日志转发到远程服务器来集中它们。
通过容器可以将日志写入stdout 和stderr,因而容器提供了一种简单且标准化的方式来处理日志。Docker 捕获这些日志行,并允许你使用docker logs 命令访问它们。作为应用程序开发人员,你不需要实现高级日志记录机制,试试用原生的日志记录机制吧。
平台运营商必须提供一个系统来集中日志并进行搜索,你可以使用Kubernetes Engine 提供的 fluentd 和 Stackdriver Logging。其他常见方法包括使用 EFK (Elasticsearch,Fluentd,Kibana)栈。
JSON 日志
大多数日志管理系统实际上是时序数据库,用于存储时间索引文档。这些文档通常以JSON 格式提供。在Stackdriver Logging 和EFK 中,单个日志行和一些元数据(容器组、容器、节点等相关信息)一起被存储为一个文档。
你可以直接通过将不同字段以JSON 格式进行日志记录。然后,可以根据这些字段更有效地搜索日志。
边车模式的记录聚合器
某些应用程序(如 Tomcat)无法通过简单配置来生成日志。这些应用程序在磁盘上写入不同的日志文件,所以在Kubernetes 中处理它们的佳方法是使用边车模式进行日志记录。边车是一个小容器,与应用程序在同一个pod中运行。有关边车的更详细信息,请参阅Kubernetes 官方文档。
在这种解决方案中,你为应用程序的边车容器添加一个日志代理(在同一pod中,)并在两个容器之间共享 emptyDir 卷,示例:GitHub 上的这个YAML 示例。然后,配置应用程序将日志写入共享卷,接着配置日志代理进行读取,并转发到需要的地方。
确保容器是无状态且不可变的
重要性:高
如果你是一次尝试容器,请不要将它们视为传统服务器。比如,你可能想要在正在运行的容器内更新应用程序,或者在出现漏洞时给正在运行的容器打补丁。从根本上说,容器不是以这种方式工作的。它们被设计成了无状态且不可改变。
无状态
无状态意味着任何状态(任何类型的持久数据)都存储在容器之外。这个外部存储可以采取多种形式,具体取决于你的需求:
1.要存储文件,我们建议使用Cloud Storage等对象存储。
2.要存储用户会话等信息,我们建议使用外部的低延迟键值存储,例如 Redis 或Memcached。
3.如果需要块级存储(例如数据库),则可以使用连接到容器的外部磁盘。对于Kubernetes Engine,我们建议使用 持久化磁盘。
通过以上方法将数据从容器本身中移出,这意味着可以随时干净地关闭和销毁容器,而不必担心数据丢失。如果创建了一个新容器来替换旧容器,则只需将新容器连接到同一数据存储区或将其绑定到同一磁盘即可。
不变性
不可变意味着容器在其生命周期内不会被修改:没有更新,没有补丁,没有配置更改。如果必须更新应用程序代码或打补丁,则需要构建新镜像并重新部署。不变性使部署更安全,更可重复。如果需要回滚,只需重新部署旧镜像即可。此方法允许你在每个环境中部署相同的容器镜像,使它们尽可能一致。
为了在不同环境中使用相同的容器镜像,我们建议你外部化容器配置(侦听端口,运行时选项等)。容器通常配置有环境变量或挂载到特定路径上的配置文件。在Kubernetes中,你可以使用保密字典和配置集作为环境变量或文件将配置注入到容器中。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。