容器服务 kubernetes(ACK)中应用优雅上下线

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 容器服务 kubernetes(ACK)中应用优雅上下线

1. 概述

 kubernetes滚动升级的过程:
   1. 集群Deployment 或者 Statefulset 发生变化,触发部署滚动升级;
   2. 根据 Deolyement 等配置,K8S集群首先启动新的POD来替代老 POD;
   3. Deployemnt 根据配置调度 POD,拉取镜像,此时 POD 进入 Pending 状态;
   4. POD 绑定到Node上,启动容器,在就绪检查readinessProbe 探针通过后,新的POD进入Ready状态;
   5. K8S集群创建Endpoint,将新的POD纳入Service 的负载均衡;
   6. K8S集群移除与老POD相关的Endpoint,并且将老POD状态设置为Terminating,此时将不会有新的请求到达老POD,同时调用PreStop Hook执行配置的脚本;
   7. K8S集群会给老POD发送SIGTERM信号,并且等待 terminationGracePeriodSeconds 这么长的时间。(默认为30秒,可以根据优雅下线服务需要消耗时间调整)
   8. 超过terminationGracePeriodSeconds等待时间后, K8S集群会强制结束老POD,在这个时间段内要将老 POD 资源释放掉,否则可能残留无用资源被占用。



  从以上过程可以看到,如果在terminationGracePeriodSeconds 没有及时释放服务注册等资源信息,Service 负载均衡的健康检查又没有检查到老 POD服务已经挂掉,导致请求分发到这些 POD 上,从而触发一系列的请求错误,因而需要配置优雅下线脚本,在terminationGracePeriodSeconds 时间段内执行完毕。

2.优雅启动

  kubernetes 集群提供了探针,类似健康检查,只有该请求通过,新的 POD 才能进入 Ready 状态,kubernetes集群才会将新的 POD 纳入 Service 的负载均衡。
  因而如果该应用(POD)仅仅提供 service 配置的服务,不需要配置探针,就可以优雅启动,但是实际 POD 往往还有 HSF,LWP,Dubbo等注册于配置服务其实现负载均衡的服务,所以需要确保这些服务都已经启动,所以需要配置相应的探针。
同时,任何一个服务可能在运行中因为某种原因不稳定,导致服务中断,这个时候还需要配置livenessProbe探针,确保服务出故障时及时止损。
  我们的应用主要有HSF,LWP 和 Https 服务,对于三种服务都有的应用,要求应用提供健康检查的接口,能即时检查三种服务都正常与否,然后做以下配置:

livenessProbe:
  failureThreshold: 3
  initialDelaySeconds: 30
  periodSeconds: 30
  successThreshold: 1
  tcpSocket:
    port: 5084
  timeoutSeconds: 1
readinessProbe:
  failureThreshold: 3
  initialDelaySeconds: 30
  periodSeconds: 30
  successThreshold: 1
  tcpSocket:
    port: 5084
  timeoutSeconds: 1
restartPolicy: Always

  readinessProbe配置表示只有5804端口请求正常返回,pod 才会进入 ready 状态,确保各种服务 ok 。
livenessProbe 表示每10s 探一下5804端口,如果返回失败,达到阈值后,pod 会重启,对于服务出问题的 POD 及时止损。
   注意:readinessProbe探针的 探测频率和延时时间,不健康阈值等数据要合理,部分应用启动时间本身较长,如果设置的时间过短,会导致 POD 反复无效重启。

3. 优雅下线:

 我们的应用云上主要有 HSF,LWP 和 Https 服务,在 pod prestop里设置执行摘除服务注册信息脚本,来完成优雅下线。
 https 服务基于 kubernetes 服务 Service 来实现服务暴露,在老 POD 状态设置为Terminating后,就不会有请求达到,因而已经优雅下线;
 lwp 服务,通过注册 vipserver 来提供负载均衡,需要在下线前先摘除该服务注册,防止 老POD 下线后还有请求达到老 POD;
 HSF 服务通过注册 configserver 来提供负载均衡,需要在下线前先摘除该服务注册,防止 老POD 下线后还有请求达到老 POD。
yaml:

