如何确定失败的kubernetes部署?

时间:2017-12-27 09:06:12

标签: kubernetes

我创建了一个副本数为2的Pod,它运行一个应用程序(一个简单的Web服务器),基本上它总是运行命令 - 但是由于配置错误,有时命令退出并且pod然后终止。

由于restartPolicy的默认Always,pod(以及容器)重新启动,最终Pod状态为CrashLoopBackOff

如果我执行kubectl describe deployment,则会将条件显示为Progressing=TrueAvailable=False

这看起来很好 - 问题是 - 如何将我的部署标记为“失败”'在上述情况下?

添加spec.ProgressDeadlineSeconds似乎没有效果。

在Pod规范中简单地说restartPolicyNever是否足够?

一个相关的问题,是否有办法将此信息作为触发器/ webhook获取,而不进行rollout status监视?

2 个答案:

答案 0 :(得分:1)

“失败”部署没有Kubernetes概念。编辑部署会注册您要创建新ReplicaSet的意图,而k8s将反复尝试使该意图发生。在此过程中遇到的任何错误都会导致部署阻止,但它们不会导致k8s中止部署。

AFAIK,你可以做的最好(截至1.9)是在部署时应用截止日期,这将添加一个条件,你可以在部署卡住时检测到;请参阅https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#failed-deploymenthttps://kubernetes.io/docs/concepts/workloads/controllers/deployment/#progress-deadline-seconds

可以在k8s提供的状态之上覆盖您自己的失败定义,但这很难以通用的方式进行;有关此问题的当前状态(长期!)讨论,请参阅此问题:https://github.com/kubernetes/kubernetes/issues/1899

这是我之前写的一些Python代码(使用pykube),它实现了我自己的ready定义;如果5分钟后没有获得此条件,我将中止部署脚本。

def _is_deployment_ready(d, deployment):
    if not deployment.ready:
        _log.debug('Deployment not completed.')
        return False

    if deployment.obj["status"]["replicas"] > deployment.replicas:
        _log.debug('Old replicas not terminated.')
        return False

    selector = deployment.obj['spec']['selector']['matchLabels']
    pods = Pod.objects(d.api).filter(namespace=d.namespace, selector=selector)
    if not pods:
        _log.info('No pods found.')
        return False

    for pod in pods:
        _log.info('Is pod %s ready? %s.', pod.name, pod.ready)
        if not pod.ready:
            _log.debug('Pod status: %s', pod.obj['status'])
            return False
    _log.info('All pods ready.')
    return True

请注意单独的pod检查,这是必需的,因为在部署完成时(即所有pod已创建),部署似乎被认为是“就绪”,而不是在所有pod都准备就绪时。

答案 1 :(得分:1)

有点理论

关于您的问题:

在上述情况下如何将部署标记为“失败”?

Kubernetes为您提供two types健康检查:

1)准备就绪
就绪探针旨在让Kubernetes知道您的应用何时准备提供流量
Kubernetes在允许服务将流量发送到Pod之前,确保准备就绪探针通过。
如果准备就绪探针开始失败,Kubernetes将停止向Pod发送流量,直到它通过为止。

2)活力
活动探针可让Kubernetes知道您的应用程序是否有效或无效
如果您的应用程序还活着,那么Kubernetes会独自处理。如果您的应用已失效,Kubernetes会删除Pod并启动一个新的Pod来替换它。

目前(v1.19.0),Kubernetes支持3种类型的机制,以实现活动性和就绪性探测:

A)ExecAction :在容器内执行指定的命令。如果命令以状态代码0退出,则认为诊断成功。

B)TCPSocketAction :根据指定端口上Pod的IP地址执行TCP检查。如果端口打开,则认为诊断成功。

C)HTTPGetAction :针对指定端口和路径上Pod的IP地址执行HTTP GET请求。如果响应的状态码大于或等于200且小于400,则认为诊断成功。


您的情况:

如果容器中的进程在遇到问题或变得不正常时能够自行崩溃,则您不一定需要活动性探针; kubelet将根据Pod的restartPolicy自动执行正确的操作。

我认为在您的情况下(需要将部署称为成功/失败并采取适当的措施)您应该

第1步:
设置HTTP / TCP 就绪探针-例如:

   readinessProbe:
      httpGet:
         path: /health-check
         port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5
      failureThreshold: 2

位置:

initialDelaySeconds-自容器启动以来可以启动就绪探针的秒数。

periodSeconds-多久执行一次准备就绪探测。

failureThreshold —如果Pod启动失败,则尝试执行准备状态探针的次数。

第2步:
选择相关的rolling update strategy以及如何处理新Pod失败的情况(请考虑阅读this线程作为示例)。

您可以遵循的一些参考资料:

Container probes
Kubernetes Liveness and Readiness Probes
Kubernetes : Configure Liveness and Readiness Probes
Kubernetes and Containers Best Practices - Health Probes
Creating Liveness Probes for your Node.js application in Kubernetes


部署失败

部署(或推出过程)将被视为失败 如果它尝试部署其最新的ReplicaSet而又没有一遍又一遍地完成直到超过progressDeadlineSeconds间隔。

然后,您用以下方式更新K8S的状态:

Conditions:
  Type            Status  Reason
  ----            ------  ------
  Available       True    MinimumReplicasAvailable
  Progressing     False   ProgressDeadlineExceeded
  ReplicaFailure  True    FailedCreate

here中了解更多信息。