kubernetes中的探针介绍(kubernetes中的探针介绍)
kubernetes中的探针介绍(kubernetes中的探针介绍)imagePullPolicy (镜像拉取策略):restartPolicy (容器重启策略):root@k8s-master:~/yaml/1226/2.PodProbe-case/case2-docker-container-healthy-check# cat 2.Dockerfile FROM nginx:1.20.2 maintainer "test@test.com" HEALTHCHECK --interval=5s --timeout=2s --retries=3 \ CMD curl --silent --fail localhost:80 || exit 1在检测通过之前容器处于starting状态检测通过(检测返回状态码为 0)之后为healthy状态检测失败(检测返回状态码为 1)之后为unhealthy状态(自行改参数测试)二、kuber
一、Health Check介绍:由发起者对容器进行周期性健康状态检测。 容器1周期检测相当于人类的周期性体检每次检测相当于人类每次体检的内容
docker health check实现方式:
1.在docker-compose实现探针:
root@k8s-master:~/yaml/1226/2.PodProbe-case/case2-docker-container-healthy-check# cat 1.docker-compose.yaml
version: '3.6'
services:
nginx-service:
image: nginx:1.20.2
container_name: nginx-web1
expose:
- 80
- 443
ports:
- "80:80"
- "443:443"
restart: always
healthcheck: #添加服务健康状态检查
test: ["CMD" "curl" "-f" "http://localhost"]
interval: 5s #健康状态检查的间隔时间,默认为30s
timeout: 5s #单次检查的失败超时时间,默认为30s
retries: 3 #连续失败次数默认3次,当连续失败retries次数后将容器置为unhealthy状态
start_period: 60s #60s后每间隔interval的时间检查一次,连续retries次后才将容器置为unhealthy状态 但是start_period时间内检查成功就认为是检查成功并装容器置于healthy状态
2.在dockerfile实现健康状态检测:
root@k8s-master:~/yaml/1226/2.PodProbe-case/case2-docker-container-healthy-check# cat 2.Dockerfile
FROM nginx:1.20.2
maintainer "test@test.com"
HEALTHCHECK --interval=5s --timeout=2s --retries=3 \
CMD curl --silent --fail localhost:80 || exit 1
- 在检测通过之前容器处于starting状态
- 检测通过(检测返回状态码为 0)之后为healthy状态
- 检测失败(检测返回状态码为 1)之后为unhealthy状态(自行改参数测试)
pod的生命周期,从start后可以配置postStart检测,运行过程中可以配置livenessProbe和readinessProbe 最后在 stop前可以配置preStop操作。
Pod重启策略:
Pod一旦配置了探针,在检测失败时候,会基于restartPolicy对Pod进行下一步操作:
restartPolicy (容器重启策略):
- Always:当容器异常时,k8s自动重启该容器, ReplicationController/Replicaset/Deployment,默认为Always。
- OnFailure:当容器失败时(容器停止运行且退出码不为0),k8s自动重启该容器。
- Never:不论容器运行状态如何都不会重启该容器 Job或CronJob。
imagePullPolicy (镜像拉取策略):
- IfNotPresent: node节点没有此镜像就去指定的镜像仓库拉取,node有就使用node本地镜像。
- Always:每次重建pod都会重新拉取镜像
- Never:从不到镜像中心拉取镜像,只使用本地镜像
3.1 探针介绍
探针是由 kubelet 对容器执行的定期诊断,以保证Pod的状态始终处于运行状态,要执行诊断,kubelet 调用由容器实现的Handler(处理程序),也称为Hook(钩子)。
有三种类型的处理程序:
- ExecAction:在容器内执行指定命令,如果命令退出时返回码为0则认为诊断成功。
- TCPSocketAction:对指定端口上的容器的IP地址进行TCP检查,如果端口打开,则诊断被认为是成功的。
- HTTPGetAction:对指定的端口和路径上的容器的IP地址执行HTTPGet请求,如果响应的状态码大于等于200且小于 400,则诊断被认为是成功的。
每次探测都将获得以下三种结果之一:
- 成功:容器通过了诊断。
- 失败:容器未通过诊断。
- 未知:诊断失败,因此不会采取任何行动。
3.2 探针类型
- startupProbe: 启动探针 kubernetes v1.16引入判断容器内的应用程序是否已启动完成,如果配置了启动探测,则会先禁用所有其它的探测,直到startupProbe检测成功为止,如果startupProbe探测失败,则kubelet将杀死容器,容器将按照重启策略进行下一步操作,如果容器没有提供启动探测,则默认状态为成功
- livenessProbe: 存活探针检测容器容器是否正在运行,如果存活探测失败,则kubelet会杀死容器,并且容器将受到其重启策略的影响,如果容器不提供存活探针,则默认状态为 Success,livenessProbe用于控制是否重启pod。
- readinessProbe: 就绪探针如果就绪探测失败,端点控制器将从与Pod匹配的所有Service的端点中删除该Pod的IP地址,初始延迟之前的就绪状态默认为Failure(失败),如果容器不提供就绪探针,则默认状态为 Success,readinessProbe用于控制pod是否添加至service。
3.3 探针通用配置参数:
- initialDelaySeconds: 120 初始化延迟时间,告诉kubelet在执行第一次探测前应该等待多少秒,默认是0秒,最小值是0。
- periodSeconds: 60 探测周期间隔时间,指定了kubelet应该每多少秒秒执行一次存活探测,默认是 10 秒。最小值是 1。
- timeoutSeconds: 5 单次探测超时时间,探测的超时后等待多少秒,默认值是1秒,最小值是1。
- successThreshold: 1 从失败转为成功的重试次数,探测器在失败后,被视为成功的最小连续成功数,默认值是1,存活探测的这个值必须是1,最小值是 1。
- failureThreshold:3 从成功转为失败的重试次数,当Pod启动了并且探测到失败,Kubernetes的重试次数,存活探测情况下的放弃就意味着重新启动容器,就绪探测情况下的放弃Pod 会被打上未就绪的标签,默认值是3,最小值是1。
3.4 探针HTTP配置参数
HTTP 探测器可以在 httpGet 上配置额外的字段:
- host: 连接使用的主机名,默认是Pod的 IP,也可以在HTTP头中设置 “Host” 来代替。
- scheme: http 用于设置连接主机的方式(HTTP 还是 HTTPS),默认是 HTTP。
- path: /monitor/index.html 访问 HTTP 服务的路径。
- httpHeaders: 请求中自定义的 HTTP 头 HTTP 头字段允许重复。
- port: 80 访问容器的端口号或者端口名,如果数字必须在 1 ~ 65535 之间。
3.5 探针示例
case3-Probe# kubectl apply -f 5-startupProbe-livenessProbe-readinessProbe.yaml
root@k8s-master:~/yaml/1226/2.PodProbe-case/case3-Probe# cat 5-startupProbe-livenessProbe-readinessProbe.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myserver-myapp-frontend-deployment
namespace: myserver
spec:
replicas: 1
selector:
matchLabels: #rs or deployment
app: myserver-myapp-frontend-label
#matchExpressions:
# - {key: app operator: In values: [myserver-myapp-frontend ng-rs-81]}
template:
metadata:
labels:
app: myserver-myapp-frontend-label
spec:
terminationGracePeriodSeconds: 60
containers:
- name: myserver-myapp-frontend-label
image: nginx:1.20.2
ports:
- containerPort: 80
startupProbe:
httpGet:
#path: /monitor/index.html
path: /index.html
port: 80
initialDelaySeconds: 5 #首次检测延迟5s
failureThreshold: 3 #从成功转为失败的次数
periodSeconds: 3 #探测间隔周期
readinessProbe:
httpGet:
#path: /monitor/monitor.html
path: /index.html
port: 80
initialDelaySeconds: 5
periodSeconds: 3
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
livenessProbe:
httpGet:
#path: /monitor/monitor.html
path: /index.html
port: 80
initialDelaySeconds: 5
periodSeconds: 3
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
---
apiVersion: v1
kind: Service
metadata:
name: myserver-myapp-frontend-service
namespace: myserver
spec:
ports:
- name: http
port: 81
targetPort: 80
nodePort: 30012
protocol: TCP
type: NodePort
selector:
app: myserver-myapp-frontend-label
describe查看pods的运行情况
3.6 postStart、preStop简介
postStart 和 preStop处理函数:
- postStart: Pod被创建后立即执行检测 即不等待pod中的服务启动。 如果postStart执行失败pod不会继续创建。
- preStop: 在pod被停止之前执行
Pod的终止流程
1.创建pod
- 完成调度流程
- 容器启动并执行postStart
- livenessProbe 进入running状态
- readinessProbe service关联pod
- 接受客户端请求
2.删除pod
- Pod被设置为”Terminating”状态
- 从service的Endpoints列表中删除并不再接受客户端请求。
- 执行PreStop
- Kubernetes向pod中的容器发送SIGTERM信号(正常终止信号)终止pod里面的主进程,这个信号让容器知道自己很快将会被关闭。
- terminationGracePeriodSeconds: 60 可选终止等待期,如果有设置删除宽限时间,则等待宽限时间到期,否则最多等待30s, Kubernetes等待指定的时间称为优雅终止宽限期 默认情况下是30秒 值得注意的是等待期与preStop Hook和SIGTERM信号并行执行,即Kubernetes可能不会等待preStop Hook完成(最长30秒之后主进程还没有结束就就强制终止pod)。
- SIGKILL信号被发送到Pod,并删除Pod
示例代码:
case4-postStart-preStop# kubectl apply -f 1-myserver-myapp1-postStart-preStop.yaml
root@k8s-master:~/yaml/1226/2.PodProbe-case/case4-postStart-preStop# cat 1-myserver-myapp1-postStart-preStop.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myserver-myapp1-lifecycle
labels:
app: myserver-myapp1-lifecycle
namespace: myserver
spec:
replicas: 1
selector:
matchLabels:
app: myserver-myapp1-lifecycle-label
template:
metadata:
labels:
app: myserver-myapp1-lifecycle-label
spec:
terminationGracePeriodSeconds: 60 #可选终止等待期,如果有设置删除宽限时间,则等待宽限时间到期,否则最多等待30s,
containers:
- name: myserver-myapp1-lifecycle-label
image: tomcat:7.0.94-alpine
lifecycle:
postStart:
exec:
#command: 把自己注册到注册在中心
command: ["/bin/sh" "-c" "echo 'Hello from the postStart handler' >> /usr/local/tomcat/webapps/ROOT/index.html"]
#httpGet:
# #path: /monitor/monitor.html
# host: www.magedu.com
# port: 80
# scheme: HTTP
# path: index.html
preStop:
exec:
#command: 把自己从注册中心移除
command: ["/usr/local/tomcat/bin/catalina.sh" "stop"]
ports:
- name: http
containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: myserver-myapp1-lifecycle-service
namespace: myserver
spec:
ports:
- name: http
port: 80
targetPort: 8080
nodePort: 30012
protocol: TCP
type: NodePort
selector:
app: myserver-myapp1-lifecycle-label