五、快速入门K8s之Pod容器的生命周期

ops/2024/11/1 10:41:03/
一、容器的初始化init

image-20240427095919673

⭐️ init c : init contariner 初始化容器,只是用来初始化,初始化完成就会死亡可以大于的等于一也可以没有,每个init只有在前一个init c执行完成后才可以执行下一个、init容器总是运行到成功完成为止,如果init运行失败k8s就会不断的重启该Pod,直到init容器成功为止,但是如果Pod对应的restartPolicyNerver,它就不会重启。

因为Init 容器具有与应用程序容器分离的单独镜像,所以它们的启动相关代码具有如下优势:

  • 它们可以包含并运行实用工具,但是出于安全考虑,是不建议在应用程序容器镜像中包含这些实用工具的

  • 它们可 以包含使用工具和定制化代码来安装,但是不能出现在应用程序镜像中。例如,创建镜像没必要FROM 另-一个镜像,只需要在安装过程中使用类似sedawkpythondig这样的工具。

  • 应用程序镜像可以分离出创建和部署的角色,而没有必要联合它们构建-一个 单独的镜像。

  • Init 容器使用Linux Namespace,所以相对应用程序容器来说具有不同的文件系统视图。因此,它们能够具有访问Secret 的权限,而应用程序容器则不能。

  • 它们必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以Init 容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法,直到满足了一组先决条件。

二、主容器
  • Main C : 主容器
  • readiness: 就绪检测,他会去判断容器能不能正常提供给外网访问,
  • Liveiness:生存检测

image-20240427100658636

容器运行时接口

⭐️ 每种容器运行时各有所长,许多用户都希望Kubernetes支持更多的运行时。在Kubernetes 1.5发布版里,我们引入了CRI–一个能让kubelet无需编译就可以支持多种容器运行时的插件接口。CRI包含了一组protocol buffersgRPC API,相关的库,以及在活跃开发下的额外规范和工具。

protocol buffers API包含了两个gRPC服务:ImageServiceRuntimeServiceImageService提供了从镜像仓库拉取、查看、和移除镜像RPCRuntimeSerivce包含了Pods和容器生命周期管理的RPC,以及跟容器交互的调用(exec/attach/port-forward)。一个单块的容器运行时能够管理镜像和容器(例如:DockerRkt),并且通过同一个套接字同时提供这两种服务。这个套接字可以在Kubelet里通过标识–container-runtime-endpoint和–image-service-endpoint进行设置。

Pending(悬决)Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间,
Running(运行中)Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。
Succeeded(成功)Pod 中的所有容器都已成功终止,并且不会再重启。
Failed(失败)Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。
Unknown(未知)因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。
三、init实验

1️⃣我们来通过一个yaml模板定义一个Pod在定义两个init,init操作是:

这个init容器的command是一个shell脚本,它执行以下操作:

  1. 使用nslookup命令检查testservicetestdb这两个服务是否可用。
  2. 如果testservicetestdb服务不可用,它会输出"waiting for myservice",然后等待2秒后再次尝试检查。
  3. 这个过程会一直重复,直到testservicetestdb服务都变得可用为止。
  4. Pod内可以直接使用Service的名字进行访问
[root@master ~]# cat pod/init.yaml 
apiVersion: v1
kind: Pod
metadata:name: testlabels:version: v1app: test-app
spec:containers:- name: mytestimage: busyboxcommand: ['sh','-c','echo runing && sleep 6000']initContainers:- name: init-serviceimage: busyboximagePullPolicy: ifNotPresentcommand: ['sh','-c','until nslookup testservice; do echo waiting for myservice; sleep 2; done;']- name: init-dbimage: busyboximagePullPolicy: ifNotPresentcommand: ['sh','-c','until nslookup testdb; do echo waiting for myservice; sleep 2; donel;']

上文的镜像是虽然没有带后缀但是默认就是latest,k8s中只要镜像后缀是latest就会从远程仓库拉去,可以设置

