readinessProbe+preStop使应用更新时用户无感知

少年乘勇气,百战过乌孙。这篇文章主要讲述readinessProbe+preStop使应用更新时用户无感知相关的知识,希望能为你提供帮助。
背景
在K8s部署多副本时候,使用nacos作为服务注册和发现中心,而在多副本应用更新的过程中会出现应用已经停止,但是nacos服务却扔然将流量转发给已经停止的应用,导致报错。
解决办法
1、想办法让应用停止前发送通知给nacos,告诉他应用即将停止,叫nacos不要再转发给他,在这里就使用脚本实现,具体脚本如下:

#!/bin/sh Token=$(curl -s --location --request POST http://nacos:8848/nacos/v1/auth/users/login --form username=nacos --form password=nacos|awk -F "accessToken" print $2|awk -F ":" print $2|awk -F " print $2) curl -X PUT"http://nacos:8848/nacos/v1/ns/instance?accessToken=$Token& serviceName=apaas-gateway-provider& groupName=apaas& namespaceId=apaas-srm-huami-dev& ip=$MY_POD_IP& clusterName=DEFAULT& port=5100& ephemeral=true& weight=1& enabled=1"

说明:此处的MY_POD_IP变量是由deployment的env属性中的status.podIP字段传入的,如下:
containers: - env: - name: MY_POD_IP valueFrom: fieldRef: apiVersion: v1 fieldPath: status.podIP

【readinessProbe+preStop使应用更新时用户无感知】2、将以上脚本上传到pod持久化存储的目录,在deployment的preStop的hook执行,如下:
lifecycle: preStop: exec: command: - /home/logs/service_offline_nacos.sh

3、光添加preStop还不够,因为虽然应用在关闭前通知nacos注销应用自身,但是在更新新的应用后当应用更新完但是还不能提供服务的时候svc就会认为应用已经Running,就会将流量转发给他,此时仍然会报错,所以需要添加探针,如下:
可读性探针:
readinessProbe: tcpSocket: port: 5100

最好再添加个存活性检测探针:
livenessProbe: tcpSocket: port: 5100

完整配置如下:
apiVersion: apps/v1 kind: Deployment metadata: name: gateway namespace: test spec: replicas: 2 selector: matchLabels: app: gateway template: metadata: labels: app: gateway spec: containers: - env: - name: MY_POD_IP valueFrom: fieldRef: apiVersion: v1 fieldPath: status.podIP image: harbor.xxx.com/xxx/gateway:2022-03-25-14-53 imagePullPolicy: Always lifecycle: preStop: exec: command: - /home/logs/service_offline_nacos.sh livenessProbe: tcpSocket: port: 5100 name: gateway ports: - containerPort: 5100 protocol: TCP readinessProbe: tcpSocket: port: 5100 volumeMounts: - mountPath: /home/logs name: data dnsPolicy: ClusterFirst imagePullSecrets: - name: registry-pull-secret volumes: - name: data persistentVolumeClaim: claimName: gateway-pvc


    推荐阅读