lifecycle:
  preStop:
    exec:
      command:
        - sudo
        - '-u'
        - admin
        - /home/admin/shutdown.sh
        - {app_name}

 preStop在 pod 终止之前,执行脚本 appctl.sh {app_name} stop。
 终止 HSF 与 LWP 脚本:

#!/bin/bash

APP_NAME=$1

## HEALTH_URL="http://localhost:7002/health"

offline() {
    echo "INFO: ${APP_NAME} try to offline..."
    offline_lwp
    offline_hsf
    echo "INFO: ${APP_NAME} offline success"
    return $?
}

offline_lwp() {
    echo "offline lwp"
        times=3
        for e in $(seq 3); do
            curl -s --connect-timeout 3 --max-time 5 ${offline_lwp_url}${APP_NAME} -o /dev/null
            sleep 1
        done
}

offline_hsf() {
   check_hsf=`(/usr/sbin/ss -ln4 sport = :12200; /usr/sbin/ss -ln6 sport = :12200) | grep -c ":12200"`
    check_pandora=`(/usr/sbin/ss -ln4 sport = :12201; /usr/sbin/ss -ln6 sport = :12201) | grep -c ":12201"`
    echo "try to offline hsf..."
    if [ $check_hsf -ne 0 -a $check_pandora -ne 0 ]; then
        echo "start to offline hsf...."
        ret_str=`curl --max-time ${HSF_ONLINE_TIMEOUT} -s "http://localhost:12201/hsf/offline?k=hsf" 2>&1`
        if echo "$ret_str" | grep "server is unregistered on cs(dr)" &>/dev/null; then
            echo "hsf offline success."
            return 0
        else
            echo "hsf offline failed."
            exit 9 # hsf offline failed
        fi
    else
        if [ $check_hsf -eq 0 ]; then
            echo "WARN: port 12200 cannot be detected."
        fi
        if [ $check_pandora -eq 0 ]; then
            echo "WARN: port 12201 cannot be detected."
        fi
        echo "WARN: hsf offline failed."
        # DO NOT exit here
    fi
}


echo "[stop 1] before call offline hsf,lwp ..."
 
相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
4月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
389 33
|
4月前
|
存储 人工智能 Kubernetes
ACK Gateway with AI Extension:面向Kubernetes大模型推理的智能路由实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with AI Extension组件,在Kubernetes环境中为大语言模型(LLM)推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
4月前
|
存储 运维 Kubernetes
容器数据保护:基于容器服务 Kubernetes 版(ACK)备份中心实现K8s存储卷一键备份与恢复
阿里云ACK备份中心提供一站式容器化业务灾备及迁移方案,减少数据丢失风险,确保业务稳定运行。
|
4月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
5月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
存储 设计模式 运维
YAML 管理 Kubernetes 应用
YAML 管理 Kubernetes 应用
416 1
|
存储 设计模式 运维
如何不编写 YAML 管理 Kubernetes 应用?
Kubernetes 将自身边界内的事物都抽象为资源。其中的主要部分,是以 Deployment、StatefulSet 为代表的 workload 工作负载控制器,其他各类资源都围绕这些主要的资源工作。这些资源合并起来,可以为 IT 技术工作者展现出一个以 workload 为中心的模型。Kubernetes 中所有的资源,都通过声明式配置文件来编辑描述,一条条的 Yaml 字段定义,给了 IT 技术人员最大的自由度的同时,也对技术人员的能力提出了极高的要求。
|
Kubernetes Shell 开发工具
使用 Kustomize 帮你管理 kubernetes 应用(二): Kustomize 的使用方法
本篇为系列文章第二篇,手把手教你使用 Kustomize 的两种方式。
4759 0
|
Kubernetes 容器
使用 Kustomize 帮你管理 kubernetes 应用(一):什么是 Kustomize ?
本篇为系列文章第一篇,介绍我对 Kustomize 的了解过程以及 Kustomize 是什么,为什么它能解决我的燃眉之急。
4289 0
|
Kubernetes 负载均衡 应用服务中间件
管理 Kubernetes 应用,So easy!
近期,企业级分布式应用服务(EDAS)针对 Kubernetes 应用的管理功能全新上线,顶着 EDAS 的光环,其中的 Kubernetes 应用管理又是怎样一件利器呢?
2520 0

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版
  • 推荐镜像

    更多