我正在尝试使用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总是失败,为什么为什么要保持运行几秒钟?
预先感谢
答案 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)
谢谢所有,我同时进行了活动性和就绪性检查解决了这个问题!