在下面的pod yaml中,我无法使source
命令工作。最初,我在echo starting
和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)
中的另一个podssh
时,在ssh
会话中看不到通过env
设置的Kubernetes环境变量。
任何帮助都将不胜感激!
在ssh登录时自动尝试设置环境变量下的建议后,有效的方法是替换
echo CONT1="mubu621" >> /etc/environment;
带有
echo CONT1="mubu621" >> /root/.bashrc;
并删除
lifecycle:
postStart:
exec:
command: ["/bin/bash","-c","source /etc/environment"]
不管怎样,这都不起作用。
当SSH从container mubu622
到container mubu621
时,我现在可以成功地执行具有mubu621
输出的echo $CONT1
,而不必首先执行source
/root/.bashrc
,这最初是在/etc/environment
中写入env_variable
的情况。
总之:当在kubernetes containers
中使用bash shell
时,您可以从另一个容器中SSH
和在/root/.bashrc
中写入的echo
变量,而不需要源代码(因为kubernetes env_variables
在ssh会话中不可用(。这非常有用,例如在多容器pod的情况下,这样您就可以知道您当前登录的容器
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文档中pod中env变量的信息