Kubernetes pod yaml:源命令不起作用
Kubernetes pod yaml: source command does not work
在下面的 pod yaml 中,我无法使 source
命令起作用。最初我在 and now I tried 之间插入 args
下的命令无济于事。
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
returns nada! mubu6
是 ubuntu 修改后的图像。
我这样做的原因是因为当我从这个 pod (mubu621)
中的另一个 pod ssh
时,通过 env
设置的 Kubernetes 环境变量在 ssh
届会.
如有任何帮助,我们将不胜感激!
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
中阅读 pods 中有关 env 变量的更多信息
在尝试 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
到 container mubu621
的 SSH-ing 后,我现在可以成功执行 echo $CONT1
并输出 mubu621
, 而无需 source
/root/.bashrc
first,最初是在 /etc/environment
.
中写 env_variable
的情况
总结: 在 kubernetes containers
中使用 bash shell
时,您可以从另一个容器 SSH
和 echo
变量用 /root/.bashrc
编写,没有采购(因为 kubernetes env_variables
在 ssh 会话中不可用)。
这非常有用,例如在 多容器 pods 的情况下,这样您就可以知道当前登录的容器。
在下面的 pod yaml 中,我无法使 source
命令起作用。最初我在 args
下的命令无济于事。
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
returns nada! mubu6
是 ubuntu 修改后的图像。
我这样做的原因是因为当我从这个 pod (mubu621)
中的另一个 pod ssh
时,通过 env
设置的 Kubernetes 环境变量在 ssh
届会.
如有任何帮助,我们将不胜感激!
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
中阅读 pods 中有关 env 变量的更多信息
在尝试 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
到 container mubu621
的 SSH-ing 后,我现在可以成功执行 echo $CONT1
并输出 mubu621
, 而无需 source
/root/.bashrc
first,最初是在 /etc/environment
.
env_variable
的情况
总结: 在 kubernetes containers
中使用 bash shell
时,您可以从另一个容器 SSH
和 echo
变量用 /root/.bashrc
编写,没有采购(因为 kubernetes env_variables
在 ssh 会话中不可用)。
这非常有用,例如在 多容器 pods 的情况下,这样您就可以知道当前登录的容器。