Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用k8s容器钩子触发事件

使用k8s容器钩子触发事件

作者头像
sunsky
发布于 2020-08-20 08:53:40
发布于 2020-08-20 08:53:40
1.8K00
代码可运行
举报
文章被收录于专栏:sunskysunsky
运行总次数:0
代码可运行

原文: http://yunke.science/2018/04/15/k8s-hook/

容器生命周期的钩子

Kubernetes容器提供了生命周期钩子。 钩子能使容器感知其生命周期内的事件,并且当相应的生命周期钩子被调用时运行指定的代码。

容器钩子分为两类触发点:容器创建后PostStart和容器终止前PreStop。

PostStart

这个钩子在容器创建后立即执行。 但是,并不能保证钩子将在容器ENTRYPOINT之前运行。 没有参数传递给处理程序。

容器ENTRYPOINT和钩子执行是异步操作。 如果钩子花费太长时间以至于容器不能运行或者挂起, 容器将不能达到running状态

PreStop

这个钩子在容器终止之前立即被调用。 它是阻塞的,意味着它是同步的, 所以它必须在删除容器的调用发出之前完成

如果钩子在执行期间挂起, Pod阶段将停留在running状态并且永不会达到failed状态。

如果PostStart或者PreStop钩子失败, 容器将会被kill。 用户应该使他们的钩子处理程序尽可能的轻量。

钩子处理程序的实现

容器可以通过实现和注册该钩子的处理程序来访问钩子。 可以为容器实现两种类型的钩子处理程序:

  • Exec - 在容器的cgroups和命名空间内执行一个特定的命令,比如pre-stop.sh。 该命令消耗的资源被计入容器。
  • HTTP - 对容器上的特定的端点执行HTTP请求。

在Pod的事件中没有钩子处理程序的日志。 如果一个处理程序因为某些原因运行失败,它广播一个事件。 对于PostStart, 这是FailedPostStartHook事件, 对于PreStop, 这是FailedPreStopHook事件。 你可以通过运行kubectl describe pod <pod_name>来查看这些事件。

定义预启动和预结束事件操作

下面将会创建含有一个容器的Pod,我们将会给这个容器设置预启动和预结束操作。 https://raw.githubusercontent.com/kubernetes/website/master/docs/tasks/configure-pod-container/lifecycle-events.yaml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/usr/sbin/nginx","-s","quit"]

使用 prestop hook 保证服务安全退出

在实际生产环境中使用spring框架,由于服务更新过程中,服务容器被直接终止,部分请求仍然被分发到终止的容器,导致出现500错误,这部分错误的请求数据占比较少,也可以忽略。 考虑添加优雅的终止方式,将错误请求降到最低,直至没有错误出现。

这里介绍 spring cloud 的服务发现组件: Eureka 是一个基于 REST 的服务,作为服务注册中心,用于定位服务来进行中间层服务器负载均衡和故障转移。 各服务启动时,会向Eureka Server注册自己的信息(IP,端口,服务信息等),Eureka Server会存储这些信息. 微服务启动后,会周期性(默认30秒)的向Eureka Server发送心跳以续约自己的”租期”,并可以从eureka中获取其他微服务的地址信息,执行相关的逻辑。

image

考虑现在eureka server 修改注册实例的状态,暂停服务( InstanceStatus.OUT_OF_SERVICE ),保留一段时间后,再删除服务。

禁用某个服务: curl -X PUT “http://admin:admin@192.168.101.100:8761/eureka/apps/{appName}/{instanceId}/status?value=OUT_OF_SERVICE"

说明:admin:admin是eureka的登录名和密码,如果没有,直接去掉前面这段; instanceId是上面打开的链接显示的服务列表中的标签内容,如:myapp:192.168.1.100:8080

在k8s 中的具体操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: NAME-service-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: NAME-service
  template:
    metadata:
      labels:
        app: NAME-service
    spec:
      containers:
      - name: NAME-service
        lifecycle:
          preStop:
            exec:
              command:
                - "/bin/sh"
                - "-c"
                - " \
                  APPLICATION=NAME-service; \
                  APPLICATION_PORT=8016; \
                  curl -s -X PUT http://eureka01-server.domain.com/eureka/apps/${APPLICATION}/$(hostname):${APPLICATION}:${APPLICATION_PORT}/status?value=OUT_OF_SERVICE; \
                  sleep 30; \
                  "

