K8s: 在Pod里面创建init容器与健康检查

K8S学习指南(9)-k8s核心对象init pod Init容器是在Pod中运行的一个独立的容器,它负责在主容器启动之前执行初始化任务。这些初始化任务可以包括数据准备、配置检查、网络设置等。一旦Init容器中的任务成功完成,Kubernetes将启动主容器。Init容器的生命周期是独立于主容器的,这使得我们能够在应用程序启动之前执行必要的预处理工作。 阅读详情

pod中init容器的创建


1 )概述

  • 每个 Pod 中可以包含多个容器, 应用运行在这些容器里面
  • 同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器
  • Init 容器与普通的容器非常像,除了如下两点
    • a. 它们总是运行到完成。
    • b. 每个都必须在下一个启动之前成功完成
  • 如果 Pod 的 Init 容器失败,K8s 会不断地重启该 Pod,直到 Init 容器成功为止
  • 然而,如果 Pod 对应的 restartPolicy 值为 Never,K8s 不会重新启动 Pod
  • 与普通容器的不同之处如下
    • a. Init 容器支持应用容器的全部属性和特性,包括资源限制、数据卷和安全设置。
    • b. 同时 Init 容器不支持 lifecycle、livenessProbe、readinessProbe 和 startupProbe, 因为它们必须在 Pod 就绪之前运行完成

2 )Init Pod 的创建

  • 下面的例子定义了一个有 init 容器和一个业务容器

  • 创建 init-pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
     name: init-pod-demo
     labels:
       name: init-pod
    spec:
     containers:
     - name: busybox-container
       image: busybox:latest
       command: ['sh', '-c', 'date && sleep 3600']
       resources:
         limits:
           memory: "128Mi"
           cpu: "500m"
       ports:
       - containerPort: 80
     initContainers:
     - name: init-container
       image: busybox:latest
       command: ['sh', '-c', "date && sleep 10"]
    
  • $ kubectl apply -f init-pod.yaml 创建 pod

    pod/init-pod-demo created
    
  • $ kubectl get po -w 查看pod的创建过程

    init-pod-demo    0/1     Init:0/1          0          16s
    init-pod-demo    0/1     PodInitializing   0          17s
    init-pod-demo    1/1     Running           0          27s
    
  • $ kubectl logs init-pod-demo 查看 pod 日志

    Thu Apr 18 07:31:59 UTC 2024
    
  • $ kubectl logs init-pod-demo -c init-container 进入init容器查看日志

    Thu Apr 18 07:31:39 UTC 2024
    
  • 从上面一系列输出中可以看到,在 PodInitializing 和 Running 两个阶段用了 10s

    • 这个对应着在init容器中运行的脚本中打印时间后,睡了 10s
  • 同时pod中和容器中打印的时间相差 20s,这两个相差的时间一定是 大于 睡了的10s的

  • 也就是说,业务容器运行之前必须启动完成init容器

pod的健康检查


1 )探针的作用

  • 探针 是由 kubelet 对容器执行的定期诊断
  • 要执行诊断,kubelet 调用由容器实现的 Handler (处理程序),有三种类型的处理程序:
    • ExecAction
      • 在容器内执行指定命令
      • 如果命令退出时返回码为 0 则认为诊断成功
    • TCPSocketAction
      • 对容器的 IP 地址上的指定端口执行 TCP 检查
      • 如果端口打开,则诊断被认为是成功的
    • HTTPGetAction
      • 对容器的 IP 地址上指定端口和路径执行 HTTP Get 请求
      • 如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的
  • 每次探测都将获得以下三种结果之一
    • Success(成功):容器通过了诊断
    • Failure(失败):容器未通过诊断
    • Unknown(未知):诊断失败,因此不会采取任何行动

2 ) 使用启动探针

  • 对于所包含的容器需要较长时间才能启动就绪的 Pod 而言,启动探针是有用的
  • 你不再需要配置一个较长的存活态探测时间间隔,只需要设置另一个独立的配置选定
  • 对启动期间的容器执行探测,从而允许使用远远超出存活态时间间隔所允许的时长
  • 如果你的容器启动时间通常超出 initialDelaySeconds + failureThreshold × periodSeconds 总值
  • 你应该设置一个启动探测,对存活态探针所使用的同一端点执行检查
  • periodSeconds 的默认值是 30 秒
  • 你应该将其 failureThreshold 设置得足够高, 以便容器有充足的时间完成启动
  • 并且避免更改存活态探针所使用的默认值, 这一设置有助于减少死锁状况的发生

