惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
Security Latest
Security Latest
T
Threatpost
L
Lohrmann on Cybersecurity
Know Your Adversary
Know Your Adversary
Cyberwarzone
Cyberwarzone
S
Securelist
A
Arctic Wolf
W
WeLiveSecurity
Help Net Security
Help Net Security
Last Week in AI
Last Week in AI
H
Hacker News: Front Page
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
博客园_首页
NISL@THU
NISL@THU
N
News and Events Feed by Topic
博客园 - 【当耐特】
S
Schneier on Security
阮一峰的网络日志
阮一峰的网络日志
Cloudbric
Cloudbric
P
Privacy International News Feed
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
宝玉的分享
宝玉的分享
Latest news
Latest news
美团技术团队
T
The Exploit Database - CXSecurity.com
S
Security Affairs
月光博客
月光博客
M
MIT News - Artificial intelligence
GbyAI
GbyAI
D
Docker
IT之家
IT之家
PCI Perspectives
PCI Perspectives
Application and Cybersecurity Blog
Application and Cybersecurity Blog
K
Kaspersky official blog
WordPress大学
WordPress大学
V2EX - 技术
V2EX - 技术
L
LINUX DO - 最新话题
P
Proofpoint News Feed
Google Online Security Blog
Google Online Security Blog
C
CERT Recently Published Vulnerability Notes
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
C
Cyber Attacks, Cyber Crime and Cyber Security
J
Java Code Geeks
I
InfoQ

蛮荆

如何获取更多的免费服务器 Kubernetes 调度器队列 - 设计与实现 Kubernetes 调度器 - 核心流程 Kubernetes Networking Model & CNI Kubernetes 控制器管理总结 Kubernetes CronJob 设计与实现 Kubernetes Job 设计与实现 Kubernetes HPA 设计与实现 Kubernetes Deployment 滚动更新实现原理 Kubernetes GC 设计与实现 Kubernetes Pod 驱逐 - 设计与实现 Kubernetes Daemonset 设计与实现 Kubernetes ReplicaSet 设计与实现 Kubernetes EndPoint 设计与实现 Kubernetes Informer 设计与实现 降本增效之应用优化 (三) 日志存储与检索 Kubernetes Pod 设计与实现 - 创建流程 Kubernetes 探针设计与实现 Unix 编程艺术名句摘录 Kubernetes - CRI 概述 Golang 编译速度为什么这么快? Kubernetes Pod 设计与实现 - Pause 容器 Kubernetes - kube-proxy 代理模式工程优化 Kubernetes 应用最佳实践 - 优雅关闭长连接 Kubernetes Service 类型和会话亲和性 Kubernetes 为什么需要 Ingress Kubernetes 架构 - 控制平面和数据平面 降本增效之应用优化 (二) 大报表 Go 语言如何获取 CPU 利用率 降本增效之应用优化 (一) Redis 业务规则引擎演变过程简述 微服务中的熔断算法 漏桶算法和令牌桶算法 jsonparser 为什么比标准库的 encoding/json 快 10 倍 ? zap 高性能设计与实现 HTTP Router 算法演进 fastcache 高性能设计与实现 Web 常见的三个安全问题 ants Code Reading Go 线程安全 map 方案选型 布隆过滤器 死锁、活锁、饥饿、自旋锁 sync.Pool Code Reading Go 内存管理概述 Go netpoll Code Reading goroutine 泄漏与检测 time/Timer Code Reading GMP Scheduler Code Reading Go channel 的 15 条规则和底层实现 为什么 Linux “一切皆文件” context.Context Code Reading runtime/HACKING.md Goland 最佳实践 互联网开发与金庸武学 为什么 Redis 6.0 引入多线程模型? Kubernetes 应用最佳实践 - 金丝雀发布 容器中如何正确配置 GOMAXPROCS ? singleflight Code Reading sync.Map Code Reading sync.Cond Code Reading sync.WaitGroup Code Reading sync.RWMutex Code Reading sync.Mutex Code Reading sync.Once Code Reading Go 无锁编程 sync/atomic Code Reading goroutine 交替打印奇偶数 GODEBUG Go 并发模式 Go 汇编 UUID 通用技术选型 Kubernetes 应用最佳实践 - 水平自动伸缩 Go 高性能 Tips fasthttp 为什么比标准库 net/http 快 10 倍 ? 技术文章配图指南 ChatGPT 初体验 Docker 网络原理概览 iptables 的五表五链 Kubernetes 应用最佳实践 - 亲和性和污点容忍度 Go 的反射与三大定律 Docker 官方提供的最佳实践 Go 语言内置的设计模式 HTTP1 到 HTTP3 的工程优化 Kubernetes 应用最佳实践 - Sidecar 模式 为什么 recover 必须在 defer 中调用? 为什么 defer 的执行顺序和注册顺序不同? Go map 设计与实现 Go 切片扩容底层实现 Go 语言中的零拷贝 Go Delve 云原生和边缘计算简介 Kubernetes Pod 服务质量等级 Kubernetes 应用最佳实践 - 探针 Kubernetes 应用最佳实践 - 资源请求和限制 CDN 原理 Kubernetes 应用最佳实践 - 开篇 缓存策略和模式 Go 内存模型 Kubernetes 核心概念 软件版本语义化
Kubernetes 应用最佳实践 - init 容器和钩子函数
2023-03-15 · via 蛮荆

