簡體   English   中英

Kubernetes 吊艙 yaml:源命令不起作用

[英]Kubernetes pod yaml: source command does not work

在以下 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 修改后的圖像。

The reason I am doing this, is because when I ssh from another pod in this pod (mubu621) , Kubernetes environment variables set through env are not seen in the ssh session.

任何幫助將非常感激!

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 中環境變量的更多信息

在嘗試了set-environment-variable-automatically-on-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 ,我現在可以使用mubu621 output 成功執行echo $CONT1而無需首先獲取/root/.bashrcsource ,最初是在/etc/environment中寫入env_variable的情況。

In summary: when using a bash shell in kubernetes containers , you can SSH from another container and echo variables written in /root/.bashrc without first sourcing. 這非常有用,例如在multi-container pods的情況下,因此您可以知道當前登錄的容器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM