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
时,您可以从另一个容器中SSH
和echo
变量写入/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)