Kubernetes pod yaml:源命令不起作用

Kubernetes pod yaml: source command does not work

在下面的 pod yaml 中,我无法使 source 命令起作用。最初我在 and now I tried 之间插入 args 下的命令无济于事。

apiVersion: v1
kind: Pod
metadata:
  name: mubu62
  labels:
    app: mubu62
spec:
  containers:
  - name: mubu621
    image: dockreg:5000/mubu6:v6
    imagePullPolicy: Always
    ports:
    - containerPort: 5021
    command: ["/bin/sh","-c"]
    args: 
    - echo starting;
      echo CONT1=\"mubu621\" >> /etc/environment;
      touch /mubu621;
      sed -i 's/#Port 22/Port 5021/g' /etc/ssh/sshd_config;
      sleep 3650d;
      echo done;
    lifecycle:
      postStart:
        exec:
          command: ["/bin/bash","-c","source /etc/environment"]
  - name: mubu622
    image: dockreg:5000/mubu6:v6
    imagePullPolicy: Always
    ports:
    - containerPort: 5022
  imagePullSecrets:
  - name: regcred
  nodeName: spring
  restartPolicy: Always

Kubectl apply 没有错误,但是 echo $CONT1 returns nada! mubu6 是 ubuntu 修改后的图像。

我这样做的原因是因为当我从这个 pod (mubu621) 中的另一个 pod ssh 时,通过 env 设置的 Kubernetes 环境变量在 ssh届会.

如有任何帮助,我们将不胜感激!

TLDR

将 env 变量移动到 pod 规范的 env 部分:

apiVersion: v1
kind: Pod
metadata:
  name: mubu62
  labels:
    app: mubu62
spec:
  containers:
  - name: mubu621
    image: dockreg:5000/mubu6:v6
    imagePullPolicy: Always
    ports:
    - containerPort: 5021
    command: ["/bin/sh","-c"]
    env:
    - name: CONT1
      value: mubu621

说明

正如已经指出的评论之一 - 您的 source 命令可能有效,但仅在执行它的上下文中有效。如果您希望将此应用于其他命令 - 使用容器规范的 env 字段。考虑这个使用 busybox 的简约示例:

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  - name: busybox
    image: busybox
    command: ["/bin/sh", "-ec", "sleep 1000"]
    env:
    - name: TEST_ENV
      value: "test_val"

有了这个 - 当您 运行 在 pod 中执行 env 命令时 - 您会看到 TEST_ENV 按预期显示:

$ kubectl exec -it busybox-6d467f94db-sj9nz env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=busybox-6d467f94db-sj9nz
TERM=xterm
TEST_ENV=test_val
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOME=/root

Kubernetes docs

中阅读 pods 中有关 env 变量的更多信息

在尝试 set-environment-variable-automatically-upon-ssh-login 下的建议后,有效的方法是替代

echo CONT1=\"mubu621\" >> /etc/environment;

echo CONT1=\"mubu621\" >> /root/.bashrc;

并删除

lifecycle:
      postStart:
        exec:
          command: ["/bin/bash","-c","source /etc/environment"]

无论如何都行不通。

container mubu622container mubu621 的 SSH-ing 后,我现在可以成功执行 echo $CONT1 并输出 mubu621 而无需 source /root/.bashrc first,最初是在 /etc/environment.

中写 env_variable 的情况

总结:kubernetes containers 中使用 bash shell 时,您可以从另一个容器 SSHecho 变量用 /root/.bashrc 编写,没有采购(因为 kubernetes env_variables 在 ssh 会话中不可用)。 这非常有用,例如在 多容器 pods 的情况下,这样您就可以知道当前登录的容器。