Kubernetes,活动性探测失败,但Pod处于运行状态

时间:2019-01-04 13:13:45

标签: kubernetes

我正在尝试使用kubernetes进行蓝绿色部署,我遵循了https://www.ianlewis.org/en/bluegreen-deployments-kubernetes,这没关系。 我添加了一个活动性探针以执行健康检查,

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: flask-1.3
spec:
  replicas: 2
  template:
    metadata:
      labels:
        name: app
        version: "1.3"
    spec:
      containers: 
        - name: appflask
          image: 192.168.99.100:5000/fapp:1.2
          livenessProbe:
            httpGet:
             path: /index2
             port: 5000
            failureThreshold: 1
            periodSeconds: 1
            initialDelaySeconds: 1
          ports:
            - name: http
              containerPort: 5000

路径“ index2”不存在,我要测试失败的部署。问题是当我执行时:

 kubectl get pods -o wide

几秒钟内,一个吊舱处于“运行中”状态

NAME                         READY   STATUS             RESTARTS   AGE     IP             NODE    NOMINATED NODE   READINESS GATES

flask-1.3-6c644b8648-878qz   0/1     CrashLoopBackOff   6          6m19s   10.244.1.250   node    <none>           <none>
flask-1.3-6c644b8648-t6qhv   0/1     CrashLoopBackOff   7          6m19s   10.244.2.230   nod2e   <none>           <none>

几秒钟后,当实时总是失败时,一个pod正在运行:

NAME                         READY   STATUS             RESTARTS   AGE 

    IP             NODE    NOMINATED NODE   READINESS GATES

   flask-1.3-6c644b8648-878qz   1/1     Running            7          6m20s   10.244.1.250   node    <none>           <none>
    flask-1.3-6c644b8648-t6qhv   0/1     CrashLoopBackOff   7          6m20s   10.244.2.230   nod2e   <none>           <none>

然后将其运行回CrashLoopBackOff之后,问题是,如果livenesprobe总是失败,为什么为什么要保持运行几秒钟?

预先感谢

3 个答案:

答案 0 :(得分:1)

您应该查看Readiness probe,或者同时查看两者。

  

就绪和活动度探针可以并行用于同一容器。两者都使用可以确保流量不会到达尚未准备就绪的容器,并且可以确保容器在发生故障时重新启动。

Liveness probe检查您的应用程序在已运行的pod中中是否处于健康状态。

Readiness probe实际上会检查您的吊舱是否已准备好接收流量。因此,如果没有 / index2 端点,则该端点将永远不会显示为 Running

答案 1 :(得分:0)

这是怎么回事:

首次启动Pod(或容器)时,它将启动并进入“运行”状态。现在,如果容器中没有正在运行的进程,或者有一个不连续的进程(例如sleep 100),那么当该进程完成时,kubernetes会认为此pod已完成。

现在,由于您已经进行了部署,因此将保持一定数量的副本运行,因此它将重新创建Pod。但同样,没有任何进程在运行,因此,它又完成了。这是一个无限循环。

如果您要保持Pod正常运行,即使内部没有进程运行,也可以在yaml文件中传递参数tty: true

apiVersion: v1
kind: Pod
metadata:
  name: debian
  labels:
    app: debian
spec:
  containers:
  - name: debian
    image: debian
    tty: true       # this line will keep the terminal open

如果您在没有tty: true的情况下运行上方的pod,同样会发生这种情况。

答案 2 :(得分:0)

谢谢所有,我同时进行了活动性和就绪性检查解决了这个问题!