少年乘勇气,百战过乌孙。这篇文章主要讲述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
推荐阅读
- 实验(使用二进制编译部署K8S(v1.20))
- k8s helm实战
- K8S集群架构的kubeadm部署+dashboard和Harbor仓库部署
- Kubernetes——kubeadm部署安装+dashboard+harbor
- Linux之nc命令
- sersync 实现实时数据同步
- CENTOS开机自动加载shell脚本
- Nginx中的模块分类及常见配置项说明
- gitlab备份恢复 #yyds干货盘点#