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

news2024/12/28 20:04:38
一、容器的初始化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: test
  labels:
    version: v1
    app: test-app
spec:
  containers:
   - name: mytest
     image: busybox
     command: ['sh','-c','echo runing && sleep 6000']
  initContainers:
   - name: init-service
     image: busybox
     imagePullPolicy: ifNotPresent
     command: ['sh','-c','until nslookup testservice; do echo waiting for myservice; sleep 2; done;']
   - name: init-db
     image: busybox
     imagePullPolicy: ifNotPresent
     command: ['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: TCP
      port: 80
      targetPort: 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: TCP
     port: 3366
     targetPort: 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.coloradmin.cn/o/2228982.html

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

相关文章

sqoop问题汇总记录

此篇博客仅记录在使用sqoop时遇到的各种问题。持续更新&#xff0c;有问题评论区一起探讨&#xff0c;写得有不足之处见谅。 Oracle_to_hive 1. main ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTr…

C++对象模型:Function 语意学

Member 的各种调用方式 Nonstatic Member Function 使用C时&#xff0c;成员函数和非成员函数在性能上应该是等价的。当设计类时&#xff0c;我们不应该因为担心效率问题而避免使用成员函数。 实现&#xff1a;编译器会将成员函数转换为一个带有额外this指针参数的非成员函数…

二叉树中的深搜 算法专题

二叉树中的深搜 一. 计算布尔二叉树的值 计算布尔二叉树的值 class Solution {public boolean evaluateTree(TreeNode root) {if(root.left null) return root.val 0? false: true;boolean left evaluateTree(root.left);boolean right evaluateTree(root.right);return…

【Linux】环境ChatGLM-4-9B 模型部署

一、模型介绍 GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本。 在语义、数学、推理、代码和知识等多方面的数据集测评中&#xff0c; GLM-4-9B 及其人类偏好对齐的版本 GLM-4-9B-Chat 均表现出超越 Llama-3-8B 的卓越性能。除了能进行多轮对话&#xf…

深入理解Java 线程并发编排工具: 概述和应用场景

目录 前言概述1. CountDownLatch2. CyclicBarrier3. Semaphore&#xff08;信号量)4. Condition 案例CountDownLatch-马拉松场景CyclicBarrier-马拉松场景Semaphore-公交车占座场景Condition-线程等待唤醒场景 前言 在 Java 的 java.util.concurrent (JUC) 包中&#xff0c;提…

C++初阶(八)--内存管理

目录 引入&#xff1a; 一、C中的内存布局 1.内存区域 2.示例变量存储位置说明 二、C语言中动态内存管理 三、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 四、operator new与operator delete函数&#xff08;重要点进行讲解&#xff09; …

架构的本质之 MVC 架构

前言 程序员习惯的编程方式就是三步曲。 所以&#xff0c;为了不至于让一个类撑到爆&#x1f4a5;&#xff0c;需要把黄色的对象、绿色的方法、红色的接口&#xff0c;都分配到不同的包结构下。这就是你编码人生中所接触到的第一个解耦操作。 分层框架 MVC 是一种非常常见且常…

Node学习记录-child_process 子进程

来自&#xff1a;https://juejin.cn/post/7277045020422930488 child_process用于处理CPU密集型应用&#xff0c;Nodejs创建子进程有7个API&#xff0c;其中带Async的是同步API,不带的是异步API child_process.exec(command[, options][, callback]) command:要运行的命令&am…

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持对接阿里云、腾讯云、天翼云、亚马逊S3云存储

随着云计算技术的日益成熟&#xff0c;越来越多的企业开始将其业务迁移到云端&#xff0c;以享受更为灵活、高效且经济的服务模式。在视频监控领域&#xff0c;云存储因其强大的数据处理能力和弹性扩展性&#xff0c;成为视频数据存储的理想选择。NVR批量管理软件/平台EasyNVR&…

2024年编程语言排行榜:技术世界的新星与常青树

随着技术的不断进步&#xff0c;编程语言的流行度也在不断变化。今天&#xff0c;就让我们一起来看看2024年的编程语言排行榜&#xff0c;探索哪些语言在技术世界中占据了主导地位。 1. Python&#xff1a;稳居榜首 Python以其在人工智能、数据科学、网络开发等多个领域的广泛…

MFC工控项目实例二十八模拟量信号每秒采集100次

采用两个多媒体定时器&#xff0c;一个0.1秒计时,另一个用来对模拟量信号采集每秒100次.。 1、在SEAL_PRESSUREDlg.h中添加代码 class CSEAL_PRESSUREDlg : public CDialog { public:CSEAL_PRESSUREDlg(CWnd* pParent NULL); // standard constructor&#xff0e;&#xff0e…

基于MoviNet检测视频中危险暴力行为

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【Faster & Mask R-CNN模型实现啤酒瓶瑕疵检测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生…

ArcGIS003:ArcMap常用操作0-50例动图演示

摘要&#xff1a;本文以动图形式介绍了ArcMap软件的基本操作&#xff0c;包括快捷方式创建、管理许可服务、操作界面元素&#xff08;如内容列表、目录树、搜索窗口、工具箱、Python窗口、模型构建器窗口等&#xff09;的打开与关闭、位置调整及合并&#xff0c;设置默认工作目…

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持视频投放在电视墙上

在当今智能化、数字化的时代&#xff0c;视频监控已经成为各行各业不可或缺的一部分&#xff0c;无论是公共安全、交通管理、企业监控还是智慧城市建设&#xff0c;都离不开高效、稳定的视频监控系统的支持。而在这些应用场景中&#xff0c;将监控视频实时投放到大屏幕电视墙上…

asp.net core 跨域配置不起作用的原因

1、中间件配置跨域的顺序不对 中间件顺序配置对了基本上就能解决大部分问题中间件顺序配置对了基本上就能解决大部分问题 附上官网简单的启用跨域的代码 var MyAllowSpecificOrigins "_myAllowSpecificOrigins";var builder WebApplication.CreateBuilder(args);…

Linux 命令解释器-shell

概念 shell &#xff1a;壳&#xff0c;命令解释器&#xff0c;负责解析用户输入的命令 分类&#xff1a; 内置命令 (shell 内置 ) &#xff0c; shell 为了完成自我管理和基本的管理&#xff0c;不同的 shell 内置不同的命令&#xff0c;但是大 部分都差不多 外置命令&…

【开源免费】基于SpringBoot+Vue.JS网上超市系统(JAVA毕业设计)

本文项目编号 T 037 &#xff0c;文末自助获取源码 \color{red}{T037&#xff0c;文末自助获取源码} T037&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

apisix高性能网关实现一机一密

基于 APISIX 的一机一密实现方案 概述 基于 Apache APISIX 网关的一机一密实现方案&#xff0c;通过自主开发的自定义插件实现设备级别的密钥管理和加密通信。本方案通过扩展 APISIX 的插件机制&#xff0c;实现高可用、可扩展的 API 安全防护。 本方案的主要特点&#xff1a; …

嵌入式Linux的AXI平台(platform)驱动教程

本文以JFMQL100的Linux系统的AXI接口的平台驱动为例&#xff0c;介绍嵌入式Linux的平台驱动编写、测试软件编写以及验证方式。本文的方法适用于任意嵌入式芯片Linux的物理地址映射的平台&#xff08;platform&#xff09;驱动的编写、测试与应用。 本文中AXI的开始地址为0x8000…

Visual Studio Code(VSCode)中编写 TypeScript 代码

在 Visual Studio Code&#xff08;VSCode&#xff09;中编写 TypeScript 代码通常需要以下配置&#xff1a; 一、安装必要的扩展 TypeScript 插件&#xff1a;由微软官方提供&#xff0c;提供了语法高亮、错误检查、代码补全等功能。 二、配置 tsconfig.json 文件&#xff08;…