从自身内部获取 Kubernetes POD 的完整 ID(正在运行的容器)

Kun*_*mar 6 logging containers kubernetes

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

api*_*sim 14

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

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

  • @EngineerDollery——也许我的答案并不清楚——在 Kubernetes pod 中运行的容器中可用的 HOSTNAME 环境变量是 pod 的唯一名称,与 k8s 节点/VM/服务器主机无关。因此,根据我的回答中的假设,它可以用于记录目的,代替某些容器 ID 来识别应用程序_instance_ 曾经/正在运行的位置。当来自所有应用程序容器的日志与系统级日志一起发送到单个位置进行分析和关联(Stackdriver、Splunk、Elastic...)时,它实际上很有用。 (2认同)

dam*_*j07 8

有两种方法可以将 Pod 和 Container 字段公开给正在运行的 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
Run Code Online (Sandbox Code Playgroud)

参考链接。