k8s 和 nacos 如何优雅的停止 不宕机

  • Pod 设置为Terminating状态,并从所有服务的Endpoints列表中删除
  • 此时,Pod停止,但是Pod中运行的容器不受影响 流量不在转发进来 但是已经进来的流量继续处理
  • PreStop Hook被执行 nacos下线 后后面同步执行 所以可以sleep 25s 虽然经过测试好像没啥用  terminationGracePeriod 30s 这个时间管用 经过测试 无论怎么设置 sleep 容器都是到这个时间 才 kill掉
  • preStop Hook发送容器特殊命令或者Http请求到Pod中
  • 此时,Kubernetes将向Pod中的容器发送SIGTERM信号,这个信号即通知容器他们很快将进行关闭。
  • Kubernetes等待优雅的终止
  • 此时,Kubernetes等待指定的时间称为优雅终止宽限期。默认情况下,这是30秒(可以修改),值得注意的是,PreStop Hook和SIGTREM信息是属于并行执行,Kubernetes不会等待PreStop Hook完成。

nacos 下线代码 

package com.hnradio.saas.cms.controller;

import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
@Slf4j
public class NacosController {

    @Autowired
    private NacosAutoServiceRegistration nacosAutoServiceRegistration;



    @GetMapping(value = "/noauth/api/nacos/deregister")
    public String deregisterInstance() {
        log.info("---------------------开始停止pod到naocs--------------------");
        nacosAutoServiceRegistration.stop();
        log.info("---------------------结束停止pod到naocs--------------------");
        return "success";
    }
}

  spec:
        #在这个imagePullPolicy加 liftcyle
        imagePullPolicy: Always
        lifecycle:
          preStop:
            exec:
              command:
              - /bin/sh
              - -c
              - curl http://localhost:57010/cms/noauth/api/nacos/deregister
              - sleep 25
        name: cms-service

重启第一次 旧pod卸载 再次重启一次才行 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Kubernetes集群中使用Nacos进行优雅下线服务,可以通过在服务的`lifecycle`钩子中注册下线逻辑来实现。具体来说,你可以在服务容器中添加一个下线脚本,并在`lifecycle`钩子中调用该脚本,来实现优雅下线服务。下面是一个示例: 首先,你需要在服务容器中添加一个下线脚本,例如`shutdown.sh`: ```sh #!/bin/bash # 获取Nacos注册中心的地址和服务信息 NACOS_SERVER_ADDR=$(echo $NACOS_SERVER_ADDR | cut -d ':' -f 1) SERVICE_NAME=$(echo $SERVICE_NAME | cut -d '@' -f 1) NAMESPACE_ID=$(echo $SERVICE_NAME | cut -d ':' -f 1) GROUP=$(echo $SERVICE_NAME | cut -d ':' -f 2) # 下线服务 curl -X PUT "http://${NACOS_SERVER_ADDR}:8848/nacos/v1/ns/deregister?serviceName=${SERVICE_NAME}&namespaceId=${NAMESPACE_ID}&groupName=${GROUP}" # 停止服务接口,等待正在处理的请求处理完毕 # 关闭服务资源 # ... ``` 然后,在服务的Kubernetes部署配置文件中,你需要添加一个`lifecycle`钩子,来调用下线脚本。下面是一个示例配置文件: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: example spec: replicas: 1 selector: matchLabels: app: example template: metadata: labels: app: example spec: containers: - name: example image: example:latest env: - name: NACOS_SERVER_ADDR value: nacos-server:8848 - name: SERVICE_NAME value: example-service:dev lifecycle: preStop: exec: command: ["/bin/sh", "-c", "/app/shutdown.sh"] ``` 在上面的配置文件中,我们在容器的`lifecycle`钩子中注册了一个下线脚本,并在服务停止时调用该脚本。 请注意,为了让下线脚本能够正确地获取Nacos注册中心的地址和服务信息,你需要将这些信息通过环境变量的方式传递给服务容器。在上面的示例中,我们通过`NACOS_SERVER_ADDR`和`SERVICE_NAME`两个环境变量来传递这些信息。 最后,你可以通过运行`kubectl apply`命令来部署服务,并在服务停止时观察Nacos注册中心是否正确地下线了服务。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值