研发工程师玩转Kubernetes——初始化容器和普通容器的区别

在现实场景中,我们为了降低业务耦合,往往会将一个大大的功能拆解成若干独立的小功能。比如主要业务启动前,需要将其所依赖的各种资源都拉下来。一种做法是在一个Pod内完成上述两步操作,但是会导致业务逻辑不够独立;另外一种做法就是启动一个Pod专门用于拉取资源,待其完成后再启动业务Pod。

错误的示例

下面部署的Pod将启动3个容器。前两个运行的容器只在/data/whoami追加了一行文本后就退出了。

# common-container.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: common-container-deployment
spec:replicas: 1selector:matchLabels:app: common-containertemplate:metadata:labels:app: common-containerspec:containers:- name: common-container-1image: busyboxcommand: ["/bin/sh", "-c", "echo \"this is init-common-container1\"; echo \"this is init-common-container-1\" >> /data/whoami"]volumeMounts:- name: emptydir-volumemountPath: /data- name: common-container-2image: busyboxcommand: ["/bin/sh", "-c", "echo \"this is init-common-container2\"; echo \"this is init-common-container-2\" >> /data/whoami"]volumeMounts:- name: emptydir-volumemountPath: /data- name: common-containerimage: busyboxcommand: ["/bin/sh", "-c", "while true; do cat /data/whoami; sleep 5; done"]volumeMounts:- name: emptydir-volumemountPath: /datavolumes:- name: emptydir-volumeemptyDir: medium: MemorysizeLimit: 1Gi

查看Pod状态,可以发现Pod因为前两个容器中脚本执行结束后,没有了前台进程,容器就退出了。进而导致Pod创建失败。

kubectl get pod
NAME                                           READY   STATUS             RESTARTS     AGE
common-container-deployment-5569564499-qchgq   1/3     CrashLoopBackOff   4 (7s ago)   40s
kubectl describe pod common-container-deployment-5569564499-qchgq 
……
Events:Type     Reason     Age                From               Message----     ------     ----               ----               -------Normal   Scheduled  17s                default-scheduler  Successfully assigned default/common-container-deployment-5569564499-qchgq to ubuntubNormal   Pulled     15s                kubelet            Successfully pulled image "busybox" in 2.257083309s (2.257101009s including waiting)Normal   Pulled     13s                kubelet            Successfully pulled image "busybox" in 2.260848562s (2.260857362s including waiting)Normal   Pulling    13s                kubelet            Pulling image "busybox"Normal   Pulled     11s                kubelet            Successfully pulled image "busybox" in 1.989747468s (1.989754568s including waiting)Normal   Created    11s                kubelet            Created container common-containerNormal   Started    10s                kubelet            Started container common-containerNormal   Pulling    10s (x2 over 17s)  kubelet            Pulling image "busybox"Normal   Pulled     8s                 kubelet            Successfully pulled image "busybox" in 2.033723483s (2.033734083s including waiting)Normal   Created    8s (x2 over 15s)   kubelet            Created container common-container-1Normal   Started    8s (x2 over 15s)   kubelet            Started container common-container-1Normal   Pulling    8s (x2 over 15s)   kubelet            Pulling image "busybox"Normal   Pulled     6s                 kubelet            Successfully pulled image "busybox" in 2.032193623s (2.032200723s including waiting)Normal   Created    6s (x2 over 13s)   kubelet            Created container common-container-2Normal   Started    6s (x2 over 13s)   kubelet            Started container common-container-2Warning  BackOff    4s (x2 over 5s)    kubelet            Back-off restarting failed container common-container-1 in pod common-container-deployment-5569564499-qchgq_default(fd19ae72-5fd0-420d-9931-0d976175cf77)Warning  BackOff    4s (x2 over 5s)    kubelet            Back-off restarting failed container common-container-2 in pod common-container-deployment-5569564499-qchgq_default(fd19ae72-5fd0-420d-9931-0d976175cf77)

正确的示例

我们将需要一次性运行结束后可以退出的容器使用initContainers描述。

