kubernetes-将容器信息公开为环境变量

kubernetes-将容器信息公开为环境变量,kubernetes,kubernetes-deployment,Kubernetes,Kubernetes Deployment,我正在尝试将一些容器信息公开为env变量,从pod的spec.template.spec.containers[0].name读取值,该变量似乎不起作用。引用部署模板内容器字段的apiSpec是什么。部署模板如下所示: apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: run: nginx name: nginx

我正在尝试将一些容器信息公开为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

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


第二,虽然我同意David的观点,我怀疑kubernetes是否会让您运行任意的
字段路径:
选择器,但如果您愿意灵活地使用
命令:
,您实际上可以使用Pod自己的
服务帐户
在启动时查询kubernetes API来检索Pod的所有信息,包括其
状态:
结构,该结构可能包含大量您需要的信息。

向下API使您能够向进程公开pod自己的元数据 在那个舱里跑

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

  • 豆荚的名字
  • pod的IP地址
  • pod所属的命名空间
  • pod正在运行的节点的名称
  • pod正在运行的服务帐户的名称
  • 每个容器的CPU和内存请求
  • 每个容器的CPU和内存限制
  • 吊舱的标签
  • 吊舱的注释
就这样。如您所见,容器端口不在此列表中


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

字段路径:
是(生成的)pod中的路径,因此您应该删除前导的
spec.template
。即使如此,枚举一组受支持的对象字段,这可能是不可能的。删除
spec.template
并仅添加
spec.containers[0]。name
也不起作用。接受的答案为true。下面是一个可以工作的。状态:具有各种属性,如podIP、hostIP、qosClass、phase、startTime、CONTAINERSTATUS。ContainerStatus有名称,但没有端口。我尝试通过执行此操作来检索容器的名称。containerStatuses[0]。name和我收到此错误-部署“nginx”无效:spec.template.spec.containers[0]。env[0]。valueFrom.fieldRef.fieldPath:无效值:“status.containerStatuses[0]。name”:转换字段路径时出错:不支持字段标签:状态。ContainerStatus[0]。确认David所说和我所怀疑的内容的名称:不能使用任意
字段路径:
选择器。这意味着您必须重写
命令:
和/或使用
initContainer:
获取所需的值。然而,这是你第一次提到港口;您是在输入名称还是容器的端口?您的成功标准指定得非常糟糕,因此任何人都无法帮助您我正在寻找的成功标准-正在创建Pod env变量以映射容器名称和相应的端口。您再次未能指定成功标准;它是
MY_CONTAINER\u NAME=NAME+”:“+port
还是用它制作URL,还是
MY_CONTAINER\u NAME=NAME
MY_CONTAINER\u port=port
?此外,传统上,在kubernetes中,Pod没有身份——如果您希望人们能够在给定端口上访问
Pod
,这就是
Service
在生活中所做的事情——Pod不应该向集群宣传自己,因为它们随时都可能在没有警告的情况下死亡,这样看来,很可能你解决了错误的问题,这就是我所说的向下API。。。。也许你是新来的。我完全理解kubernetes服务的概念,但我不认为我试图解决的问题与kubernetes服务有关。