来自Pod内的Kubernetes部署名称吗?

Evg*_*ich 6 kubernetes google-kubernetes-engine

我如何获取从Pod内部生成当前Pod的Kubernetes部署/作业名称?

Jan*_*art 8

在许多情况下,Pod 的主机名等于 Pod 的名称(您可以通过 HOSTNAME 环境变量访问它)。然而,这不是确定 Pod 身份的可靠方法。

您将希望使用Downward API,它允许您将元数据公开为环境变量和/或卷上的文件。

Pod 的名称和命名空间可以作为环境变量(字段:metadata.namemetadata.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}
Run Code Online (Sandbox Code Playgroud)

太看输出了:

$ kubectl logs `kubectl get pod -l app=busybox -o name | cut -d / -f2`
Run Code Online (Sandbox Code Playgroud)

输出:

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"
Run Code Online (Sandbox Code Playgroud)


san*_*rma 6

如果您使用 Downwards API 从 pod 内部获取部署名称,并且您希望避免使用卷挂载方式 - 有一种固执己见的方法来获取部署信息,将其作为环境变量暴露给 pod 。

部署规范中指定的模板标签将作为 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
...

Run Code Online (Sandbox Code Playgroud)

这是部署时通常遵循的(同样,不一定适合您的情况)约定,以保持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']
Run Code Online (Sandbox Code Playgroud)

再次澄清,这不是您问题的保证解决方案,因为它仍然没有在环境变量中给出部署名称。这只是一种固执己见的方式,我发现它很有用,并且认为值得分享。

就我而言,有很多部署 (>20),我不想为每个部署配置手动添加部署名称作为环境变量。由于我的部署已经遵循上述约定,因此我只需将指定 NAMESPACE 和 DEPLOYMENT_NAME 变量的 yaml 部分复制到每个部署配置中

参考 :