3 ) 创建一个 HTTP 请求的探针

  • 创建一个 liveness.yaml 文件

    apiVersion: v1
    kind: Pod
    metadata:
      name: liveness-http
      labels:
        test: liveness
    spec:
      containers:
      - name: liveness
        image: mirrorgooglecontainers/liveness
        args:
        - /server
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
            httpHeaders:
            - name: Custom-Header
              value: Awesome
          initialDelaySeconds: 3
          periodSeconds: 3
    
  • 这是官方曾经提供的一个案例

  • 在这个配置文件中,可以看到 Pod 也只有一个容器

  • periodSeconds 字段指定了 kubelet 每隔 3 秒执行一次存活探测

  • initialDelaySeconds 字段告诉 kubelet 在执行第一次探测前应该等待 3 秒

  • kubelet会向容器内运行的服务(服务会监听 8080 端口)发送一个 HTTP GET 请求来执行探测

  • 如果服务器上 /healthz 路径下的处理程序返回成功代码,则 kubelet 认为容器是健康存活的

  • 如果处理程序返回失败代码,则 kubelet 会杀死这个容器并且重新启动它

  • 任何大于或等于 200 并且小于 400 的返回代码标示成功,其它返回代码都标示失败。

  • 可以有容器内运行服务的源码 server.go

    http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
    	 duration := time.Now().Sub(started)
    	 if duration.Seconds() > 10 {
    		 w.WriteHeader(500)
    		 w.Write([]byte(fmt.Sprintf("error: %v", duration.Seconds())))
    	 } else {
    		 w.WriteHeader(200)
    		 w.Write([]byte("ok"))
    	 }
    })
    
  • 容器存活的最开始 10 秒中, /healthz 处理程序返回一个 200 的状态码

  • 之后处理程序返回 500 的状态码

  • $ kubectl apply -f liveness.yaml 创建 pod

    pod/liveness-http created
    
  • $ kubectl get po -w | grep live 监控 pod

    liveness-http    0/1     ContainerCreating   0          2s
    liveness-http    1/1     Running             0          5s
    liveness-http    1/1     Running             1 (4s ago)   26s
    liveness-http    1/1     Running             2 (3s ago)   46s
    liveness-http    1/1     Running             3 (3s ago)   67s
    liveness-http    1/1     Running             4 (3s ago)   88s
    liveness-http    0/1     CrashLoopBackOff    4 (0s ago)   106s
    liveness-http    1/1     Running             5 (56s ago)   2m42s
    liveness-http    0/1     CrashLoopBackOff    5 (0s ago)    2m58s
    liveness-http    1/1     Running             6 (95s ago)   4m33s
    liveness-http    0/1     CrashLoopBackOff    6 (0s ago)    4m52s
    
    • 可见一直在重启
  • $ kubectl describe pod liveness-http 查看 pod 详细问题

    Name:         liveness-http
    Namespace:    default
    Priority:     0
    Node:         node1.k8s/10.211.55.11
    Start Time:   Thu, 18 Apr 2024 16:45:57 +0800
    Labels:       test=liveness
    Annotations:  <none>
    Status:       Running
    IP:           10.244.1.27
    IPs:
      IP:  10.244.1.27
    Containers:
      liveness:
        Container ID:  docker://0bde3a8c2ab79d2fd389659354771da10edbdfd29e3bb3d5c87fcbcb44f918b1
        Image:         mirrorgooglecontainers/liveness
        Image ID:      docker-pullable://mirrorgooglecontainers/liveness@sha256:854458862be990608ad916980f9d3c552ac978ff70ceb0f90508858ec8fc4a62
        Port:          <none>
        Host Port:     <none>
        Args:
          /server
        State:          Waiting
          Reason:       CrashLoopBackOff
        Last State:     Terminated
          Reason:       Error
          Exit Code:    2
          Started:      Thu, 18 Apr 2024 16:47:19 +0800
          Finished:     Thu, 18 Apr 2024 16:47:36 +0800
        Ready:          False
        Restart Count:  4
        Liveness:       http-get http://:8080/healthz delay=3s timeout=1s period=3s #success=1 #failure=3
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-nv6lw (ro)
    Conditions:
      Type              Status
      Initialized       True
      Ready             False
      ContainersReady   False
      PodScheduled      True
    Volumes:
      kube-api-access-nv6lw:
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  3607
        ConfigMapName:           kube-root-ca.crt
        ConfigMapOptional:       <nil>
        DownwardAPI:             true
    QoS Class:                   BestEffort
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type     Reason     Age                 From               Message
      ----     ------     ----                ----               -------
      Normal   Scheduled  114s                default-scheduler  Successfully assigned default/liveness-http to node1.k8s
      Normal   Pulled     111s                kubelet            Successfully pulled image "mirrorgooglecontainers/liveness" in 2.298827654s
      Normal   Pulled     92s                 kubelet            Successfully pulled image "mirrorgooglecontainers/liveness" in 1.281083837s
      Normal   Created    74s (x3 over 111s)  kubelet            Created container liveness
      Normal   Started    74s (x3 over 111s)  kubelet            Started container liveness
      Normal   Pulled     74s                 kubelet            Successfully pulled image "mirrorgooglecontainers/liveness" in 1.048779521s
      Warning  Unhealthy  58s (x9 over 100s)  kubelet            Liveness probe failed: HTTP probe failed with statuscode: 500
      Normal   Killing    58s (x3 over 94s)   kubelet            Container liveness failed liveness probe, will be restarted
      Normal   Pulling    57s (x4 over 114s)  kubelet            Pulling image "mirrorgooglecontainers/liveness"
    
    • 这里可以看到
      • Liveness probe failed: HTTP probe failed with statuscode: 500
      • Container liveness failed liveness probe, will be restarted
    • 返回 500 之后,进行了重启
  • 这样,通过探针的健康检查,可以判断pod的运行健康状态

