如何获取从pod中生成当前pod的Kubernetes部署/作业名称?
答案 0 :(得分:2)
在许多情况下,Pod的主机名等于Pod的名称(您可以通过HOSTNAME环境变量访问它)。然而,这并不是确定Pod身份的可靠方法。
您将希望使用Downward API,它允许您将元数据公开为卷上的环境变量和/或文件。
Pod的名称和命名空间可以作为环境变量(字段:metadata.name
和metadata.namespace
)公开,但有关Pod创建者的信息(注释 kubernetes.io/created-by
)只能作为文件公开。
示例:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: busybox
labels: {app: busybox}
spec:
selector: {matchLabels: {app: busybox}}
template:
metadata: {labels: {app: busybox}}
spec:
containers:
- name: busybox
image: busybox
command:
- "sh"
- "-c"
- |
echo "I am $MY_POD_NAME in the namespace $MY_POD_NAMESPACE"
echo
grep ".*" /etc/podinfo/*
while :; do sleep 3600; done
env:
- name: MY_POD_NAME
valueFrom: {fieldRef: {fieldPath: metadata.name}}
- name: MY_POD_NAMESPACE
valueFrom: {fieldRef: {fieldPath: metadata.namespace}}
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo/
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef: {fieldPath: metadata.labels}
- path: "annotations"
fieldRef: {fieldPath: metadata.annotations}
太看输出了:
$ kubectl logs `kubectl get pod -l app=busybox -o name | cut -d / -f2`
输出:
I am busybox-1704453464-m1b9h in the namespace default
/etc/podinfo/annotations:kubernetes.io/config.seen="2017-02-16T16:46:57.831347234Z"
/etc/podinfo/annotations:kubernetes.io/config.source="api"
/etc/podinfo/annotations:kubernetes.io/created-by="{\"kind\":\"SerializedReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"ReplicaSet\",\"namespace\":\"default\",\"name\":\"busybox-1704453464\",\"uid\":\"87b86370-f467-11e6-8d47-525400247352\",\"apiVersion\":\"extensions\",\"resourceVersion\":\"191157\"}}\n"
/etc/podinfo/annotations:kubernetes.io/limit-ranger="LimitRanger plugin set: cpu request for container busybox"
/etc/podinfo/labels:app="busybox"
/etc/podinfo/labels:pod-template-hash="1704453464"
答案 1 :(得分:0)
如果您使用 Downwards API 从 pod 内部获取部署名称,并且您想避免使用卷挂载方式 - 有一种自以为是的方式来获取部署信息,将其作为 环境变量公开给 pod< /strong>。
部署规范中指定的模板标签作为 pod 标签添加到该部署的每个 pod。
示例:下面的 app
标签将添加到此部署的所有 Pod 中
...
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
...
这是部署的普遍遵循(同样,对于您的情况不一定适用)约定,以保持 app
标签值与部署名称相同,如上面的例子。如果你的部署遵循这个约定(我的就是这样做的),你可以使用 downs API 将这个标签的值(本质上是部署的名称)作为环境变量公开给 pod
继续上面的例子:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: DEPLOYMENT_NAME
valueFrom:
fieldRef:
fieldPath: metadata.labels['app']
再次澄清,这不是您问题的保证解决方案,因为它仍然没有在环境变量中提供部署名称。这只是我认为有用的一种固执己见的方式,并认为很适合分享。
就我而言,有很多部署 (>20),我不想为每个部署配置手动添加部署名称作为环境变量。由于我的部署已经遵循上述约定,我只是将指定 NAMESPACE 和 DEPLOYMENT_NAME 变量的 yaml 部分复制到每个部署配置
参考: