是否可以从kubernetes中的容器中获取容器名称?

时间:2017-09-26 05:27:14

标签: kubernetes

说我有以下pod规范。

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  # Unique key of the Deployment instance
  name: deployment-example
spec:
  # 3 Pods should exist at all times.
  replicas: 3
  template:
    metadata:
      labels:
        # Apply this label to pods and default
        # the Deployment label selector to this value
        app: nginx
    spec:
      containers:
      - name: nginx
        # Run this image
        image: nginx:1.10

此处,容器的名称为nginx。有没有办法从正在运行的容器中获取“nginx”字符串?

我的意思是,一旦我用

之类的东西进入容器
kubectl exec -it <pod-name> -c nginx bash

是否有一种编程方式来获取pod规范中的给定容器名称?

请注意,这不一定是在docker ps中打印的泊坞窗容器名称。 Kubernetes为生成的docker容器组成了一个更长的名称。

downward api在这方面看起来很有希望。但container name部分未提及Capabilities of the Downward API

3 个答案:

答案 0 :(得分:1)

通过向下api无法使用容器名称。您可以使用yaml anchors and aliases (references)。不幸的是,它们没有作用域,所以你必须为锚点提供唯一的名称 - 它们是什么并不重要,因为它们存在于已解析的文档中。

  

先前序列化节点的后续出现被表示为别名节点。节点的第一次出现必须用锚标记,以允许后续出现作为别名节点。

     

别名节点由“*”指示符表示。 别名是指具有相同锚点的最新前一个节点。别名节点使用先前未在文档中出现的锚点是错误的。指定任何别名节点未使用的锚点都不是错误。

First occurrence: &anchor Foo
Second occurrence: *anchor
Override anchor: &anchor Bar
Reuse anchor: *anchor

以下是一个完整的工作示例:

apiVersion: v1
kind: Pod
metadata:
  name: reftest
spec:
  containers:
  - name: &container1name first
    image: nginx:1.10
    env:
    - name: MY_CONTAINER_NAME
      value: *container1name
    - name: MY_POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
  - name: &container2name second
    image: nginx:1.10
    env:
    - name: MY_CONTAINER_NAME
      value: *container2name
    - name: MY_POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name

答案 1 :(得分:0)

不确定部署中的容器名称是否可用。

对于部署名称,在OpenShift中用于部署配置(可能是Kubernetes部署)的一种方法是获取HOSTNAME环境变量的值,其形式为{{1} }。

从第二个<deployment-name>-<deployment-number>-<random-string>开始删除,并且主要组件是部署名称。

可能会有点麻烦,但是可以通过基于该部署名称查询部署资源对象的REST API以某种方式推断容器名称。

在具体名称之后你具体是什么?如果知道你需要它,可能会建议其他选择。

答案 2 :(得分:0)

如何使用容器主机名然后切断生成的组件?

$ kubectl exec alpine-tools-645f786645-vfp82 hostname | cut -d- -f1,2
alpine-tools

虽然这非常依赖于你如何命名Pods / containers ..

$ kubectl exec -it alpine-tools-645f786645-vfp82 /bin/sh
/ # hostname 
alpine-tools-645f786645-vfp82
/ # hostname | cut -d- -f1,2
alpine-tools