Kubernetes 对于Pod 的健康状态可以通过二类探针来检查:livenessProbe 与 readinessProbe
,kubernetes定期执行这两类探针来诊断容器的健康状况。
livenessProbe: livenessProbe探针探测到容器不健康,则kubelet将杀掉该容器,并根据容器的重启策略做相应的处理。(决定是否重启容器)
readinessProbe: 用于判断容器服务是否可用(Ready状态),达到Ready状态的Pod才可以接收请求。(决定是否将请求转发给容器)
startupProbe: 启动探测成功一次,活动探测将接管以对容器死锁提供快速响应(探测成功后再交给livenessProbe)。如果启动探针从未成功,则容器将在failureThreshold * periodSeconds
后被杀死并受到容器的约束restartPolicy(重启策略) 1.16版本支持
探针名称 | 注释说明 |
---|---|
initialDelaySeconds | 启动容器后,启动活动或就绪探针之前的秒数。默认为0秒。最小值为0。 |
periodSeconds | 执行探测的频率(以秒为单位)。默认为10秒。最小值为1。 |
timeoutSeconds | 探测超时的秒数。默认为1秒。最小值为1。 |
successThreshold | 连续失败的最小成功次数,失败后将被视为成功。默认值为1。为保持活力,必须为1。最小值为1。 |
failureThreshold | 如果探测失败,Kubernetes将尝试尝试failureThreshold放弃。放弃活动探针意味着重新启动容器。如果准备就绪,则将Pod标记为“未就绪”。默认值为3。最小值为1 |
HTTP探针名称 | 注释说明 |
---|---|
host | 要连接的主机名,默认为Pod IP。您可能想在httpHeaders中设置“主机”。 |
scheme | 用于连接到主机(HTTP或HTTPS)的方案。默认为HTTP。 |
path | HTTP服务器上的访问路径 |
httpHeaders | 要在请求中设置的自定义标头。HTTP允许重复的标头 |
port | 要在容器上访问的端口的名称或端口号。编号必须在1到65535之间 |
一、 命令方式
1、书写命令资源清单
vim liveness.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 30
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 #启动容器后,启动活动或就绪探针之前的秒数。默认为0秒。最小值为0
periodSeconds: 5 #执行探测的频率(以秒为单位)。默认为10秒。最小值为1。
2、生成资源清单
kubectl apply -f liveness.yaml
3、查看livenessProbe资源效果
kubectl describe pod liveness-exec
kubectl get po -w
二、活动HTTP请求方式
1、书写HTTP请求资源清单
vim httpGet-liveness.yaml
apiVersion: apps/v1 #api版本
kind: Deployment #控制器
metadata:
labels:
app: nginx
name: nginx #Pod名称
spec:
replicas: 3 #启动副本数
selector: #设置标签
matchLabels:
app: nginx #必须匹配.spec.template.metadata标签相同,查看标签(kubectl get pods --show-labels)
minReadySeconds: 5 #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
revisionHistoryLimit: 3 #要保留以允许回滚的旧复制集数
strategy: #策略
type: RollingUpdate #默认为滚动更新
rollingUpdate: #滚动更新
maxSurge: 1 #滚动升级时会先启动1个pod
maxUnavailable: 1 #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
template: #模板(相当于定义好的一个python中的模块)
metadata:
labels:
app: nginx #必须匹配match .spec.selector.matchLabels标签相同。
spec:
terminationGracePeriodSeconds: 60 #k8s将会给应用发送SIGTERM信号,可以用来正确、优雅地关闭应用,默认为30秒
containers: #模板(容器模板)
- image: nginx #镜像名字
name: nginx #node节点启动的容器名字,容器名称(docker ps)查看格式k8s_容器名称_Pod名称
env:
- name: POD_NAME #容器的环境变量名称
valueFrom:
fieldRef:
fieldPath: metadata.name #Pod名称
imagePullPolicy: IfNotPresent #拉取镜像(选择方式——直接使用本地拥有的镜像)
livenessProbe: #判断容器是否存活(Running状态),如果livenessProbe探针检测到不正常/不健康,则将此容器删除,并且根据容器的策略进行抉择(决定是否重启容器)
httpGet:
path: / #HTTP服务器上的访问路径
port: 80 #容器上要访问的端口的名称/端口号
scheme: #请求方式http/https。默认为HTTP。
initialDelaySeconds: 70 #容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒(建议时间设置大于1分钟有些程序运行较慢不适合立马进行探针)
periodSeconds: 5 #每多少秒执行一次活动性探测, 执行探测的频率(以秒为单位)。默认为10秒。
timeoutSeconds: 3 #探测的超时后等待多少秒。默认值是 1 秒。最小值是 1
failureThreshold: 3 #当探测失败时,Kubernetes 的重试次数。默认值是 3。最小值是 1。
readinessProbe: #发送就绪探测,判断容器服务是否可用状态(Ready)状态,达到Ready状态的Pod才可以接收请求,反之ep隔离不可服务的Pod(决定是否将请求转发给容器)
httpGet:
path: / #HTTP服务器上的访问路径
port: 80 #容器上要访问的端口的名称/端口号
scheme: #请求方式http/https。默认为HTTP。
initialDelaySeconds: 60 #容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒(建议时间设置大于1分钟有些程序运行较慢不适合立马进行探针)
periodSeconds: 5 #每多少秒执行一次活动性探测, 执行探测的频率(以秒为单位)。默认为10秒。
timeoutSeconds: 3 #探测的超时后等待多少秒。默认值是 1 秒。最小值是 1
failureThreshold: 3 #当探测失败时,Kubernetes 的重试次数。默认值是 3。最小值是 1。
startupProbe: #startupProbe探测成功后再交给livenessProbe探针
exec:
command: ['bash','/etc/scrip/dingding.sh','liveness探针测试实验','127.0.0.1:80','cf9097584cce8031df74d29f45eeae01c6712da0c4f842faf303c24a3000d118','容器未启动状态','3']
initialDelaySeconds: 10 #容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒(建议时间设置大于1分钟有些程序运行较慢不适合立马进行探针)
periodSeconds: 20 #每多少秒执行一次活动性探测, 执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
timeoutSeconds: 1 #探测的超时后等待多少秒。默认值是 1 秒。最小值是 1
failureThreshold: 5 #当探测失败时,Kubernetes 的重试次数。默认值是 3。最小值是 1。
resources: #资源
limits: #限制
memory: "500M"
cpu: "0.2" #0.1代表200m
requests: #请求
memory: "250M"
cpu: "0.1" #0.1代表100m
restartPolicy: Always #重新启动pod中所有容器的策略
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx #svc的标签名称
name: nginx #svc名称
spec:
ports:
- name: nginx #服务中此端口的名称。这必须是DNS标签全部ServiceSpec中的端口必须具有唯一的名称
# 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
port: 80 #Port 的请求端口
protocol: TCP #TCP协议
targetPort: 80 #请求代理到使用TCP端口80,并且具有标签"app=nginx" 的Pod上,默认情况下,targetPort 将被设置为与 port 字段相同的值。
nodePort: 30080 #宿主机暴露的服务端口,默认情况下随机分配一个端口号(默认:30000-32767)
selector:
app: nginx #具有标签"app=nginx" 的Pod加入到该svc中
type: NodePort #对外集群的外部访问
---
apiVersion: autoscaling/v2beta1 #autoscaling/v2beta1 的api
kind: HorizontalPodAutoscaler #kind控制器
metadata:
name: nginx #HPA的名字
spec:
scaleTargetRef:
apiVersion: apps/v1 #api版本
kind: Deployment #Deployment控制器
name: nginx #Deployment控制器名字
minReplicas: 3 #最小的副本数
maxReplicas: 7 #最大的副本数
metrics:
- type: Resource
resource:
name: cpu #cpu名称
targetAverageUtilization: 70 #资源指标
name: memory
targetAverageUtilization: 70
2、生成资源清单
kubectl apply -f httpGet-liveness.yaml
3、查看livenessProbe资源效果
kubectl get pod -w
watch kubectl get svc,ep
4、更新镜像版本
kubectl set image deployment nginx nginx=nginx:1.16.1 --record=true
5、再次查看livenessProbe资源效果
三、就绪探针
1、书写就绪探针资源清单
vim exec-liveness.yaml
apiVersion: apps/v1 #api版本
kind: Deployment #控制器
metadata:
labels:
app: liveness
name: liveness #Pod名称
spec:
replicas: 3 #启动副本数
selector: #设置标签
matchLabels:
app: liveness #必须匹配.spec.template.metadata标签相同,查看标签(kubectl get pods --show-labels)
minReadySeconds: 5 #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
revisionHistoryLimit: 3 #要保留以允许回滚的旧复制集数
strategy: #策略
type: RollingUpdate #默认为滚动更新
rollingUpdate: #滚动更新
maxSurge: 1 #滚动升级时会先启动1个pod
maxUnavailable: 1 #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
template: #模板(相当于定义好的一个python中的模块)
metadata:
labels:
app: liveness #必须匹配match .spec.selector.matchLabels标签相同。
spec:
terminationGracePeriodSeconds: 60 #k8s将会给应用发送SIGTERM信号,可以用来正确、优雅地关闭应用,默认为30秒
containers: #模板(容器模板)
- image: nginx #镜像名字
name: liveness #node节点启动的容器名字,容器名称(docker ps)查看格式k8s_容器名称_Pod名称
env:
- name: POD_NAME #容器的环境变量名称
valueFrom:
fieldRef:
fieldPath: metadata.name #Pod名称
imagePullPolicy: IfNotPresent #拉取镜像(选择方式——直接使用本地拥有的镜像)
livenessProbe: #判断容器是否存活(Running状态),如果livenessProbe探针检测到不正常/不健康,则将此容器删除,并且根据容器的策略进行抉择(决定是否重启容器)
exec:
command: ['bash','/etc/scrip/dingding.sh','探针测试实验','127.0.0.1:80','cf9097584cce8031df74d29f45eeae01c6712da0c4f842faf303c24a3000d118','livenessProbe容器未Running状态','3']
initialDelaySeconds: 70 #容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒(建议时间设置大于1分钟有些程序运行较慢不适合立马进行探针)
periodSeconds: 5 #每多少秒执行一次活动性探测, 执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
timeoutSeconds: 3 #探测的超时后等待多少秒。默认值是 1 秒。最小值是 1
failureThreshold: 3 #当探测失败时,Kubernetes 的重试次数。默认值是 3。最小值是 1。
readinessProbe: #发送就绪探测,判断容器服务是否可用状态(Ready)状态,达到Ready状态的Pod才可以接收请求,反之ep隔离不可服务的Pod(决定是否将请求转发给容器)
exec:
command: ['bash','/etc/scrip/dingding.sh','探针测试实验','127.0.0.1:80','cf9097584cce8031df74d29f45eeae01c6712da0c4f842faf303c24a3000d118','readinessProbe容器未Ready状态','3']
initialDelaySeconds: 60 #容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒(建议时间设置大于1分钟有些程序运行较慢不适合立马进行探针)
periodSeconds: 5 #每多少秒执行一次活动性探测, 执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
timeoutSeconds: 3 #探测的超时后等待多少秒。默认值是 1 秒。最小值是 1
failureThreshold: 3 #当探测失败时,Kubernetes 的重试次数。默认值是 3。最小值是 1。
startupProbe: #startupProbe探测成功后再交给livenessProbe探针
exec:
command: ['bash','/etc/scrip/dingding.sh','liveness探针测试实验','127.0.0.1:80','cf9097584cce8031df74d29f45eeae01c6712da0c4f842faf303c24a3000d118','容器未启动状态','3']
initialDelaySeconds: 10 #容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒(建议时间设置大于1分钟有些程序运行较慢不适合立马进行探针)
periodSeconds: 50 #每多少秒执行一次活动性探测, 执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
timeoutSeconds: 1 #探测的超时后等待多少秒。默认值是 1 秒。最小值是 1
failureThreshold: 2 #当探测失败时,Kubernetes 的重试次数。默认值是 3。最小值是 1。
resources: #资源
limits: #限制
memory: "500M"
cpu: "0.2" #0.1代表200m
requests: #请求
memory: "250M"
cpu: "0.1" #0.1代表100m
volumeMounts:
- name: dingding-config
mountPath: /etc/scrip
volumes:
- name: dingding-config
configMap:
name: dingding-config
restartPolicy: Always #重新启动pod中所有容器的策略
---
apiVersion: v1
kind: Service
metadata:
labels:
app: liveness #svc的标签名称
name: liveness #svc名称
spec:
ports:
- name: liveness #服务中此端口的名称。这必须是DNS标签全部ServiceSpec中的端口必须具有唯一的名称
# 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
port: 80 #Port 的请求端口
protocol: TCP #TCP协议
targetPort: 80 #请求代理到使用TCP端口80,并且具有标签"app=liveness" 的Pod上,默认情况下,targetPort 将被设置为与 port 字段相同的值。
nodePort: 30080 #宿主机暴露的服务端口,默认情况下随机分配一个端口号(默认:30000-32767)
selector:
app: liveness #具有标签"app=liveness" 的Pod加入到该svc中
type: NodePort #对外集群的外部访问
---
apiVersion: autoscaling/v2beta1 #autoscaling/v2beta1 的api
kind: HorizontalPodAutoscaler #kind控制器
metadata:
name: liveness #HPA的名字
spec:
scaleTargetRef:
apiVersion: apps/v1 #api版本
kind: Deployment #Deployment控制器
name: liveness #Deployment控制器名字
minReplicas: 3 #最小的副本数
maxReplicas: 7 #最大的副本数
metrics:
- type: Resource
resource:
name: cpu #cpu名称
targetAverageUtilization: 70 #资源指标
name: memory
targetAverageUtilization: 70
2、生成资源清单
kubectl apply -f exec-liveness.yaml
3、书写ConfigMap资源清单并且生成资源清单
vim configdingding.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: dingding-config
data:
dingding.sh: |
#!/bin/bash
pod_name=$1
healthcheck_url=$2
status_code=`curl http://${healthcheck_url} -o /dev/null -w '%{http_code}\n' -s`
dingding_token=$3
check_type=$4
failure_time=3
message="报警康检查异常:$pod_name
\n检查类型:$check_type
\n检查时间:$(date +%F_%T |awk -F "_" '{print $1,$2}')
\n检查地址:$healthcheck_url
\n状态码: $status_code
\n错误次数:$failure_time
\nPod名称: $POD_NAME
"
json="{
\"actionCard\": {
\"title\": \"健康检查异常\",
\"text\": \"$message\",
\"hideAvatar\": \"0\",
\"btnOrientation\": \"0\",
\"btns\": [{\"title\": \"容器服务异常\",\"actionURL\": \"http://$healthcheck_url\"}]},
\"msgtype\": \"actionCard\"}"
if [ "$status_code" == "200" ];then
echo "健康检查OK"
else
curl 'https://oapi.dingtalk.com/robot/send?access_token='$dingding_token \
-H 'Content-Type: application/json' \
-d "$json"
fi
kubectl apply -f configdingding.yaml
4、查看就绪探针资源效果
kubectl get pod -w
5、测试就绪探针效果
- 现在现在更新文件
kubectl edit deployments.apps liveness