17.4.1 构建可管理的容器镜像

FROM scratch

可以将需要的工具也打包到镜像中.

17.4.2 合理地给镜像打标签, 正确地使用 ImagePullPolicy

不要使用 latest.

  • 如果你使用的是可更改的标签(总是向相同的标签推送更改),那么你需要在 pod spec 中将 imagePullPolicy 设置为 Always 。

17.4.3 使用多维度而不是单维度的标签

给所有的资源都打上标 签,而不仅仅是 pod

标签可以包含如下的内容

image.png

17.4.4 通过注解描述每个资源

资源至少应该包括一个描述资源的注解和 一个描述 资源负责人的注解。

在微服务框架中, pod 应该包含 一 个注解来描述该 pod 依赖的 其他服务的名称。这样就很容易展现 pod 之间的依赖关系了。其他的注解可以包括构建和版本信息,以及其他工具或者图形界面会使用到的元信息(图标名称等)。

17.4.5 给进程终止提供更多的信息

把所有必需的调试信息都写到日志文件中 。

或者写入 /dev/termination-log, kubelet 可以读取该文件, 并且可以用 kubectl describe pod 命令查看.

  • 可以用 pod spec.terminationMessagePath 字段更改路径

使用例子:

image.png

查看退出原因:

image.png

如果容器没有向任何文件写入消息,可以将 terminationMessagePolicy 字段的值设直为 FallbackToLogsOnError。 在这种情况下,容器的最后几行 日志会被当作终止消息(当然仅当容器没有成功终止的情况 下 )。

17.4.6 处理应用日志

应用应该将日志写到标准输出终端而不是文件中。这样可以很容易地通过 kubectl logs 命令来查看应用日志 。

查看之前 pod 的日志需要使用 --previous 选项.

将日志或者其他文件复制到容器或者从容器中复制出来

kubectl cp

  1. $ kubectl cp foo-pod:/var/log/foo.log foo.log
  2. $ kubectl cp localfile foo-pod:/etc/remotefile
  3. # 可以使用 -c 指定容器

使用集中式日志记录

  • ELK
  • EFK

image.png

处理多行日志输出

  • 可以输出 json 格式