K8s: 在Pod里面创建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-demolabels:name: init-pod
    spec:containers:- name: busybox-containerimage: busybox:latestcommand: ['sh', '-c', 'date && sleep 3600']resources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 80initContainers:- name: init-containerimage: busybox:latestcommand: ['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-httplabels:test: liveness
    spec:containers:- name: livenessimage: mirrorgooglecontainers/livenessargs:- /serverlivenessProbe:httpGet:path: /healthzport: 8080httpHeaders:- name: Custom-Headervalue: AwesomeinitialDelaySeconds: 3periodSeconds: 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://0bde3a8c2ab79d2fd389659354771da10edbdfd29e3bb3d5c87fcbcb44f918b1Image:         mirrorgooglecontainers/livenessImage ID:      docker-pullable://mirrorgooglecontainers/liveness@sha256:854458862be990608ad916980f9d3c552ac978ff70ceb0f90508858ec8fc4a62Port:          <none>Host Port:     <none>Args:/serverState:          WaitingReason:       CrashLoopBackOffLast State:     TerminatedReason:       ErrorExit Code:    2Started:      Thu, 18 Apr 2024 16:47:19 +0800Finished:     Thu, 18 Apr 2024 16:47:36 +0800Ready:          FalseRestart Count:  4Liveness:       http-get http://:8080/healthz delay=3s timeout=1s period=3s #success=1 #failure=3Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-nv6lw (ro)
    Conditions:Type              StatusInitialized       TrueReady             FalseContainersReady   FalsePodScheduled      True
    Volumes:kube-api-access-nv6lw:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
    QoS Class:                   BestEffort
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.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.k8sNormal   Pulled     111s                kubelet            Successfully pulled image "mirrorgooglecontainers/liveness" in 2.298827654sNormal   Pulled     92s                 kubelet            Successfully pulled image "mirrorgooglecontainers/liveness" in 1.281083837sNormal   Created    74s (x3 over 111s)  kubelet            Created container livenessNormal   Started    74s (x3 over 111s)  kubelet            Started container livenessNormal   Pulled     74s                 kubelet            Successfully pulled image "mirrorgooglecontainers/liveness" in 1.048779521sWarning  Unhealthy  58s (x9 over 100s)  kubelet            Liveness probe failed: HTTP probe failed with statuscode: 500Normal   Killing    58s (x3 over 94s)   kubelet            Container liveness failed liveness probe, will be restartedNormal   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的运行健康状态

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

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

相关文章

LeetCode42-接雨水

题目&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 思路:对于每个柱子&#xff08;不包括最左边和最右边的&#xff0c;因为这两根柱子无论如何也装不下水&#xff09;&#xff0c;找出其…

Shell学习 - 2.28 Shell declare -i:将变量声明为整数类型

在《Shell declare命令》一节中&#xff0c;我们已经讲解了 declare 命令的各种选项&#xff0c;为了让 Shell 进行整数运算&#xff0c;本节我们重点讲解-i选项。 默认情况下&#xff0c;Shell 中每一个变量的值都是字符串&#xff08;参见之前的《Shell变量》&#xff09;&am…

从 Android 恢复已删除文件的 3 种简单方法

如何从 Android 恢复已删除的文件&#xff1f;毫不犹豫&#xff0c;有些人可能会认为从 Google 备份恢复 Android 文件太容易了。但是&#xff0c;如果删除的文件未同步到您的帐户或未备份怎么办&#xff1f;您错误的恢复可能会永久删除您想要的数据。因此&#xff0c;我们发布…

常见的软件架构模式

在软件开发过程中&#xff0c;软件架构模式是实现高质量、可扩展系统的关键。本文将介绍一些常见的软件架构模式&#xff0c;分析其优缺点和适用场景&#xff0c;从而帮助大家在实际项目中做出更明智的架构选择&#xff08;注意以下的架构模式相互之间并不一定互斥&#xff0c;…

23种设计模式之抽象工厂

简单工厂和工厂方法 关注 产品等级 抽象工厂 关注 产品族 对于比较稳定的产品&#xff0c;抽象工厂更有效率&#xff08;一个工厂生产很多产品族&#xff09; 抽象工厂代码例子加深理解

vue中使用自定义组件规则

使用自定义组件规则 1.定义组件中不要绑定el 2.data必须使用函数写法 3.注册时可以取别名&#xff0c;别名不可以驼峰命名&#xff0c;需要使用-连接&#xff0c;不能使用已有的标签作为名称 4.模板时只能有一个父级&#xff0c;只在vue2中 5.未搭建脚手架使用单标签会使后面代…

我与C++的爱恋:类和对象(三)

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 先来回顾一下&#xff0c;上一节的内容并且通过上次的内容来做一道oj题。 https://leetcode.cn/problems/implement-queue-using-stacks/ class MyQueue { private:stack&l…

【LeetCode:216. 组合总和 III + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

JavaSE-15笔记【注解(+2024新)】

文章目录 1.注解概述2.几个常用的JDK内置的注解2.1 Deprecated2.2 Override2.3 SuppressWarnings2.4 FunctionalInterface 3.自定义注解3.1 注解也可以定义属性3.2 注解的使用规则补充 4.元注解4.1 Retention4.2 Target4.3 Documented4.4 Inherited4.5 Repeatable 5.通过反射获…

Python的pytest框架(3)--fixtrue固件

fixture是pytest的一项核心特性&#xff0c;它提供了一种组织和管理测试依赖项&#xff08;如初始化环境、创建资源、清理操作等&#xff09;的有效机制。下面将对fixture进行深入讲解&#xff0c;包括其基本概念、作用、使用方式、特性以及高级应用&#xff1a; 目录 一、基…

微信小程序开发

微信小程序隶属于前端&#xff0c;因此我们只需要了解掌握一些基本的功能与业务逻辑即可。 HttpClient HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议…

Java初学日记 十三 (GUI)

GUI编程 概述 GUI(Graphical Uers Interface)全称图形用户界面 swing指javax.swing包&#xff0c;该包中包含实现界面的类&#xff0c;这些类都可称为组件 组件可分为两大类&#xff1a; 容器组件 窗口 import javax.swing.*; ​ public class LoginFrame extends JFram…

深入理解与运用Vue 2中的插槽(Slots)

深入理解与运用Vue 2中的插槽&#xff08;Slots&#xff09; Vue.js作为一种强大的前端框架&#xff0c;以其组件化、声明式编程理念深受开发者喜爱。其中&#xff0c;Vue 2的插槽&#xff08;Slots&#xff09;机制更是极大地提升了组件复用性和灵活性。本文将深入探讨Vue 2中…

FreeSWITCH 1.10.10 简单图形化界面15 - JsSIP媒体控制(LookLook)

FreeSWITCH 1.10.10 简单图形化界面15 - JsSIP媒体控制 0、 界面预览1、本地媒体流获取session本地音频本地视频 2、远端媒体流获取媒体流远端音频远端视频 FreeSWITCH界面安装参考&#xff1a;https://blog.csdn.net/jia198810/article/details/137820796 0、 界面预览 http…

Robbins-Monro(RM)算法【随机近似】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实践—GridWorld 第…

WP-AutoPostPro 汉化版: WordPress自动采集发布插件

WP-AutoPostPro 是目前最好用的WordPress自动采集发布插件&#xff0c;最大的特点是可以采集来自于任何网站的内容并自动发布到你的WordPress站点。真正做到可以采集任何网站的内容并自动发布&#xff0c;采集过程完全自动进行无需人工干预&#xff0c;并提供内容过滤、HTML标签…

libssh C++封装(一)

1 概述 libssh是一个在客户端和服务器端实现SSHv2协议的多平台C库。使用libssh&#xff0c;您可以远程执行程序、传输文件、使用安全透明的隧道、管理公钥等等。本文描述的对libssh客户端功能的C封装。 libssh下载地址 2 设计 2.1 类图 类型说明&#xff1a; Session SSH连接…

【设计模式】9、facade 外观模式

文章目录 九、外观模式9.1 player9.1.1 player_test.go9.1.2 player.go 9.2 login_register9.2.1 account_test.go9.2.2 account.go 九、外观模式 https://refactoringguru.cn/design-patterns/facade 如果有一个复杂的系统, 内部有很多子系统, 可以用 facade 封装一层, 只暴…

WPF-关于动画Animation(及其常见问题)

目录 一、动画合集 常见动画类型 1、资源里添加动画资源 2、事件触发器里开始一个动画 3、Double型关键帧动画 4、Object型关键帧动画 5、Color型关键帧动画 6、String型关键帧动画 7、Matrix型沿路径动画 二、扩展 Ⅰ 动画常见问题 1、控制动画结束问题 Ⅱ 流动…

Centos7 的 Open Stack T 版搭建流程 --- (三)配置消息队列

配置消息队列 文章目录 配置消息队列&#xff08;1&#xff09;安装 RabbitMQ 服务并配置新用户权限controller &#xff08;2&#xff09;如何开启图形化&#xff08;拓展&#xff09; &#xff08;1&#xff09;安装 RabbitMQ 服务并配置新用户权限 controller yum install…