k8s-探针
探针有两种:readness(就需检测)、liveness(生命检测)检测有三种模式:exec、tcpSocket、httpGetreadness:作用:用于判断pod是否已经可以被访问,如果请求失败,会从service的后端服务列表中移除。场景:服务需要依赖大量的缓存数据,但是数据并没有load完成,此时服务是不可用的;服务依赖另一个进程的启动完成,在完全启动完成之前,服务不可用;服务依...
探针有两种:readness(就需检测)、liveness(生命检测)
检测有三种模式:exec、tcpSocket、httpGet
readness:
作用:用于判断pod是否已经可以被访问,如果请求失败,会从service的后端服务列表中移除。
场景:服务需要依赖大量的缓存数据,但是数据并没有load完成,此时服务是不可用的;服务依赖另一个进程的启动完成,在完全启动完成之前,服务不可用;服务依赖数据库等组件,依赖没有全部启动完成,服务不可用。
示例:检测redis端口是否已经启动(exec)
apiVersion: v1
kind: Pod
metadata:
name: readness-httpget-pod
namespace: default
spec:
containers:
- name: readness-httpget-container
image: registry.cn-hangzhou.aliyuncs.com/kxq/redis
imagePullPolicy: IfNotPresent
readinessProbe:
tcpSocket:
port: 6379
initialDelaySeconds: 1
periodSeconds: 3
创建pod:
kubectl create -f readness.yaml
[root@apiserver ~]# kubectl apply -f readness.yaml
pod/readness-httpget-pod created
查看pod:
[root@apiserver ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
readness-httpget-pod 1/1 Running 0 3s
liveness:
作用:用于判断容器是否需要重启。
场景:pod中有多个container,长时间的运行后,某个container异常了但还是running状态(例如,程序死锁)导致整体服务不可用,但是pod状态还是running状态,需要重启一下container。
例如,pod中包含一个busybox,开始我们创建一个文件夹:/tmp/live 60s后再删除此文件夹,再睡眠3600s.此过程liveness检测/tmp/live文件,如果不存在就pod重启。
apiVersion: v1
kind: Pod
metadata:
name: livebess-exec-pod
namespace: default
spec:
containers:
- name: liveness-exec-container
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c" ,"tough /tmp/live; sleep 60;rm -rf /tmp/live;sleep 3600"]
livenessProbe:
exec:
command: ["test","-e","/tmp/live"]
initialDelaySeconds: 1
periodSeconds: 3
查看pod:
[root@apiserver ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
livebess-exec-pod 1/1 Running 0 12s
....
livebess-exec-pod 1/1 Running 3 2m5s
livebess-exec-pod 1/1 Running 4 2m37s
livebess-exec-pod 0/1 CrashLoopBackOff 4 3m15s
livebess-exec-pod 1/1 Running 5 4m9s
http request:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: k8s.gcr.io/liveness
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
TCP prob:
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: k8s.gcr.io/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
通用参数解释:
-
initialDelaySeconds: 在容器启动后,liveness 或 readiness 初始化之前的延迟时间。
-
periodSeconds: 请求探针的频率,默认10秒,最小1秒。
-
timeoutSeconds: 请求超时时长,默认1秒,最小1秒
-
successThreshold: 请求失败后,需要最小的连续成功次数,默认一次. liveness只能是一次(readiness可以大于1),最小值是1.
-
failureThreshold: 当探针请求失败后,尝试重启的最大次数. Giving up in case of liveness probe means restarting the Pod. In case of readiness probe the Pod will be marked Unready. Defaults to 3. Minimum value is 1.
Http request 类型独有参数:
- host: 要连接的主机名称, 默认是pod的ip. You probably want to set “Host” in
httpHeaders instead. - scheme: 使用哪种协议(HTTP或HTTPS),默认HTTP
- path: 访问的服务地址
- httpHeaders: 指定请求头. HTTP allows repeated headers.
- port: 访问容器的端口号,[1,65535]
缺陷:
- readiness和liveness,都不支持多端口(TCP方式),多请求地址验证(http)的验证,如果镜像不规范,里面打有多个应用程序,则不能进行多个进程的监听,目前1.15版本是不支持的,不排除以后会fix。
更多推荐
所有评论(0)