4

我试图将一些容器信息公开为 env 变量,从 pod 的 spec.template.spec.containers[0].name 读取值,这似乎不起作用。在部署模板中引用容器字段的 apiSpec 是什么。部署模板如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      creationTimestamp: null
      labels:
        run: nginx
      name: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          run: nginx
              strategy: {}
       template:
         metadata:
           creationTimestamp: null
            labels:
             run: nginx
        spec:
          containers:
           - image: nginx
            name: nginx
              ports:
             - containerPort: 8000
             resources: {}
            env:
             - name: MY_CONTAINER_NAME
                valueFrom:
                  fieldRef:
                    fieldPath: spec.template.spec.containers[0].name
4

2 回答 2

5

Downward API 使您能够将 pod 自己的元数据公开给在该 pod 内运行的进程。

目前,它允许您将以下信息传递给您的容器:

  • 豆荚的名称
  • Pod 的 IP 地址
  • pod 所属的命名空间
  • 运行 pod 的节点的名称
  • pod 正在运行的服务帐户的名称
  • 每个容器的 CPU 和内存请求
  • 每个容器的 CPU 和内存限制
  • 豆荚的标签
  • Pod 的注解

就是这样。如您所见,容器端口不在此列表中。

通常,通过 Downward API 可用的元数据相当有限。如果您需要更多,您需要直接从 Kubernetes API 服务器获取它,您可以使用客户端库或使用大使容器来完成。

于 2020-05-04T14:41:36.273 回答
1

两件事:首先,容器名称是固定的——它是由 PodSpec 模板定义的——你可能在想 docker容器的名称(这将是一个由命名空间、容器名称、pod UID 和重启组成的长生成名称数数)?因为 docker 容器的名称肯定不会出现在.spec.containers[0].name

其次,虽然我同意 David 的观点,我怀疑 kubernetes 会让您运行任意fieldPath:选择器,但如果您愿意灵活地使用您的选择器,您command:实际上可以使用 Pod 自己ServiceAccount在启动时查询 kubernetes API 以检索所有Pod 的信息,包括它的status:结构,它可能包含您需要的大量信息。

于 2019-06-10T04:20:04.977 回答