删除了无用的信息,重点关注 lifecycle 首先定义了服务名和端口的环境变量,把这部分单独作为变量,便于不同的服务进行修改。 使用 curl PUT 到eureka 配置状态为 OUT_OF_SERVICE。 配置一个sleep时间,作为服务停止缓冲时间。

参考连接
  1. 容器生命周期的钩子
  2. Pods 的终止
  3. 给容器生命周期设置操作事件
  4. eureka服务禁用

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Pod中的Prestop和postStart
在Kubernetes中,Pod中的preStop和postStart是容器的生命周期钩子,它们可以在容器终止之前或容器启动之后执行特定的操作。
玖叁叁
2023/04/29
2.9K0
k8s容器的钩子与优雅停机
在 Kubernetes 中,每次微服务的代码发布都意味着创建新版本的 pod 并删除旧 pod,如果部署不够优雅的话,可能出现如下两个问题:
SRE运维手记
2024/09/25
3340
k8s容器的钩子与优雅停机
【每日一个云原生小技巧 #56】Container Lifecycle Hooks
Kubernetes(K8s)中的 Container Lifecycle Hooks 允许容器管理生命周期事件。这些钩子使得在容器生命周期的特定时刻执行代码成为可能,例如在容器启动或终止时。理解和使用这些 Hooks 可以帮助更好地控制容器的行为和响应。
郭旭东
2024/01/04
3270
【每日一个云原生小技巧 #56】Container Lifecycle Hooks
容器化后无损上下线解决方案
绝大数事故发生在应用上下线发布阶段,所以要尽可能避免发布过程中由于应用自身代码问题对用户造成的影响。
SRE运维进阶之路
2023/11/21
5420
容器化后无损上下线解决方案
K8s-工作负载Pod
定义: Pod是Kubernetes中最小的部署单元,是一个或多个紧密关联容器的组合。
用户9645905
2024/07/31
1100
K8s-工作负载Pod
Kubernetes K8S之Pod 生命周期与postStart、preStop事件
每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此他们之间通信和数据交换更为高效。在设计时可以充分利用这一特性,将一组密切相关的服务进程放入同一个Pod中;同一个Pod里的容器之间仅需通过localhost就能互相通信。
踏歌行
2020/10/15
6.5K0
Kubernetes K8S之Pod 生命周期与postStart、preStop事件
Pod容器应用"优雅发布" - 运维笔记
K8S自身带有优雅终止Pod容器的机制,发送SIGTERM终止信号,在规定的terminationGracePeriodSeconds优雅时间内完成Pod优雅终止动作。
洗尽了浮华
2020/11/24
3.6K0
Pod容器应用"优雅发布" - 运维笔记
k8s主要概念大梳理!
k8s已经成为了绝对热门的技术,一个上点规模的公司,如果不搞k8s,都不好意思出去见人。安装k8s要突破种种网络阻碍,但更大的阻碍还在后面...
xjjdog
2021/04/16
1.7K0
k8s主要概念大梳理!
Kubernetes运维之容器编排高级Pod编写
创建 Pod 时,可以为其下的容器设置环境变量。通过配置文件的 env 或者 envFrom 字段来设置环境变量。
王先森sec
2023/04/24
6960
Kubernetes系列之Pod生命周期
整个k8s是推荐我们使用资源文件清单的格式编写, 资源清单有5个顶级的字段组成:apiVersion、kind、metadata、spec、status ,status是k8s集群运行的时候需要去关注的,即机器需要去关注的,而前面这四个,不管是开发工程师还是运维工程师都需要做一些基本的了解,以及探讨pod的生命周期。
编程识堂
2023/05/24
7580
Kubernetes系列之Pod生命周期
K8S Pod流量的优雅无损切换实践
Kubernetes 的部署基本上都是默认滚动式的,并且保证零宕机,但是它是有一个前置条件的。正是这个前置条件让零宕机部署表现为一个恼人的问题。为了实现 Kubernetes 真正的零宕机部署,不中断或不丢失任何一个运行中的请求,我们需要深入应用部署的运行细节并找到根源进行深入的根源分析。本篇的实践内容继承之前的知识体系,将更深入的总结零宕机部署方法。
用户5166556
2023/03/18
1.7K0
K8S Pod流量的优雅无损切换实践
「走进k8s」Kubernetes1.15.1必备知识 Pod 的钩子(18)
PS:为了掩饰所以提供了挂载方便查看删除后的优雅处理输出了一段话,但是实际的生产中最好的方式就是关闭容器的服务。PostStart 和 PreStop的使用方法其实不难。k8s都是命令的集合用多了自然熟悉。
IT架构圈
2019/08/19
1.7K0
「走进k8s」Kubernetes1.15.1必备知识 Pod 的钩子(18)
K8S Pod解析
上篇文章我们在解析K8S Container时,提到Pod的整个生命周期都是围绕“容器”这个核心进行运转,毕竟,Pod 是 Kubernetes 集群中能够被创建和管理的最小部署单元,只有弄清楚其底层原理以及实现细节,我们才能够对Kubernetes生态体系有所了解。
Luga Lee
2021/12/09
6030
K8S Pod解析
Pod的健康检查机制
对线上业务来说,保证服务的正常稳定是重中之重,对故障服务的及时处理避免影响业务以及快速恢复一直是开发运维的难点。Kubernetes提供了健康检查服务,对于检测到故障服务会被及时自动下线,以及通过重启服务的方式使服务自动恢复。
iginkgo18
2021/09/11
1.7K0
K8S 滚动更新如何优雅停止 Pod
优雅停止(Graceful shutdown) 这个说法来自于操作系统,我们执行关机之后都得 OS 先完成一些清理操作,而与之相对的就是硬中止(Hard shutdown),比如拔电源。
YP小站
2020/06/04
6.1K0
K8S 滚动更新如何优雅停止 Pod
3.工作负载-认识和使用Pod
「定义」:Pod是Kubernetes中最小的部署单元,是一个或多个紧密关联容器的组合。「调度」:Pod作为一个整体被调度到Kubernetes集群中的节点上。「生命周期」:Pod的生命周期由包含的容器的生命周期决定。
AI码师
2024/04/10
2300
3.工作负载-认识和使用Pod
【重识云原生】第六章容器6.4.2.1节——pod详解
        Pod是Kubernetes应用程序的最基本执行单元—是你创建或部署Kubernetes对象模型中的最小和最简单的单元。 Pod表示在集群上运行的进程。Pod封装了应用程序的容器(或者在某些情况下是多个容器)、存储资源、唯一的网络标识(IP地址)以及控制容器应该如何运行的选项。 Pod表示一个部署单元:Kubernetes中的应用程序的单个实例,该实例可能由单个容器或少量紧密耦合并共享资源的容器组成。Docker是Kubernetes Pod中最常见的容器,但Pods也支持其他容器。        Kubernetes集群中的Pod是如何管理容器的:
江中散人_Jun
2022/10/04
2.6K0
【重识云原生】第六章容器6.4.2.1节——pod详解
Pod 生命周期实战
Pod 遵循一个预定义的生命周期,起始于 Pending 阶段,如果至少 其中有一个主要容器正常启动,则进入 Running,之后取决于 Pod
ruochen
2021/12/04
1.4K0
从0到1搭建k8s(四)——深入探索Pod
如果读者已经按照前文的内容走下来,那么应该能够对k8s有一个非常基础的了解,即如何搭建环境,如何拉起一个容器,如何访问一个容器,这些操作都是我们想要往k8s部署应用所必须会的基本内容,帮助你快速的上手k8s。
点点寒彬
2021/01/17
7920
控制pod内container执行顺序的几种姿势
在使用k8s的过程中在特定场景可能需要控制pod的执行顺序,接下来我们将学习各个开源组件的实现方式
有点技术
2020/09/04
8.2K1
相关推荐
Pod中的Prestop和postStart
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档