【问题标题】:How can I get the deployment name from within my container?如何从容器中获取部署名称?
【发布时间】:2022-04-14 15:19:14
【问题描述】:

我正在尝试使用向下 API 将部署名称设置为环境变量,但我的容器在没有任何日志记录的情况下不断崩溃。我正在使用busybox 来打印环境变量。我已经成功使用 Pod,但部署失败:这是我的 YAML:

--- 
apiVersion: apps/v1
kind: Deployment
metadata: 
  labels: 
    app: test-d
  name: test-deploy
spec: 
  replicas: 1
  selector: 
    matchLabels: 
      app: test-d
  template: 
    metadata: 
      labels: 
        app: test-d
    spec: 
      command: 
        - sh
        - "-c"
        - "echo Hello Kubernetes, I am $MY_DEPLOY_NAME in $MY_CLUSTER_NAME and $MY_NAMESPACE! && sleep 3600"
      containers: 
        - 
          image: busybox
          name: test-d-container
      env: 
        - 
          name: MY_DEPLOY_NAME
          valueFrom: 
            fieldRef: 
              fieldPath: metadata.name
        - 
          name: MY_NAMESPACE
          valueFrom: 
            fieldRef: 
              fieldPath: metadata.namespace
        - 
          name: MY_CLUSTER_NAME
          value: production

我错过了什么?

更新:

很明显,我的缩进搞砸了,感谢您指出这一点,但我的问题的主要部分仍然不清楚。如何从容器中获取部署名称?

【问题讨论】:

  • 用更多信息更新了我的答案
  • @fiunchinho 好的,谢谢,我会再开放一段时间,看看是否有人知道机制,如果没有,我会接受你的回答。您是否知道生成的 pod 名称是否总是恰好有两个带有数字作为 id 的破折号(例如“test-deploy-6bb8fb7f86-9whq4”)?如果是这样,我可以轻松地从 pod 名称中提取部署名称,这不是我更喜欢的方式,但它可以解决问题。
  • 是的,它始终是相同的结构。格式为deploymentName-replicaSetName-randomAlphanumericChars
  • @fiunchinho 我刚刚遇到一个 pod 名称,最后只有一个连字符。它没有添加第二个,只是用几个数字扩展了副本集的 id。这是为什么呢?
  • 可能没有 Deployment 对象,只是一个 ReplicaSet。而 pod 是由 ReplicaSet 创建的。你只得到 deploymentName 前缀是 ReplicaSet 是由 Deployment 创建的

标签: kubernetes


【解决方案1】:

您为部署对象使用了错误的缩进和结构。

command 键和env 键都是container 键的一部分。

这是正确的格式

--- 
apiVersion: apps/v1
kind: Deployment
metadata: 
  labels: 
    app: test-d
  name: test-deploy
spec: 
  replicas: 1
  selector: 
    matchLabels: 
      app: test-d
  template: 
    metadata: 
      labels: 
        app: test-d
    spec: 
      containers: 
        - image: busybox
          name: test-d-container
          command: 
            - sh
            - "-c"
            - "echo Hello Kubernetes, I am $MY_DEPLOY_NAME in $MY_CLUSTER_NAME and $MY_NAMESPACE! && sleep 3600"
          env: 
            - 
              name: MY_DEPLOY_NAME
              valueFrom: 
                fieldRef: 
                  fieldPath: metadata.name
            - 
              name: MY_NAMESPACE
              valueFrom: 
                fieldRef: 
                  fieldPath: metadata.namespace
            - 
              name: MY_CLUSTER_NAME
              value: production

请记住,您可以使用 this online validator 或本地 using kubeval 验证您的 Kubernetes 清单。

参考问题的主要部分,you can get the object that created the Pod,但很可能是 ReplicaSet,而不是 Deployment。

Pod 名称通常是由 Kubernetes 生成的,你事先并不知道,所以有一种机制来获取名称。但部署不是这种情况:您在创建部署时就知道部署的名称。我认为没有一种机制可以动态获取部署名称。

通常,在 Deployment 对象的 PodSpec 中使用标签来添加元数据。

您也可以尝试解析它,因为(您拥有的)pod 名称始终采用以下格式:deploymentName-replicaSetName-randomAlphanumericChars。

【讨论】:

  • 它现在可以正常部署,但 MY_DEPLOY_NAME 返回 Pod 的名称('test-deploy-6bb8fb7f86-9whq4'),而不是部署的名称。如何获取部署的名称('test-deploy')? fieldPath: metadata.name 怎么了?
  • Pod 名称一般是由 Kubernetes 生成的,你事先并不知道,所以才有了获取名称的机制。但部署不是这种情况:您在创建部署时就知道部署的名称。我认为没有一种机制可以动态获取部署名称。
【解决方案2】:

我没有看到任何从容器中获取部署名称的直接解决方案。我正在使用的解决方法是借助 pod 标签,

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app1-deployment
spec:
  template:
    metadata:
      labels:
        app: app1-deployment
    spec:
      containers:
        - name: container1
          image: nginx
          env:
            - name: DEPLOYMENT_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.labels['app']


...
...

我使用 app 作为标签名称,但部署名称也可能是更好的命名约定

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2015-10-31
    • 2016-03-11
    • 1970-01-01
    相关资源
    最近更新 更多