k8s——Pod详解 Pod是kubernetes中,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等。。现代容器技术建议一个容器只运行一个进程,该进程在容器中。 阅读详情

相关推荐

Kubernetes 初始化Pod容器和静态Pod

1、init Container 通常我们希望在真正的应用启动之前去创建一些应用需要的文件、目录。在k8s资源中我们可以通过init container来实现。配置如下: 使用init container判断volume是否挂在成功,并切判断里卖弄是否写入文件 # cat &amp;lt;&amp;lt; EOF &amp;gt; init-container.yaml apiVersion: v1 kind: Pod...

Andriy_dangli 3477

pod状态异常原因分析

pod状态

mac99776的博客 7174

【K8S系列】Pod重启策略及重启可能原因

1 重启策略 1.1Always Pod中的容器,不管因为什么原因停止,都会自动重启。 该为默认策略, 没有定义重启策略时,默认的就是always 1.2OnFailure Pod中的容器,非正常停止/异常退出时,会自动重启容器,如果是正常停止,则不会 1.3Nerver Pod中容器不管以什么原因退出,都不会自动重启容器 自动重启的可能原因: 1.Xms超出了k8s分配 2.docker容器的内存限制 3.出现OOMKilled事件

颜淡慕潇 1万+

Pod状态解释

Evicted 即驱赶的意思,意思是当节点出现异常时,kubernetes将有相应的机制驱。CreateContainerConfigError 不能创建kubelet使用的容器配置。ContainersNotInitialized 容器没有初始化完毕。

wangqiaowq的博客 914

小白 虚拟机 kali_Linux安装 详细教程

安装版本:VMmare workstation pro kali_Linux 安装环境:Window10 首先我们先了解一下什么是kali_linux: Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统。每一季度更新一次。由Offensive Security Ltd维护和资助。最先由Offensive Security的Mati Aharoni和Devon Kearns通过重写BackTrack来完成,BackTrack是他们之前写的用于取证的Linux发行

m0_50917178的博客 9万+

避坑指南:Cursor AI生成Flutter代码时最容易翻车的5个配置细节

本文深入剖析了使用Cursor AI生成Flutter代码时,因.cursorrules配置文件不当而导致的五大常见问题。重点探讨了如何通过制定清晰、具体的规则,避免状态管理混乱、设计图输入低效、项目架构脱节、性能隐患及规则维护缺失等陷阱,从而将AI转化为高效、可靠的开发伙伴,提升代码质量和团队协作效率。

wdx0123456的博客 415

pod生命周期详解

​ 在进行下面例子使用之前,需要现在三台机器上面安装下面的镜像: 1 initC ​ initC有以下几个特点:​ 1, initC总是运行到成功完成为止;​ 2, 每个initC容器都必须在下一个initC启动之前成功完成;​ 3,如果initC容器运行失败,K8S集群会不断的重启该pod,直到initC容器成功为止;​ 4,如果pod对应的restartPolicy为never,它就不会重新启动。​ 编写d

