发布时间:2025-06-24 18:02:34  作者:北方职教升学中心  阅读量:120


模拟请求报错

  • 三、
  • #添加prestop钩子lifecycle:          preStop:            exec:              command: ["/bin/sh","-c",'curl -X PUT "http://my-nacos.xxx.com/nacos/v1/ns/instance?serviceName=energy-order-api&ip=${POD_IP}&port=80&weight=0" && sleep 30 && PID=`pidof java` && kill -SIGTERM $PID && while ps -p $PID > /dev/null; do sleep 1; done']#设置强制杀死Pod(kill -9)的时间,默认为30s   terminationGracePeriodSeconds: 40

    完整deployment内容如下

    ---apiVersion:apps/v1kind:Deploymentmetadata:namespace:data-center  name:energy-order-api  labels:app:energy-order-apispec:replicas:3selector:matchLabels:app:energy-order-api  template:metadata:labels:app:energy-order-api    spec:imagePullSecrets:-name:harbor-secret      containers:-name:energy-order-api        image:registry.xxxx/hqt-registry-pro/energy-order-api:P-1391-2023xxxx-15.47.45        imagePullPolicy:IfNotPresent        command:["/bin/sh"]args:["-c","java -jar               -Xmx2688m               -Xms2688m               -Xmn961m               -XX:MaxMetaspaceSize=512m               -XX:MetaspaceSize=512m               -Xloggc:/logs/gc-%t.log               -XX:+HeapDumpOnOutOfMemoryError                -XX:HeapDumpPath=/data/logs/heapdump_$MY_POD_NAME.hprof              -XX:+PrintGCDetails               -XX:+UnlockExperimentalVMOptions               -XX:+UseCGroupMemoryLimitForHeap               -XX:NativeMemoryTracking=detail               -javaagent:/data/skywalking/skywalking-agent.jar=agent.service_name=energy-order-api,agent.instance_name=$MY_POD_NAME,collector.backend_service=internal-skywalking.xxxx.xxm:11800-Dapollo.meta=http://apollo-configservice.infrastructure.svc.cluster.local:8080-Denv=pro /data/app.jar;/sbin/tini -s"]env:#获取pod实例名称,因为一个pod可能会有多个副本,所以需要根据名称来进行区分;-name:MY_POD_NAME          valueFrom:fieldRef:fieldPath:metadata.name        -name:POD_IP              valueFrom:fieldRef:apiVersion:v1                  fieldPath:status.podIP        resources:requests:memory:"4Gi"cpu:"2000m"limits:memory:"4Gi"cpu:"2000m"volumeMounts:-name:energy-order-api-logs          mountPath:/data/logs          subPathExpr:$(MY_POD_NAME)        ports:-containerPort:80lifecycle:preStop:exec:command:-/bin/sh                -'-c'->-curl -X PUT                  "http://nacosfat1.internal.dns:8848/nacos/v1/ns/instance?serviceName=`echo                  ${MY_POD_NAME}|awk -F'-' '{print                  $1"-"$2"-"$3}'`&ip=${POD_IP}&port=80&weight=0"&&sleep 30                  &&PID=`pidof java` &&kill -SIGTERM $PID &&while ps -p                  $PID >/dev/null; do sleep 1; done        terminationGracePeriodSeconds:40livenessProbe:httpGet:path:/actuator/info            port:80initialDelaySeconds:70#pod启动多长时间后开始去探测;periodSeconds:5#每隔多长时间去探测一次;failureThreshold:6readinessProbe:httpGet:path:/actuator/info            port:80initialDelaySeconds:70periodSeconds:5failureThreshold:6affinity:#节点亲和性nodeAffinity:#硬策略requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:#标签键-key:ResourcePool                operator:In                #标签值values:-core        #pod反亲和性配置podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:-labelSelector:matchExpressions:-key:app                operator:In                values:-energy-order-api            topologyKey:kubernetes.io/hostname               volumes:-name:energy-order-api-logs        persistentVolumeClaim:claimName:energy-order-api-logs---kind:PersistentVolumeClaimapiVersion:v1metadata:name:energy-order-api-logs  namespace:data-centerspec:accessModes:-ReadWriteMany  storageClassName:alicloud-nas-subpath  resources:requests:storage:1Gi

    3.重新apply deployment后测试

    在这里插入图片描述
    在这里插入图片描述
    如上,现在Pod已经启动成功并且在nacos中也是可用状态

    开始测试
    在这里插入图片描述
    如上当开始停止旧pod时, 会先调用我们配置的prestop钩子 如下 先把nacos中旧pod的权重改为0 不让其接受请求,然后再处理已接受的请求最后彻底关闭pod

    在这里插入图片描述
    可以看到整个流程下来是没有发现有请求失败的!
    在这里插入图片描述

    这是单对这一个order服务进行的测试,接下来需要走一遍整体下单的流程,调用多个服务进行测试的同时重新发布这个order服务看是否有失败的请求

    4.整体(下单)测试流程验证是否生效

    已启动的pod以及nacos状态如下:
    在这里插入图片描述
    在这里插入图片描述
    开始测试
    在这里插入图片描述
    在这里插入图片描述
    如上可以发现在停止Pod时,跟上面的结果是一样的,都是先把nacos中旧pod的权重改为0,然后等待处理请求再彻底关闭pod;

    如下测试,整体一个下单流程再发布期间也是不回受到影响的,无报错
    在这里插入图片描述

    四、模拟请求报错

    模拟请求报错就是不加任何配置直接使用测试脚本(这里用的是jmeter)不间断的去调用我们的应用,然后发布我们的新应用会有失败的请求

    ##现在的deployment文件为如下##apiVersion:apps/v1kind:Deploymentmetadata:namespace:data-center  name:energy-order-api  labels:app:energy-order-apispec:replicas:3selector:matchLabels:app:energy-order-api  template:metadata:labels:app:energy-order-api    spec:imagePullSecrets:-name:harbor-secret      containers:-name:energy-order-api        image:registry.xxxx/hqt-registry-pro/energy-order-api:P-1391-2023xxxx-15.47.45        imagePullPolicy:IfNotPresent        command:["/bin/sh"]args:["-c","java -jar               -Xmx2688m               -Xms2688m               -Xmn961m               -XX:MaxMetaspaceSize=512m               -XX:MetaspaceSize=512m               -Xloggc:/logs/gc-%t.log               -XX:+HeapDumpOnOutOfMemoryError                -XX:HeapDumpPath=/data/logs/heapdump_$MY_POD_NAME.hprof              -XX:+PrintGCDetails               -XX:+UnlockExperimentalVMOptions               -XX:+UseCGroupMemoryLimitForHeap               -XX:NativeMemoryTracking=detail               -javaagent:/data/skywalking/skywalking-agent.jar=agent.service_name=energy-order-api,agent.instance_name=$MY_POD_NAME,collector.backend_service=internal-skywalking.xxxx.xxm:11800-Dapollo.meta=http://apollo-configservice.infrastructure.svc.cluster.local:8080-Denv=pro /data/app.jar;/sbin/tini -s"]env:#获取pod实例名称,因为一个pod可能会有多个副本,所以需要根据名称来进行区分;-name:MY_POD_NAME          valueFrom:fieldRef:fieldPath:metadata.name        resources:requests:memory:"4Gi"cpu:"2000m"limits:memory:"4Gi"cpu:"2000m"volumeMounts:-name:energy-order-api-logs          mountPath:/data/logs          subPathExpr:$(MY_POD_NAME)        ports:-containerPort:80livenessProbe:httpGet:path:/actuator/info            port:80initialDelaySeconds:70#pod启动多长时间后开始去探测;periodSeconds:5#每隔多长时间去探测一次;failureThreshold:6readinessProbe:httpGet:path:/actuator/info            port:80initialDelaySeconds:70periodSeconds:5failureThreshold:6affinity:#节点亲和性nodeAffinity:#硬策略requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:#标签键-key:ResourcePool                operator:In                #标签值values:-core        #pod反亲和性配置podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:-labelSelector:matchExpressions:-key:app                operator:In                values:-energy-order-api            topologyKey:kubernetes.io/hostname               volumes:-name:energy-order-api-logs        persistentVolumeClaim:claimName:energy-order-api-logs---kind:PersistentVolumeClaimapiVersion:v1metadata:name:energy-order-api-logs  namespace:data-centerspec:accessModes:-ReadWriteMany  storageClassName:alicloud-nas-subpath  resources:requests:storage:1Gi

    Pod启动成功如下:
    在这里插入图片描述

    在这里插入图片描述
    设置30个线程开始去请求我们服务的接口
    可以看到目前的请求都是成功的,此时我们修改镜像apply可以模拟下我们的服务发布,当新Pod启动后 删除旧Pod时注意观察请求是否有报错!

    在这里插入图片描述

    在这里插入图片描述
    可以发现在删除pod时的这个动作会出现错误请求,随后就会正常
    在这里插入图片描述
    以上就是发版(新Pod替换旧Pod)的过程中会出现的问题;

    三、

    `

    文章目录

    • 前言
    • 一、环境描述
    • 二、环境描述

    名称版本部署方式
    kubernetesv1.20.11二进制
    nacosv2.0.3集群模式

    二、期间遇到的问题

    如果不配置nacos清理元数据信息的话,会导致当cpu/内存使用超过限制而导致健康检查重启时(Pod实例自身重启而不是会起一个新pod),会出现即使pod重启完nacos里注册的服务权重是0/下线,导致服务直接不可用,只能手动再去启用!!所以下面在nacos的配置一定要进行使用!
    在这里插入图片描述

    如下:
    服务因健康检查失败开始重启

    在这里插入图片描述
    在这里插入图片描述
    此时的请求开始报错
    在这里插入图片描述
    服务的权重变为0,不接收请求
    在这里插入图片描述
    pod重启完成
    在这里插入图片描述
    发现nacos里注册的服务权重依然为0,并没进行接收请求
    在这里插入图片描述
    请求依旧报错
    在这里插入图片描述


    配置优雅上下线
    • 1.修改nacos配置
    • 2.修改depolyment配置
    • 3.重新apply deployment后测试
    • 4.整体(下单)测试流程验证是否生效
  • 四、配置优雅上下线

    1.修改nacos配置

    [root@iZbp1iz5ayf044rk5cqq26Z ~]# vim /hqtbj/hqtwww/nacos_workspace/conf/application.properties#打开注释并修改### The interval to clean expired metadata, unit: milliseconds.nacos.naming.clean.expired-metadata.interval=5000### The expired time to clean metadata, unit: milliseconds.nacos.naming.clean.expired-metadata.expired-time=5000

    保存后重启nacos

    2.修改depolyment配置

    需要添加k8s的prestop钩子,以及设置强制关闭pod的时间要比sleep的时间长
    'curl -X PUT "http://my-nacos.xxx.com/nacos/v1/ns/instance?serviceName=服务名称&ip=服务IP&port=服务端口&weight=0" && sleep 30 && PID= && kill -SIGTERM $PID && while ps -p $PID > /dev/null; do sleep 1; done'
    terminationGracePeriodSeconds: 40
    如上命令的作用:

    1. 使用curl将注册到nacos的实例权重设置为0,设置为0后就不会再接受请求了,也可以调用nacos的下线接口,只需要将weight=0改为enabled=false即可;
    2. 不接受请求后sleep睡眠30秒 用于处理已经发送过来的请求;
    3. 然后再kill -SIGTERM进行优雅的关闭服务;
    4. 等待Pod中的服务完全停止,如果在 terminationGracePeriodSeconds 40s内 (默认 30s) 还未完全停止,就发送 SIGKILL 信号强制杀死进程(kill -9)。期间遇到的问题