k8s实践liveness与readiness 2种探针使用

Posted dl528888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s实践liveness与readiness 2种探针使用相关的知识,希望对你有一定的参考价值。

0.简介

本文主要介绍v1.20版本k8s使用2种探针实例。


1.liveness

存活探针,检测服务是否运行正常

1.1 exec方式

采用以下过exec方式例子,启动dp

cat liveness-exec.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec
labels:
app: liveness
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 600
livenessProbe:
initialDelaySeconds: 10
periodSeconds: 3
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 1
exec:
command:
- cat
- /tmp/healthy

启动

kubectl appley -f  liveness-exec.yaml

结论:删除pod里的/tmp/healthy,可以看到检测很快,但killing状态持续30秒左右


 Normal   Scheduled  2m2s               default-scheduler  Successfully assigned default/liveness-exec to k8s-node01
Normal Pulled 116s kubelet Successfully pulled image "busybox" in 5.486523665s
Normal Created 116s kubelet Created container liveness
Normal Started 116s kubelet Started container liveness
Warning Unhealthy 32s (x3 over 38s) kubelet Liveness probe failed: cat: can\'t open \'/tmp/healthy\': No such file or directory
Normal Killing 32s kubelet Container liveness failed liveness probe, will be restarted

1.2 http方式

cat liveness-http.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-http
labels:
test: liveness
spec:
containers:
- name: liveness
image: mydlqclub/springboot-helloworld:0.0.1
livenessProbe:
initialDelaySeconds: 20
periodSeconds: 3
failureThreshold: 3
timeoutSeconds: 2
httpGet:
scheme: HTTP
port: 8081
path: /actuator/health

运行后查看

[root@iz0jl52ythz64abom43swwz ~]#  kubectl  get pod -o wide|grep liveness-http
liveness-http 1/1 Running 1 16h 172.16.1.34 k8s-node01 <none> <none>
[root@iz0jl52ythz64abom43swwz ~]# curl 172.16.1.34^C
[root@iz0jl52ythz64abom43swwz ~]# curl 172.16.1.34:8081/actuator/health
{"status":"UP"}
[root@iz0jl52ythz64abom43swwz ~]# curl 172.16.1.34:8081/actuator/health
{"status":"UP"}
[root@iz0jl52ythz64abom43swwz ~]#

结论:直接kill容器里服务后,也是30秒后自动重建

1.3 tcp方式

cat liveness-tcp2.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-tcp
labels:
app: liveness
spec:
containers:
- name: liveness
image: cloudnativelabs/whats-my-ip
livenessProbe:
initialDelaySeconds: 15
periodSeconds: 3
failureThreshold: 3
timeoutSeconds: 1

tcpSocket:
port: 8080

结论:killall容器里服务后,也是30s左右

1.4 总结

使用exec、http、tcp方式,均在30s左右重建与恢复。

2、readiness

就绪探针,验证容器服务启动是否正常

2.1 exec方式

cat readliness-exec.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: readliness-exec
name: readliness-exec
spec:
replicas: 1
selector:
matchLabels:
run: readliness-exec
template:
metadata:
labels:
run: readliness-exec
spec:
containers:
- image: cloudnativelabs/whats-my-ip
name: readliness-exec
ports:
- containerPort: 8080
readinessProbe:
initialDelaySeconds: 60
periodSeconds: 3
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 1
exec:
command:
- cat
- /tmp/healthy
terminationGracePeriodSeconds: 30

运行后可以看懂ready是0/1,此时容器虽然在running,但实际为未就绪状态。原因是我没有创建 /tmp/healthy文件,所以检测失败,符合预期

[root@iz0jl52ythz64abom43swwz ~]# kubectl  get pod
NAME READY STATUS RESTARTS AGE
readliness-exec-59cfc454d-dgxx8 0/1 Running 0 3m21s

可以看到监控检测是失败的

  Normal   Scheduled  3m24s                 default-scheduler  Successfully assigned default/readliness-exec-59cfc454d-dgxx8 to k8s-node01
Normal Pulling 3m25s kubelet Pulling image "cloudnativelabs/whats-my-ip"
Normal Pulled 3m24s kubelet Successfully pulled image "cloudnativelabs/whats-my-ip" in 851.613807ms
Normal Created 3m24s kubelet Created container readliness-exec
Normal Started 3m24s kubelet Started container readliness-exec
Warning Unhealthy 82s (x21 over 2m22s) kubelet Readiness probe failed: cat: can\'t open \'/tmp/healthy\': No such file or directory

在容器里创建/tmp/healthy文件,可以看到状态已经为1/1

[root@iz0jl52ythz64abom43swwz ~]# kubectl  get pod
NAME READY STATUS RESTARTS AGE
readliness-exec-59cfc454d-dgxx8 1/1 Running 0 3m31s

在删除此文件后,又变为了0/1

  Warning  Unhealthy  6s (x47 over 8m24s)  kubelet            Readiness probe failed: cat: can\'t open \'/tmp/healthy\': No such file or directory
[root@iz0jl52ythz64abom43swwz ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
readliness-exec-59cfc454d-dgxx8 0/1 Running 0 9m28s

添加svc后观察

kubectl expose deployment readliness-exec --name=readliness-exec --port=80 --target-port=8080

访问失败

[root@iz0jl52ythz64abom43swwz ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d
readliness-exec ClusterIP 10.99.194.102 <none> 80/TCP 5m46s
whats-my-ip ClusterIP 10.103.25.20 <none> 80/TCP 11d
[root@iz0jl52ythz64abom43swwz ~]# curl 10.99.194.102
curl: (7) Failed connect to 10.99.194.102:80; Connection refused

在实例里添加监控检测文件后,访问正常

kubectl  get pod
NAME READY STATUS RESTARTS AGE
readliness-exec-59cfc454d-dgxx8 1/1 Running 0 36m
[root@iz0jl52ythz64abom43swwz ~]# curl 10.99.194.102
HOSTNAME:readliness-exec-59cfc454d-dgxx8 IP:172.16.1.42
[root@iz0jl52ythz64abom43swwz ~]# curl 10.99.194.102
HOSTNAME:readliness-exec-59cfc454d-dgxx8 IP:172.16.1.42

2.2 结论

如果监听的文件不存在,那么容器READY状态会有异常,并且访问有问题。

以上是关于k8s实践liveness与readiness 2种探针使用的主要内容,如果未能解决你的问题,请参考以下文章

详解k8s中的liveness和readiness的原理和区别_转

详解k8s中的liveness和readiness的原理和区别

K8s 存活(liveness)就绪(readiness)和启动(startup)探测器

pod健康检查详解(liveness,readiness,滚动更新)

idou老师教你学Istio 14:如何用K8S对Istio Service进行流量健康检查

再战 k8s:Pod 生命周期与重启策略