kubernetes - 在 kubernetes 中使用 CrashLoopBackOff 状态重新部署 statefulset

标签 kubernetes kubernetes-helm kubectl

我就是做这个的:

  • 部署有状态集。 pod 将始终退出并出现错误以引发状态为 CrashLoopBackOff 的失败 pod。 :kubectl apply -f error.yaml
  • 更改 error.yaml ( echo a => echo b ) 并重新部署有状态集:kubectl apply -f error.yaml
  • Pod 保持错误状态,不会立即重新部署,而是等待一段时间后重新启动 Pod。

  • 请求 pod 状态:
    $ kubectl get pod errordemo-0
    NAME          READY   STATUS             RESTARTS   AGE
    errordemo-0   0/1     CrashLoopBackOff   15         59m
    
    错误.yaml
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: errordemo
      labels:
        app.kubernetes.io/name: errordemo
    spec:
      serviceName: errordemo
      replicas: 1
      selector:
        matchLabels:
          app.kubernetes.io/name: errordemo
      template:
        metadata:
          labels:
            app.kubernetes.io/name: errordemo
        spec:
          containers:
            - name: demox
              image: busybox:1.28.2
              command: ['sh', '-c', 'echo a; sleep 5; exit 1']
          terminationGracePeriodSeconds: 1
    
    问题
    即使 pod 处于错误状态,我如何实现立即重新部署?
    我找到了这些解决方案,但我想有一个命令来实现它(在现实生活中,我正在使用 helm,我只想为我的部署调用 helm upgrade):
  • 在重新部署之前杀死 pod
  • 重新部署前缩小规模
  • 在重新部署之前删除 statefulset

  • 为什么 kubernetes 不立即重新部署 pod?
  • 在我的演示示例中,我必须等到 kubernetes 在等待一段时间后尝试重新启动 pod。
  • 没有错误的 pod(例如 echo a; sleep 10000;)将立即重新启动。这就是为什么我设置 terminationGracePeriodSeconds: 1
  • 但在我的实际部署中(我使用 helm),我也遇到了 pod 从未重新部署的情况。不幸的是,我无法在一个简单的示例中重现这种行为。
  • 最佳答案

    您可以设置 spec.podManagementPolicy: "Parallel"

    Parallel pod management tells the StatefulSet controller to launch or terminate all Pods in parallel, and not to wait for Pods to become Running and Ready or completely terminated prior to launching or terminating another Pod.


    请记住,默认的 podManagementPolicy 是 OrderedReady

    OrderedReady pod management is the default for StatefulSets. It tells the StatefulSet controller to respect the ordering guarantees demonstrated above


    如果您的应用程序需要有序更新,那么您无能为力。

    关于kubernetes - 在 kubernetes 中使用 CrashLoopBackOff 状态重新部署 statefulset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66612592/

    相关文章:

    kubernetes - 列出与 helm 部署或图表相关的所有 kubernetes 资源

    kubernetes - 运行kubeadm重置后的问题

    elasticsearch - 如何将Kibana Pod连接到Kubernetes中的Elastic集群

    linux - 用于在日常基础知识中查找 kubernetes 中新添加的 pod 的 Shell 脚本

    Kubernetes 节点上的 Jenkins 提示其插件需要更新版本的 Jenkins,但又不想丢失数据

    使用 Kubernetes Helm install values.yaml 的 Nginx-ingress 设置注释

    docker - 如何使用 Docker for Windows 访问本地主机上的 kubernetes 服务

    Kubernetes StatefulSet pod 启动错误恢复

    kubernetes - 无法删除 kubernetes 部署中的复制 Controller 管理器

    kubernetes - 删除 list 部署中的 nodeSelectorTerms 参数