【问题标题】:Kubernetes Pod's containers not running when using sh commands使用 sh 命令时 Kubernetes Pod 的容器未运行
【发布时间】:2020-09-07 13:59:51
【问题描述】:

Pod 容器在运行 sh 命令(/bin/sh 也是如此)后,每次都没有准备好并反复停留在等待状态。 例如,在https://v1-17.docs.kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#define-container-environment-variables-with-data-from-multiple-configmaps 看到的所有 pod 容器在执行 sh 命令后会进入“完成”状态,或者如果我设置“restartPolicy: Always”,它们会因为 CrashLoopBackOff 而处于“等待”状态。 (如果我不对它们设置任何命令,容器就可以正常工作。 如果我在容器中使用 sh 命令,在创建它们之后,我可以使用“kubectl logs”读取 env 变量设置正确。

预期的行为是让 pod 的容器在执行 sh 命令后运行。

我找不到有关此特定问题的参考资料,如果可能的话,我需要一点帮助,非常感谢您!

请忽略我尝试了不同的图像,无论哪种方式都会出现问题。

环境:qemu VM 上的 Kubernetes v 1.17.1

yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
data:
  how: very
---
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: nginx
      ports:
      - containerPort: 88
      command: [ "/bin/sh", "-c", "env" ]
      env:
        # Define the environment variable
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              # The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEY
              name: special-config
              # Specify the key associated with the value
              key: how
  restartPolicy: Always

描述吊舱:

kubectl describe pod dapi-test-pod
Name:         dapi-test-pod
Namespace:    default
Priority:     0
Node:         kw1/10.1.10.31
Start Time:   Thu, 21 May 2020 01:02:17 +0000
Labels:       <none>
Annotations:  cni.projectcalico.org/podIP: 192.168.159.83/32
              kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"dapi-test-pod","namespace":"default"},"spec":{"containers":[{"command...
Status:       Running
IP:           192.168.159.83
IPs:
  IP:  192.168.159.83
Containers:
  test-container:
    Container ID:  docker://63040ec4d0a3e78639d831c26939f272b19f21574069c639c7bd4c89bb1328de
    Image:         nginx
    Image ID:      docker-pullable://nginx@sha256:30dfa439718a17baafefadf16c5e7c9d0a1cde97b4fd84f63b69e13513be7097
    Port:          88/TCP
    Host Port:     0/TCP
    Command:
      /bin/sh
      -c
      env
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Thu, 21 May 2020 01:13:21 +0000
      Finished:     Thu, 21 May 2020 01:13:21 +0000
    Ready:          False
    Restart Count:  7
    Environment:
      SPECIAL_LEVEL_KEY:  <set to the key 'how' of config map 'special-config'>  Optional: false
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-zqbsw (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  default-token-zqbsw:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-zqbsw
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason     Age                   From               Message
  ----     ------     ----                  ----               -------
  Normal   Scheduled  13m                   default-scheduler  Successfully assigned default/dapi-test-pod to kw1
  Normal   Pulling    12m (x4 over 13m)     kubelet, kw1       Pulling image "nginx"
  Normal   Pulled     12m (x4 over 13m)     kubelet, kw1       Successfully pulled image "nginx"
  Normal   Created    12m (x4 over 13m)     kubelet, kw1       Created container test-container
  Normal   Started    12m (x4 over 13m)     kubelet, kw1       Started container test-container
  Warning  BackOff    3m16s (x49 over 13m)  kubelet, kw1       Back-off restarting failed container

【问题讨论】:

  • ["/bin/sh", "-c", "env"] 这不是长期运行的过程。显示 env 后,容器将退出,因此 kubernetes 尝试重新启动它并进入 Back-off 状态。

标签: kubernetes containers


【解决方案1】:

发生这种情况是因为您正在运行的容器中的进程已完成并且容器已关闭,因此 kubernetes 将 pod 标记为已完成。

如果在 docker 映像中定义为 CMD 的一部分的命令,或者如果您已经添加了自己的命令,则容器将在命令完成后关闭。这与使用普通 docker 运行 Ubuntu 时它会启动然后直接关闭的原因相同。

要让 pod 及其底层 docker 容器继续运行,您需要启动一个将继续运行的进程。在您的情况下,运行 env 命令立即完成。

如果您将 pod 设置为始终重启,那么 kubernetes 将继续尝试重启它,直到达到它的回退阈值。

像您正在运行的一次性命令对于实用程序类型的东西很有用。 IE。做一件事,然后摆脱 pod。

例如:

kubectl run tester --generator run-pod/v1 --image alpine --restart Never --rm -it -- /bin/sh -c env

要运行更长的时间,请启动一个继续运行的进程。

例如:

kubectl run tester --generator run-pod/v1 --image alpine -- /bin/sh -c "sleep 30"

该命令将运行 30 秒,因此 pod 也将运行 30 秒。它还将使用 Always 的默认重启策略。因此,该过程在 30 秒后完成,Kubernetes 将 pod 标记为已完成,然后重新启动它以再次执行相同的操作。

通常 pod 会启动一个长时间运行的进程,例如 Web 服务器。为了让 Kubernetes 知道该 pod 是否健康,因此它可以发挥高可用性魔法并在它兑现时重新启动它,它可以使用 readiness and liveness probes

【讨论】:

  • 非常感谢您的详细回答和非常有用的信息!
【解决方案2】:

您可以使用此清单;命令["/bin/sh", "-c"] 表示“运行一个shell,并执行以下指令”。然后将 args 作为命令传递给 shell。多行参数使其简单易读。您的 pod 将显示其环境变量,并在不停止的情况下启动 NGINX 进程:

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
data:
  how: very
---
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: nginx
      ports:
        - containerPort: 88
      command: ["/bin/sh", "-c"]
      args:
        - env;
          nginx -g 'daemon off;';
      env:
        # Define the environment variable
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              # The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEY
              name: special-config
              # Specify the key associated with the value
              key: how
  restartPolicy: Always

【讨论】:

  • 非常感谢,您发布的清单完全符合预期,我更了解容器内部循环!
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 2021-07-10
  • 2021-04-26
  • 2020-05-13
  • 2016-04-08
  • 2023-04-05
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多