qq_36305027的博客 3708

斗鱼直播间弹幕爬虫实战:WebSocket连接与实时数据采集

在数据驱动的时代,直播平台的弹幕数据蕴含着巨大的价值——用户行为分析、舆情监控、弹幕情感分析、直播热度评估等应用场景层出不穷。斗鱼作为国内领先的直播平台,其弹幕系统基于WebSocket协议实现实时双向通信。本文将带您从零开始,使用Python构建一个完整的斗鱼直播间弹幕爬虫系统。

2201_76125261的博客 138

Pod管理及优化

Kubernetes Pod 管理摘要 Kubernetes 中最小的部署单位是 Pod,可封装一个或多个容器,提供共享网络和存储。Pod 管理方式分为两种: 自主式 Pod 优点:配置灵活,适合临时任务和测试环境 缺点:缺乏自动扩缩容能力,维护成本高 控制器管理 Pod(如 Deployment) 支持自动扩缩容、故障恢复和滚动更新 示例命令:创建 Deployment(kubectl create deployment)、扩缩容(scale) 通过 Service 暴露服务

2402_88282438的博客 211

【三维激光扫描】第二章:国内外三维激光扫描设备简介

地面三维激光扫描仪是地面激光扫描系统中最主要的硬件设备,近年来得到了快速发展,主要体现在品牌数量、性能指标、类型等方面的变化。本章主要介绍国内外主要设备的基本情况,对国内外研究现状进行分析,最后指出目前存在的问题与未来的发展趋势。 2.1 国外地面三维激光扫描仪简介 目前,生产地面三维激光扫描仪的公司比较多,随着地面三维激光扫描技术应用普及程度的不断提高,国外产品在中国的市场目前还占主导地位。它们各自的产品在性能指标上有所不同,以下简要介绍有代表性的公司产品。 2.1.1 奥地利 Riegl公司的.

智慧空间实验室 4644

Python全栈入门到实战【基础篇 05】核心基础:Python的2种运行模式(交互式+命令行式)

Python代码运行模式详解:交互式与命令行式对比 摘要: Python提供两种核心运行模式:交互式(REPL)和命令行式(脚本式)。交互式模式适合快速测试语法,即时反馈结果,通过终端输入python启动,特点是无需保存、临时执行,适合验证小段代码逻辑。命令行式模式需将代码保存为.py文件后运行,适合开发完整程序,可重复执行和修改。两种模式各有优势:交互式便于学习调试,命令行式适合实际开发。掌握两种模式的使用场景和切换方法,是Python入门的关键技能,能显著提升学习效率。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 4563

《云原生-Kubernetes篇》深入剖析Kubernetes中pod的原理

pod可以为其中的容器配置探针(probe),用以监控容器的健康检查,而不是以容器镜像是否运行来作为健康检查的依据,因为会存在很多情况,容器是正常运行的,但是无法对外提供服务了,因此探针的健康检查方式更加准确。pod中的所有容器共享network、volume、IP地址,在pod启动的时候,需要先启动一个Infra中间容器,而其它容器都是通过join的方式加入到Infra容器的资源中的。sidecar,是一种容器设计模式,指的是我们可以在一个pod中,启动一个辅助容器来完成一些独立于主容器之外的工作。...

weixin_42469135的博客 5422

【异常】Claude CLI / Claude Code 命令行工具 “claude 不是内部或外部命令“ 报错完整解决方案

摘要:Windows系统执行Claude命令报错"'claude'不是内部或外部命令",主要原因是环境变量配置问题。解决方案包括:1)通过npm全局安装时需加-g参数并重启终端;2)检查Node.js环境及npm全局路径是否加入系统PATH;3)对于Claude Code独立安装版,需手动添加.local/bin路径到环境变量。常见错误包括安装不完整、权限不足或路径未自动配置,按照对应场景排查即可解决。

奶爸的编程之路,也就一周冷个三天 7823

从 Pod 核心原理到 Rancher 实战:K8s 容器管理全解析

