Kubernetes kubectl 访问环境变量

Kubernetes kubectl access environment variables

有谁知道为什么这个没有(显示空行):

kubectl exec kube -- echo $KUBERNETES_SERVICE_HOST

但是这个有用吗?

kubectl exec kube -- sh -c 'echo $KUBERNETES_SERVICE_HOST'

运行 是否成功取决于您为 kube 使用的图像。但一般来说 echo 是一个 built-in Bourne shell 命令。

使用此命令:

$ kubectl exec kube -- echo $KUBERNETES_SERVICE_HOST

您没有实例化 Bourne Shell 环境并且容器中没有 echo 可执行文件。事实证明 kubectl 所做的基本上是 运行 echo $KUBERNETES_SERVICE_HOST 在您的客户端上!您可以尝试 运行 例如:

$ kubectl exec kube -- echo $PWD

您会看到这是您客户端上的主目录。

而使用此命令:

$ kubectl exec kube -- sh -c 'echo $KUBERNETES_SERVICE_HOST'

您的环境中有一个 sh 可执行文件,它是 Bourne Shell,它在您的默认容器中理解给定 Kubernetes 环境的 built-in echo 命令吊舱。

显示空行的原因与kubernetes或容器无关。在你的第一行中,$KUBERNETES_SERVICE_HOST 解释,shell 你在 中是 运行。并且您不能在 shell 中设置 KUBERNETES_SERVICE_HOST,因此它使用空字符串。

根据您所看到的情况,我推断您正在尝试找出 KUBERNETES_SERVICE_HOST 变量 inside 您的 kubernetes 容器的值。你的最后一个命令会为你做这件事,我怀疑下面的命令也会做同样的事情。

kubectl exec kube -- echo '$KUBERNETES_SERVICE_HOST'

一个通常在没有 sh -c 的情况下工作的选项是:

kubectl exec kube -- env | grep KUBERNETES_SERVICE_HOST

在以下命令的情况下:

kubectl exec kube -- echo $KUBERNETES_SERVICE_HOST

$KUBERNETES_SERVICE_HOST 从您的本地环境扩展而来。 shell 在执行命令之前执行 参数扩展 。通过参数扩展,如果我们拼错了一个变量的名称或者它没有定义,扩展仍然会发生,但会导致一个空字符串。 KUBERNETES_SERVICE_HOST 未在本地主机上定义,因此将导致空字符串。本质上这是将在容器中执行的命令:

kubectl exec kube -- echo

当我们想要抑制所有扩展时,我们使用单引号。因此,在这种情况下,以下命令有效,因为单引号抑制了参数扩展,并且命令未更改地传递给容器。

kubectl exec kube -- sh -c 'echo $KUBERNETES_SERVICE_HOST'