2023-03-15 Cloud Native Kubernetes Kubernetes 应用最佳实践

init 容器

init 容器是一种特殊的容器,在 Pod 中的其他容器启动之前运行,单个 Pod 中可以有任意数量的 init 容器。

Pod 中所有 init 容器按顺序逐个执行,当所有 init 容器执行 「成功」后,才会启动其他容器

如果其中一个 init 容器失败,Pod 将根据 restartPolicy 选择是否重新启动,如果需要重新启动(restartPolicy 配置不等于 Never), 所有的 init 容器将再次重新运行,如果不需要重新启动(restartPolicy 配置等于 Never),Pod 的状态被标记为失败。

也就是说,可以利用 init 容器来完成应用的必要初始化操作,例如定义 3 个 init 容器分别来完成:

  1. 数据库连接池初始化
  2. 缓存连接池初始化
  3. 热点数据缓存在本地预加载

这样当 3 个 init 容器执行成功后,应用就可以随时接收流量了,反之,如果 3 个 init 容器任意一个出现问题,应用不会启动,这样确保流量不会进入到有问题的容器中。

图片来源: https://livebook.manning.com/book/kubernetes-in-action

作用

init 容器可以分离逻辑关注点,使容器保持单一用途

  • 开发人员可以聚焦业务代码逻辑,创建应用容器
  • 运维可以可以专注创建 init 容器,初始化应用依赖的所有前置组件

从作用上来说,通过在 Pod 中的应用容器中进行初始化操作,可以达到和 init 容器相同的作用,为什么一定要使用 init 容器呢? 主要原因是 init 容器提供了「顺序执行」和 「必须成功」的双重语义保证,虽然在应用容器也可以实现类似的约束,但是这会增加应用代码的复杂性。

最佳实践

  • init 容器应该保持轻量,同时应该快速执行完成并返回执行结果
  • init 容器内执行逻辑应该独立,不依赖于任何数据库状态数据和第三方接口返回值等情况
  • init 容器执行过程保证幂等 (尤其是容器可能执行失败的情况下)

生命周期事件函数

Kubernetes 提供了两种容器事件函数 (钩子函数):

  1. Post-Start: 容器启动后调用
  2. Pre-Stop : 容器停止 (Terminated) 前调用

事件函数与探针的使用方式类似:

  • 执行一个命令
  • 发送一个 HTTP请求

Post-Start

虽然 Post-Start 事件函数和容器代码是并行执行的,但是在 Post-Start 事件函数执行完成之前,容器会停留在 Waiting 状态,如果 Post-Start 事件函数执行失败,容器会被重启。

Pre-Stop

Pre-Stop 事件函数只有在容器结束(Terminated) 的时候才会触发,并且在函数执行完成后向容器应用进程发送 SIGTERM 信号,应用进程可以利用该信号来完成 “优雅关闭并退出”。

Pre-Stop 事件函数无论是否执行成功,容器最终都会被终止

最佳实践

  • 在 Post-Start 事件函数中启动定时任务、异步队列等操作
  • 在 Post-Start 事件函数中执行关闭文件、网络连接等操作
  • 重要业务逻辑不依赖于事件函数的执行结果

作用域

  1. init 容器的作用域是 Pod, 同时 init 容器不支持探针和事件函数
  2. 探针的作用域是容器
  3. Post-Start, Pre-Stop 函数的作用域是容器

图片来源: https://stackoverflow.com/questions/47999419/equivalent-of-init-containers-that-runs-after-termination

Reference