kubernetes-将容器信息公开为环境变量
我正在尝试将一些容器信息公开为env变量,从pod的spec.template.spec.containers[0].name读取值,该变量似乎不起作用。引用部署模板内容器字段的apiSpec是什么。部署模板如下所示: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
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服务有关。