Kubernetes pod yaml:源命令不起作用

Posted

技术标签:

【中文标题】Kubernetes pod yaml:源命令不起作用【英文标题】:Kubernetes pod yaml: source command does not work 【发布时间】:2022-01-21 01:16:16 【问题描述】:

在以下 pod yaml 中,我无法让 source 命令工作。最初我在echo starting and echo done之间插入args下的命令,现在我尝试.lifecycle.postStart无济于事。

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 返回 nada! mubu6 是 ubuntu 修改后的镜像。

我这样做的原因是,当我在这个 pod (mubu621) 的另一个 pod 中 ssh 时,通过 env 设置的 Kubernetes 环境变量在 ssh 会话中看不到。

任何帮助将不胜感激!

【问题讨论】:

"/bin/bash","-c","source /etc/environment" 启动会话,源 /etc/environment,然后立即消失。这就是为什么您无法访问来源变量的原因。 那之后我还应该添加sleep 命令吗?在args 下,我最后确实有一个sleep 命令,它也不起作用。 我现在使用["/bin/bash","-c","source /etc/environment","sleep 3650d"],但我仍然不能echo $CONT1 【参考方案1】:

在尝试了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 mubu622 SSH 到container mubu621 后,我现在可以成功执行echo $CONT1 并输出mubu621不必先source /root/.bashrc,这是最初是在/etc/environment 中写入env_variable

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

【讨论】:

【参考方案2】:

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

说明

正如已经指出的 cmets 之一 - 您的 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 中阅读有关 pod 中环境变量的更多信息

【讨论】:

非常感谢 andrzejwp,但是正如我在问题中提到的那样,我已经尝试了您的建议,但是当我从另一个 pod 中 ssh 时不起作用。我想要一个变量,我可以在 echo 中使用 ssh session 对不起,最初没有得到那个部分。但是,如果您要通过 SSH 连接到 pod 并希望为每个连接设置该环境 - 我认为您应该查看 SSH 配置,甚至是 shell 本身。见unix.stackexchange.com/questions/101168/… 感谢您为我指明正确的方向 andrzejwp。

以上是关于Kubernetes pod yaml:源命令不起作用的主要内容,如果未能解决你的问题,请参考以下文章

第151天学习打卡(Kubernetes 集群YAML文件详解 Pod Controller)

Kubernetes集群核心概念 Pod

Kubernetes集群核心概念 Pod

kubernetes:如何编写 pod yaml 文件以将卷从主机映射到容器

kubernetes Pod 异常排错

Kubernetes Scheduler全解析