Kubernetes pod yaml:source命令不起作用



在下面的pod yaml中,我无法使source命令工作。最初,我在echo startingecho 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 mubu622container 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变量的信息

最新更新