【问题标题】:Get a Kubernetes POD's full Id from inside of itself ( running container )从自身内部获取 Kubernetes POD 的完整 ID(运行容器)
【发布时间】:2020-03-07 02:08:52
【问题描述】:

如何在 Kubernetes 中从自身内部获取容器的完整 ID。我想在作为 Kubernetes 容器运行的应用程序日志中添加容器 ID

【问题讨论】:

  • 一般来说,对于 K8S,如果你在谈论容器,你就会错过 K8S 的意义。除非您正在调试部署本身,否则您通常会在服务级别而不是容器级别登录。
  • 他特别写道,他希望查看特定于容器的日志记录,这也可能在服务级别上。所以我认为这是一个很好的观点。 podname 的当前值与主机名相同,因此在基于 Linux 的 pod 中运行 hostname 命令可以得到,假设容器是指 pod。

标签: logging kubernetes containers


【解决方案1】:

有两种方法可以将 Pod 和 Container 字段暴露给正在运行的 容器:

  • 环境变量
  • 卷文件

这两种暴露 Pod 和 Container 字段的方式是 称为 Downward API。

因此,只需使用环境变量,您就可以将 pod 的任何元数据注入正在运行的容器中。


发表评论更新 - 根据 kubernetes 文档,每个名称都有一个附加到资源名称的 UID,例如,将提供一种获取方式的 pod 或容器用于记录的唯一 ID。

metadata.name = myimage + unique id

注意* - 这里唯一需要注意的是,每次升级时 UID 都会发生变化,因此最好从您这边分配一个唯一 ID,以结合 K8 UID 来识别容器或 pod。

这是 YAML 的一个示例。

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-fieldref
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;
          printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT;
          sleep 10;
        done;
      env:
        - name: MY_POD_ID   // <--- here you inject env into container
          valueFrom:
            fieldRef:
              fieldPath: metadata.name   // <--- set value of the env var to pod name
        - name: MY_POD_SERVICE_ACCOUNT
          valueFrom:
            fieldRef:
              fieldPath: spec.serviceAccountName
  restartPolicy: Never

reference link.

【讨论】:

  • 名称中有ID,这取决于您需要什么ID。根据问题,目的是为每个容器添加一个唯一标识符。根据 Kubernetes 命名约定,pod-namemetadata.name' is composed of imagename_uniqid`
  • 请接受答案,以便对其他人有用。
【解决方案2】:

HOSTNAME 环境变量可在 Kubernetes 上运行的任何容器中轻松使用,并提供运行容器的 pod 的唯一名称。使用日志框架提供的方法来访问环境变量并使其成为日志模式的一部分,或者以编程方式将其值添加到日志条目中。

假设 pod 中只有一个 application 容器,这应该用于应用程序日志记录目的(无论如何这被认为是最佳实践)。

【讨论】:

  • 但这并不能真正回答问题,是吗? pod 的主机名与容器 id 有什么关系?
  • @EngineerDollery - 也许我的回答不清楚 - 在 Kubernetes pod 中运行的容器中可用的 HOSTNAME 环境变量是 pod 的唯一名称,与 k8s 节点无关/VM/服务器主机。因此,根据我的回答中的假设,它可以用于记录目的,而不是某些容器 id,以识别应用程序 instance 曾经/正在运行的位置。当来自所有应用程序容器的日志与系统级日志一起发送到一个位置以进行分析和关联(Stackdriver、Splunk、Elastic...)时,它实际上很有用。
  • @apisim 实际上我想在 pod 级别识别日志(log4j)(唯一的容器在 pod 内运行)。我在 SystemProperty 中设置 hostName 但问题是应用程序在应用程序服务器(weblogic 服务器)启动之前运行,因此它没有反映在日志中
猜你喜欢
  • 2019-11-22
  • 1970-01-01
  • 2020-05-13
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2021-04-26
相关资源
最近更新 更多