# init_container.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: init-container
spec:replicas: 1selector:matchLabels:app: init-containertemplate:metadata:labels:app: init-containerspec:initContainers:- name: init-container-1image: busyboxcommand: ["/bin/sh", "-c", "echo \"this is init-container-1\"; echo \"this is init-container-1\" >> /data/whoami"]volumeMounts:- name: emptydir-volumemountPath: /data- name: init-container-2image: busyboxcommand: ["/bin/sh", "-c", "echo \"this is init-container-2\"; echo \"this is init-container-2\" >> /data/whoami"]volumeMounts:- name: emptydir-volumemountPath: /datacontainers:- name: init-containerimage: busyboxcommand: ["/bin/sh", "-c", "while true; do cat /data/whoami; sleep 5; done"]volumeMounts:- name: emptydir-volumemountPath: /datavolumes:- name: emptydir-volumeemptyDir: medium: MemorysizeLimit: 1Gi

查看Pod状态,可以发现已处于运行状态。说明Pod创建成功了。

kubectl get pod
NAME                              READY   STATUS    RESTARTS   AGE
init-container-55c6d46676-5knwk   1/1     Running   0          33s

使用initContainers描述的容器已经无法连接,只有最后一个有前台程序的容器在运行。

kubectl logs pods/init-container-55c6d46676-5knwk init-container1

error: container init-container1 is not valid for pod init-container-55c6d46676-5knwk

 kubectl logs pods/init-container-55c6d46676-5knwk init-container2

error: container init-container2 is not valid for pod init-container-55c6d46676-5knwk

kubectl logs pods/init-container-55c6d46676-5knwk init-container

this is init-container-1
this is init-container-2

总结

初始化容器用于运行一次就可以退出的业务场景,而普通容器则要一直有前台程序在运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/30951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【剑指Offer 58】翻转单词顺序,Java解密。

LeetCode 剑指Offer 75道练习题 文章目录 剑指Offer:翻转单词顺序示例:限制:解题思路:剑指Offer:翻转单词顺序 【题目描述】 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a stu…

JS 原型与继承2

//***-、原型、原型链、构造函数 prototype、 proto_、constructor function Foo(){this.a1} var foo new Foo(); Object.getPrototypeOf(foo);//访问对象原型 效果等同于,foo. proto ,只是更推荐使用 Es6的 Object.getPrototypeof()方式 // construct…

【AI】《动手学-深度学习-PyTorch版》笔记(十五):网络中的层、块和参数

AI学习目录汇总 1、什么是块? 在线性模型中,我们关注过单个神经元(单个神经网络的输入和输出); 在多层感知机中,我们关注过整层的神经元(前一层的输出作为后一层的输入); 如果将“多层感知机”视为一整体,称为“块”,可以将前一个块的输出作为后一个块的输入。 块…

yum安装tcpkill时出现No package dsniff available的解决方案

今天安装tcpkill的时候提示 [jiankunkingcmp24 ~]# yum -y install dsniff Loaded plugins: fastestmirror, langpacks Repository base is listed more than once in the configuration Repository updates is listed more than once in the configuration Repository extras…

PHP序列化,反序列化

一.什么是序列化和反序列化 php类与对象 类是定义一系列属性和操作的模板&#xff0c;而对象&#xff0c;就是把属性进行实例化&#xff0c;完事交给类里面的方法&#xff0c;进行处理。 <?php class people{//定义类属性&#xff08;类似变量&#xff09;,public 代表可…

MySQL高级-存储引擎+存储过程+索引(详解01)

目录 1.mysql体系结构 2.存储引擎 2.1.存储引擎概述 2.2.1.InnoDB 2.2.2.MyISAM 2.2.3.存储引擎选择 3.存储过程 3.1.存储过程和函数概述 3.2.创建存储过程 3.3.调用存储过程 3.4.查看存储过程 3.5.删除存储过程 3.6.语法 3.6.1.变量 3.6.2.if条件判断 3.6.3.…

知网期刊《中阿科技论坛》简介及投稿须知

知网期刊《中阿科技论坛》简介及投稿须知 主管单位&#xff1a;宁夏回族自治区科学技术厅 主办单位&#xff1a;宁夏回族自治区对外科技交流中心(中国一阿拉伯国家技术转移中心) 刊  期&#xff1a;月刊 国际刊号&#xff1a;ISSN 2096-7268 国内刊号&#xff1a;CN 64-…

抽象类,抽象方法

