本文主要从以下4个方面介绍Init容器:Init容器作用、Init容器特性、Init容器与应用容器的区别、Init容器实战 。
Kube.NETes中的Pod内可以运行多个容器,主要分为2种:Init容器、应用容器,Sidecar容器也是一种特殊的Init容器 。
文章插图
Init容器的作用Init 容器是一种特殊容器,在Pod内的应用容器启动之前运行 。用于执行一些初始化的任务或设置,或者用于延迟执行应用容器 。
有不少场景都需要在应用容器启动之前进行部分初始化操作,比如:等待某个服务需要等待其关联的服务可用后才启动、从配置中心获取配置后再启动 等 。
Init容器的特性
- Pod中的所有Init容器按定义的顺序串行运行,直到它们全部成功结束后,才能启动应用容器 。
- Init容器通常很?。?执行简单的逻辑 , 它们以轻量的方式快速运行 。
- Init容器与编程语言中的初始化对象类似 , 只会执行一次 。
- 在所有的 Init 容器没有成功完成之前,Pod不会变成 Ready 状态 。
- 某个Init容器运行失败后,会导致整个Pod重新启动(重启策略为 Never 时例外) 。如果 Pod 对应的重启策略为Never,并且 Pod 的 Init 容器失败,则Kubernetes会将Pod状态设置为失败 。
- Pod重启后,初始化容器也会再次运行,因此需要确保所有Init容器的操作具有幂等性 。这一点与应用开发中要保证某个接口的幂等性类似 。
文章插图
但是Init容器与应用容器也有三点不同:
- 应用容器运行后没有特殊情况不会停止 , 他们持续提供服务,没有运行完成的概念 。但是Init容器的存在就是为了初始化任务,所以必须是一个从开始到结束的过程 。
- 应用容器可以多个并行运行 。但是Init容器必须当前这个启动完成后,才能启动下一个 。
- Init容器的设计是为了完成初始化任务,所以Init容器必须要在 Pod 就绪之前运行完成 。自然的Init容器就不支持 生命周期、存活探针、就绪探针 。
- 定义一个Pod,Pod里定义了Init容器和应用容器 。
- Pod里的Init容器先从网络上下载数据 , 将下载的数据放到emptyDir 。
- 等待init容器执行完毕后,应用容器会自动启动 , 在应用容器中挂载emptyDir,此时应用容器可以看到Init容器之前下载的数据 。
apiVersion: v1kind: Podmetadata:name: init-contAIner-testnamespace: demolabels:App: init-container-testspec:nodeName: k8s-worker-1initContainers:- name: downloadimage: busyboxcommand:- wget- -O- /temp-dir/index.html- http://www.baidu.comvolumeMounts:- name: temp-dirmountPath: /temp-dircontainers:- name: web-appimage: Nginxports:- containerPort: 80hostPort: 8082volumeMounts:- name: temp-dirmountPath: /usr/share/nginx/htmlvolumes:- name: temp-diremptyDir: {}
执行kubectl describe pod init-container-test -n demo命令,可以看到有两处容器:文章插图
如果Init容器执行有异常,可以看到Pod会被不停地重启 。
文章插图
总结本文主要从以下四个方面介绍Init容器:Init容器作用、Init容器特性、Init容器与应用容器的区别、Init容器实战 。
重点要注意:
- Init容器按定义的顺序串行运行 。
- 确保所有Init容器的操作具有幂等性 。
【Kubernetes-Init容器的六个特性】
推荐阅读
- 解密前端三巨头:HTML、CSS和JavaScript的关系
- 掌握这1%的MySQL性能优化技巧,让你的系统飞起来!
- HTMX简介:无需借助JavaScript的动态HTML
- NLG应用:自然语言生成技术在各个领域的应用
- 计算机视觉的局限性:谈谈识别误差和挑战
- 任务感知预训练模型:提升搜索点击率的关键
- 2023年最适合教育的15种AI工具
- LLM 解读大模型的token
- 十个Python库的数据增强技巧,让你的数据分析更上一层楼"
- 使用Python语言和Pygame库,一步步打造自己的五子棋游戏!