imagePullPolicy有三种策略

Always:总是从远程仓库拉去

Nerver: 仅使用本地镜像

IfNotPresent: 如果本地有就用,没有就从外部拉去

2️⃣使用编写号的yaml文档创建pod,此时pod正在等待init容器初始化完成

[root@master ~]# kubectl create -f pod/init.yaml 
pod/test created[root@master ~]# kubectl get pod
NAME                     READY   STATUS     RESTARTS   AGE
nginx-6b48575596-bsdt2   1/1     Running    1          42h
nginx-6b48575596-fbdjf   1/1     Running    1          42h
nginx-6b48575596-wzmdp   1/1     Running    1          42h
test                     0/1     Init:0/2   0          8s
website                  1/1     Running    0          17h

3️⃣ 要使得init容器初始化完成,就需要我们来创建两个个Service ,让pod可以解析到,这里先创建第一个

[root@master ~]# cat pod/service.yaml 
apiVersion: v1
kind: Service
metadata:name: testservice
spec:ports:- protocol: TCPport: 80targetPort: 9999

4️⃣ 创建好后如果init还没未启动就可以为容器配置域名解析信息

可以使用下面这条命令来修改pod的设置

kubectl edit pod [podname]   **打开后我们可以看见**
dnsPolicy: ClusterFirst 
  • Default“:从节点继承DNS相关配置,对节点依赖性强。
  • ClusterFirst“:如果DNS查询与配置好的默认集群域名前缀不匹配,则将查询请求转发到从节点继承而来,作为查询的上游服务器。默认则是这个
  • ClusterFirstWithHostNet“:如果pod工作在主机网络,就将dnsPolicy设置成“ClusterFirstWithHostNet”,这样效率更高。
  • None“:1.9版本引入的新特性(Beta in v1.10)。完全忽略kubernetes系统提供的DNS,以pod SpecdnsConfig配置取而代之。

当然也可以直接改DNSspec中加入

 dnsPolicy: "None"dnsConfig:nameservers:- 1.2.3.4

5️⃣ 此时我们在查看就会发现init容器已经准备好一个了

[root@master ~]# kubectl get pod
NAME   READY   STATUS     RESTARTS   AGE
test   0/1     Init:1/2   0          29m
[root@master ~]# kubectl get svc
NAME          TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes    ClusterIP   10.96.0.1    <none>        443/TCP   2d18h
testservice   ClusterIP   10.98.62.1   <none>        80/TCP    53m

6️⃣ 运行第二个service

[root@master ~]# cat pod/service2.yaml 
apiVersion: v1
kind: Service
metadata:name: testdb
spec:ports:- protocol: TCPport: 3366targetPort: 9998[root@master ~]# kubectl get svc
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP    2d18h
testdb        ClusterIP   10.97.182.149   <none>        3366/TCP   7s
testservice   ClusterIP   10.98.62.1      <none>        80/TCP     55m

可以看见pod变running了

[root@master ~]# kubectl get pod
NAME   READY   STATUS    RESTARTS   AGE
test   1/1     Running   0          57m

⭐️ 特殊说明
  • 在Pod启动过程中,Init 容器会按顺序在网络和数据卷初始化之后启动(pause)。每个容器必须在下-一个容器启动之前成功退出,也就是说init容器不是先被启动的先被启动的是pause容器

  • 如果由于运行时或失败退出,将导致容器启动失败,它会根据Pod的restartPolicy 指定的策略进行重试。然而,如果Pod的restartPolicy 设置为Always, Init 容器失败时会使用RestartPolicy策略 可以看上一章笔记

  • 在所有的Init 容器没有成功之前,Pod 将不会变成Ready状态。Init容器的端口将不会在Service中进行聚集。正在初始化中的 Pod处于Pending 状态,但应该会将Initializing 状态设置为true ,ps:就是说你的mian container 或者init container 都没有完成,那么他们的端口和ip地址将不会出现在service

  • 如果Pod重启,所有Init 容器必须重新执行

  • ​ #对Init容器spec 的修改被限制在容器image 字段,修改其他字段都不会生效。更改Init容器image 字段,等价于重启该Pod ps:

  • Init 容器具有应用容器的所有字段。除了readinessProbe, 因为Init 容器无法定义不同于完成(completion)的就绪(readiness) 之外的其他状态。这会在验证过程中强制执行,ps:也就是说container下面写入的字段,initcontainer下面也可以写

  • 在Pod 中的每个appInit容器的名称必须唯一-; 与任何其它容器共享同一个名称,会在验证时抛出错误.