1、抽象类概述 由来 父类中的方法&#xff0c;被它的子类们重写&#xff0c;子类各自的实现都不尽相同。那么父类的方法声明和方法主体&#xff0c;只有声明还有意义&#xff0c;而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法。Java语法规定&#xff0c…

基于Doris实时数据开发的一些注意事项

300万字&#xff01;全网最全大数据学习面试社区等你来&#xff01; 最近Doris的发展大家是有目共睹的。例如冷热分离等新特性的持续增加。使得Doris在易用和成本上都有大幅提升。 基于Doris的一些存储实时数仓在越来越多的场景中开始有一些实践。大家也看到了这种方案频繁出现…

Kubernetes(K8s)从入门到精通系列之十五:利用 kubeadm 创建高可用K8s集群

Kubernetes K8s从入门到精通系列之十五:利用 kubeadm 创建高可用K8s集群 一、kubeadm、kubelet和kubectl的区别二、准备工作1.堆叠Stacked etcd拓扑2.外部etcd拓扑三、容器镜像四、命令行五、为 kube-apiserver 创建负载均衡器六、使用堆控制平面和 etcd 节点七、托管节点标签…

MYSQL进阶-查询优化- 实战 STATUS

回城传送–》《100天精通MYSQL从入门到就业》 文末有送书活动&#xff0c;可以参加&#xff01; 文章目录 一、练习题目二、SQL思路SQL进阶-查询优化- SHOW STATUS初始化数据解法SHOW STATUS是什么实战经验&#xff1a;常用的mysql状态查询1、QPS(每秒处理的请求数量)计算思路…

Android 13 Hotseat定制化修改

一.背景 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat图标禁止形成文件夹,hotseat图标禁止移动到Launcher中,下面开始…

对于现有的分布式id发号器的思考 id生成器 雪花算法 uuid

目录 雪花id tinyid uuid 分布式id特点 业务编号 数据中心编号 当前时间 ip地址 当前序号 对于时钟回拨问题 发号器机器当期时间小于redis的时间 解决方案 发号器机器当期时间等于redis时间 发号器机器当期时间大于redis时间 分布式id的单次获取和批次获取 在工…

C语言:在反汇编中,rep stos是什么意思?

在汇编语言中&#xff0c;"rep stos" 是一条指令的组合&#xff0c;用于在内存中进行重复的存储操作。这个组合实际上是两个指令的结合&#xff1a;"rep" 和 "stos"。 "rep"&#xff1a;这是一个前缀指令&#xff0c;代表"repeat…

MySQL 中的 Hash 索引

Hash 本身是一个函数&#xff0c;又被称为散列函数&#xff0c;它可以帮助我们大幅提升检索数据的效率。打个比方&#xff0c;Hash 就好像一个智能前台&#xff0c;你只要告诉它想要查找的人的姓名&#xff0c;它就会告诉你那个人坐在哪个位置&#xff0c;只需要一次交互就可以…

ToolLLM:能够使用 16000 种真实 API 的 LLM

随着对 LLM&#xff08;大语言模型&#xff09;的了解与使用越来越多&#xff0c;大家开始偏向于探索 LLM 的 agent 能力。尤其是让 LLM 学习理解 API&#xff0c;使用工具进行对用户的 instruction&#xff08;指令&#xff09;进行处理。然而&#xff0c;目前的开源大模型并不…

大麦订单截图 一键生成订单截图

新版付款图样式展示 这个样式图就是在大麦刚付款完的一个订单截图&#xff0c;它的状态是等待卖家发货 下滑下载源码 下载源码&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

【新闻】室温超导体来了?可以在超级计算机上写代码,用超级计算机打游戏?

2023年7月&#xff0c;韩国科学家团队表示&#xff0c;他们发现了全球首个室温超导材料&#xff0c;一种名为“改性铅磷灰石晶体结构”的材料。7月31日&#xff0c;该团队第二篇论文《超导体 Pb10 xCux (PO4) 60o在室温常压下表现出悬浮现象及其机理》在arXiv上发布&#xff0c…

Linux-PG+postgres安装

一、PG数据库安装 1. 获取所需依赖包 wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/llvm5.0-devel-5.0.1-7.el7.x86_64.rpm wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/llvm5.0-5.0.1-7.el7.x86_64.rpm wge…