【问题标题】:Kubernetes pod yaml: source command does not workKubernetes pod yaml:源命令不起作用
【发布时间】: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

标签: bash kubernetes yaml command kubernetes-pod


【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多