http://www.ppmy.cn/ops/130111.html

相关文章

大语言模型驱动的跨域属性级情感分析——论文阅读笔记

前言 论文PDF下载地址&#xff1a;7156 最近想搜一下基于大语言模型的情感分析论文&#xff0c;搜到了这篇在今年发表的论文&#xff0c;于是简单阅读之后在这里记一下笔记。 如图1所示&#xff0c;在餐厅领域中的"快"是上菜快&#xff0c;属于正面情感&#xff0c;但…

读写chrome.storage.local

修改chrome-extensions-samples\api-samples\storage\stylizr&#xff0c;可以从GitHub下载。读取最好在回调函数里面读取&#xff0c;比较方便。 // Store CSS data in the "local" storage area. const storage chrome.storage.local;// Get at the DOM controls…

总分441数一149专137东南大学820信号数电考研经验电子信息与通信工程电路原920专业基础综合,真题,大纲,参考书。

一. 写在前面的话 本人是23年考生&#xff0c;本科就读于西电电子信息工程&#xff0c;以441分总分&#xff08;数学一149&#xff0c;英语83&#xff0c;专业课820&#xff08;原920信号和数电专业基础综合&#xff09;137&#xff0c;政治73&#xff09;考上东南信院电路与系…

appium+mumu模拟器+python 嚼碎菜鸟教程

1、android sdk 下载安装 下载地址&#xff1a;https://www.androiddevtools.cn/index.html# 选择版本&#xff1a;android sdk【sdk tools:installer_r24.4.1-windows.exe】 参考步骤&#xff1a;https://blog.csdn.net/2401_83004375/article/details/139300339 2、jdk 安装…

官方工具重装Windows 11当前版本 /绕过硬件检查/免U盘

官方工具重装Windows 11当前版本 /绕过硬件检查/免U盘 官方工具重装Windows 11当前版本 /绕过硬件检查/免U盘_win11安装跳过检测-CSDN博客

2024.10|AI/大模型在机器人/自动驾驶/智能驾舱领域的最新应用和深度洞察

AI/大模型-机器人 1. 大语言模型&#xff08;LLM&#xff09;在机器人领域的应用 多模态大语言模型&#xff08;LLM&#xff09;正逐步被应用于机器人控制和操作任务中。例如&#xff0c;ManipLLM是一种结合多模态输入的大语言模型&#xff0c;能够实现复杂的物体操作任务。这…

智慧养老/社区养老/家政预约/老年护理 小程序

1.支持内部外部护工人员登录&#xff0c;接单、更改预约日期、联系客户、收入提现等 2.记录从下单到派单、服务、评价的全流程&#xff0c;实时查看服务进度 3.护工人员到达现场后根据情况报价补差价或尾款 4.服务订单可指定某人员接单&#xff0c;也可护工人员自由 5.支持…

StringBuilder为何比String节省效率

StringBuilder为何比String节省效率 通常说StringBuilder比String节省效率一般是指在对字符串进行一定的操作&#xff0c;比如拼接、反转等&#xff0c;那么究竟为什么节省效率呢&#xff0c;本篇将从字符串拼接的原理来讲述 字符串拼接的两种实现 在Java中用加号对字符串进行…