Kubernetes(K8s)作为容器编排领域的事实标准,Pod 是其最小部署单元,理解 Pod 的核心原理是掌握 K8s 的基础;而 Rancher 作为企业级多集群 K8s 管理平台,能大幅降低 K8s 运维复杂度。本文将从 Pod 的核心原理入手,结合实操案例拆解关键配置,再通过 Rancher 实战讲解 K8s 集群的可视化管理,帮助读者打通 “原理 - 实操 - 管理” 的全链路。

dfl2504的博客 800

Windows环境下Ollama的本地部署方案

本文主要介绍了Windows环境下Ollama的本地部署方案,希望对使用大语言模型的同学们有所帮助。 文章目录 1. 前言 2. Windows环境安装 3. API调用示例代码

herosunly的博客 11万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【kubernetes】关于云原生之k8s集群的pod理论详解

Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是。

YCyjs的博客 1334

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Kubernetes】k8s集群Pod概述

例如:用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等。

qq_54188720的博客 1985

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[Kubernetes] Kubernetes集群概念:Pod

本文介绍了Kubernetes中工作负载(Workload)和Pod的核心概念及详细使用方法。主要内容包括: 工作负载基础 Pod是Kubernetes最小计算单元,可运行单个或多个容器 Pod分为静态Pod和控制器管理的Pod 通过标签选择器关联Pod与控制器 Pod详解 Pod定义与YAML格式 创建/删除Pod的方法 多容器Pod的实现 资源限制配置 调度约束(nodeName/nodeSelector) Pod生命周期 健康检查机制(Liveness/Readiness Probe) 容器启动/终止

qq_53232485的博客 1014

Kubernetes Init 容器、临时容器与 HPA

无需在 Pod 初始配置中声明,可通过 kubectl debug 或 API 动态注入。

2403_86763298的博客 1317

58 k8s之pod

Pod是Kubernetes中最小部署单元,它代表集群中的一个运行进程。本笔记系统梳理了Pod的核心概念、实现机制及高级配置,涵盖基础特性、共享资源、容器分类、配置策略、资源限制和健康检查等内容,帮助读者掌握Pod的设计原理与实战应用。Pod核心概念与组成机制Pod资源管理与配置策略健康检查与生命周期管理Pod是Kubernetes的核心调度单元,承载容器运行环境。关键要点:Pause容器提供命名空间基础;Init容器确保初始化顺序;资源请求/限制保障调度与运行;

qq_37720414的博客 1024

kubernetes中Pod是如何管理容器的?

之前一直搞不清楚容器和Pod是什么关系?pod是如何管理容器的?本文将为你解释其中的原理~

shanshan3003的专栏 1244

Kubernetes【02】k8s-pod从创建到终止的完整生命周期

Phase (相位)含义典型场景PendingPod已创建,但容器未全部运行调度中、拉取镜像、等待资源RunningPod已调度,至少一个容器在运行应用正常提供服务Succeeded所有容器成功退出,且不再重启Job任务成功完成Failed至少一个容器异常退出应用崩溃、配置错误、OOMKillUnknown无法获取Pod状态节点失联、kubelet故障。

Aerkui的博客 907

K8s Pod 零基础系统学习:命令、YAML、Init 容器、静态 Pod 完整手册

本文围绕 K8s 最小调度单元 Pod 展开零基础实战讲解,以豌豆荚类比 Pod 封装多容器的核心架构。文中完整梳理 Pod 增删改查、文件传输等运维命令与标准 YAML 编写规范,详解多容器协同模式、Pod 生命周期、重启策略等核心属性。同时介绍 Init 初始化容器、静态 Pod 运行机制,剖析 pause 容器底层作用。文末结合思考题区分容器与 Pod,解释 K8s 管控 Pod 的设计逻辑,配套大量可直接复用的实操代码,适合云原生新手系统入门。

2602_95508776的博客 550

k8s的pod容器的生命周期

生命周期概要图 1、Init容器 介绍:Pod能够具有一个或多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的Init容器。 Init容器与普通的容器非常像,除了如下两点:1)Init容器总是运行到成功完成为止 2)每个Init容器都必须在下一个Init容器启动之前成功完成 如果Pod的Init容器失败,Kubernetes会不断地重启该Pod,直到Init容器成功...

zhaikaiyun的博客 3484
上一篇: K8s: 关于Kubernetes中的Pod的生命周期(状态)以及生命周期的钩子函数处理
下一篇: K8s: 在Pod里面配置容器启动的命令参数及容器间依赖的环境变量
Wang's Blog
博客等级 码龄12年 7433粉丝 2420原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值