说我有以下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
。
答案 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