背景:

在使用kubectl更新镜像版本的时候呢(如下),我们会发现kubectl命令一执行,k8s就会run起来一个新的pod了,并且马上被标记为ready,旧的pod就会被delete掉。那如果这个pod启动时间很长呢,就会影响到业务的使用了,这个时候我们就需要使用k8s的健康检查来判断,这个Pod何时该被标记为Ready.

kubectl set image deployment dep-test dep-test=192.168.200.102:80/demo/dep-test:20220322-2311 --record=true -n demo

探针:

k8s有三种探针,分别是startupprobe、ReadinessProbe、LivenessProbe 

其中startupprobe是用于判断容器内应用是否已经启动成功了的。这里我们主要是使用到了这种探针


应用场景1:容器启动后是提供web服务的

url为:​​http://172.16.3.172:8080/tologin​​  返回状态码为200

那么我们就可以使用HTTP Health Check 来检查

示例:

startupProbe:                     
httpGet:
path: /tologin #url路径
port: 8080 #端口
scheme: HTTP #请求协议
failureThreshold: 60 #设置失败次数
initialDelaySeconds: 37 #pod启动后多久开始检查
periodSeconds: 3 #多久检查一次
successThreshold: 1 #成功多少次后标记为ready
timeoutSeconds: 1 #超时时间

完整的yaml

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: dep-test
name: dep-test
namespace: demo
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: dep-test
template:
metadata:
labels:
app.kubernetes.io/name: dep-test
spec:
containers:
- image: 192.168.200.102:80/demo/dep-test:20220323-1452
name: dep-test
ports:
- containerPort: 8080
resources:
requests:
memory: 1024Mi
limits:
memory: 5048Mi
startupProbe:
httpGet:
path: /tologin
port: 8080
scheme: HTTP
failureThreshold: 60
initialDelaySeconds: 37
periodSeconds: 3
successThreshold: 1
timeoutSeconds: 1
---
apiVersion: v1
kind: Service
metadata:
name: dep-test
namespace: demo
spec:
selector:
app.kubernetes.io/name: dep-test
ports:
- port: 8080
targetPort: 8080

应用场景2:容器启动后是只起来端口的

那么我们就可以使用TCP Socket来检查

端口号:8070

示例:

startupProbe:                                          
tcpSocket:
port: 8070 #设置检查的端口
failureThreshold: 60 #设置失败次数
initialDelaySeconds: 60 #pod启动后多久开始检查
periodSeconds: 3 #多久检查一次
successThreshold: 1 #成功多少次后标记为ready
timeoutSeconds: 1 #超时时间

完整的yaml

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: dep-test
name: dep-test
namespace: demo
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: dep-test
template:
metadata:
labels:
app.kubernetes.io/name: dep-test
spec:
containers:
- image: 192.168.200.102:80/demo/dep-test:20220322-2311
name: dep-test
ports:
- containerPort: 8070
startupProbe:
tcpSocket:
port: 8070
failureThreshold: 60
initialDelaySeconds: 60
periodSeconds: 3
successThreshold: 1
timeoutSeconds: 1

---
apiVersion: v1
kind: Service
metadata:
name: demo-hl4plservice
namespace: demo
spec:
selector:
app.kubernetes.io/name: dep-test
ports:
- port: 8070
targetPort: 8070

实践:

去jenkins更新代码,k8s创建好新的pod 30秒之后,pod仍未被标记成ready,旧的pod还在继续运行,直到新的pod完全起来之后,才标记成ready,并且把旧的pod删除掉,从而达到了无缝更新

关于K8S的健康检查使用_状态码