Kubernetes - 将容器信息作为环境变量暴露

4
我正在尝试将一些容器信息以环境变量的形式公开,从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

1
fieldPath: 是(生成的)Pod 中的路径,因此您应该删除前导的 spec.template。即便如此,API 文档列举了一组支持的对象字段,这可能是不可能的。 - David Maze
删除 spec.template 并仅添加 spec.containers[0].name 也不起作用。 - Avi
接受的答案是正确的。这里有一个备选方案,可以解决问题。 - SDH
2个回答

6

Downward API可以让你向运行在Pod内的进程公开该Pod自身的元数据。

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

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

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

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


1

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

其次,虽然我同意David的看法,怀疑kubernetes是否允许您运行任意的fieldPath:选择器,但如果您愿意在command:中灵活使用Pod自己的ServiceAccount,则可以在启动时查询kubernetes API来检索所有 Pod的信息,包括其status:结构,其中可能包含您需要的大量信息。


状态:具有各种属性,如podIP、hostIP、qosClass、phase、startTime、conditions和containerStatuses。containerStatuses具有名称但没有端口。我尝试通过执行以下操作检索容器的名称 status.containerStatuses[0].name 但是我收到了这个错误- 部署“nginx”无效:spec.template.spec.containers [0] .env [0] .valueFrom.fieldRef.fieldPath:无效值:“status.containerStatuses [0] .name”:转换fieldPath时出错:不支持字段标签:status.containerStatuses [0] .name - Avi
这证实了David所说的和我怀疑的:你不能使用任意的fieldPath:选择器。这意味着你将不得不覆盖command:和/或使用一个initContainer:来获取你想要的值。然而,这是你第一次提到端口;你是想要名称还是容器的端口?你的成功标准非常不明确,这使得任何人都无法帮助你。 - mdaniel
我所寻求的成功标准是创建Pod环境变量来映射容器名称和相应的端口。 - Avi
你又一次未能明确你的成功标准;是 MY_CONTAINER_NAME=name+":"+port 还是将其制作成 URL 或者是 MY_CONTAINER_NAME=nameMY_CONTAINER_PORT=port?此外,在 Kubernetes 中,Pod 通常没有身份标识 -- 如果你想让人们能够在给定端口上访问 Pod,那么 Service 就是解决这个问题的生命线 -- Pod 不应该向集群广告自己,因为它们可能随时死亡而没有任何警告,所以从这个角度来看,你可能正在解决错误的问题。 - mdaniel
这就是我所指的向下API... https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/.... 也许你对此还不太熟悉。我完全理解Kubernetes服务的概念,但我认为我要解决的问题与Kubernetes服务无关。 - Avi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接