k8s学习之路 | Day16 k8s 中的容器初探

news/2024/3/29 16:31:19/文章来源:https://blog.csdn.net/whale0306/article/details/129245740

文章目录

  • 容器镜像
    • 镜像名称
    • 镜像拉取策略
    • 私有仓库的拉取策略
  • 容器的环境变量和启动命令
    • 容器的环境变量
    • 容器的启动命令
  • 容器的生命周期钩子
    • postStart
    • preStop
  • 容器的探针
    • startupProbe
    • livenessProbe
    • readinessProbe

k8s 集群中最小的管理单元就是一个Pod,而Pod里面才是容器,但是容器里面到底应该怎么写yaml呢?这个就是我今天学习的目标

  • 一个最简单的Pod资源清单类似于以下这种:
##pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:containers:- name: pod-demoimage: nginx

image-20230223150750157

  • 我们通过kubectl explain pod.spec.containers解释了容器到底里面能写什么忒多了
[root@k8s-01 k8s-yaml]# kubectl explain pod.spec.containers
KIND:     Pod
VERSION:  v1RESOURCE: containers <[]Object>DESCRIPTION:List of containers belonging to the pod. Containers cannot currently beadded or removed. There must be at least one container in a Pod. Cannot beupdated.A single application container that you want to run within a pod.FIELDS:args <[]string>Arguments to the entrypoint. The docker image's CMD is used if this is notprovided. Variable references $(VAR_NAME) are expanded using thecontainer's environment. If a variable cannot be resolved, the reference inthe input string will be unchanged. The $(VAR_NAME) syntax can be escapedwith a double $$, ie: $$(VAR_NAME). Escaped references will never beexpanded, regardless of whether the variable exists or not. Cannot beupdated. More info:https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
...

容器镜像

镜像名称

kubectl explain pod.spec.containers中的【image 】解释了有关镜像名称的含义和写法

image-20230223152202307

  • Docker image 的镜像名称
  • string 数据类型
##所以在写yaml文件的时候,就应该以这种形式来确认你这个容器启动用的镜像
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:containers:- name: pod-demoimage: nginx#image: nginx:1.21-alpine#image: tomcat:latest

镜像拉取策略

kubectl explain pod.spec.containers中的【imagePullPolicy】解释的就是镜像拉取策略

kubectl explain pod.spec.containers.imagePullPolicy拉取策略

image-20230223164237141

  • Always:每当 kubelet 启动一个容器时,kubelet 会查询容器的镜像仓库, 将名称解析为一个镜像摘要。 如果 kubelet 有一个容器镜像,并且对应的摘要已在本地缓存,kubelet 就会使用其缓存的镜像; 否则,kubelet 就会使用解析后的摘要拉取镜像,并使用该镜像来启动容器。这也是默认拉取策略
  • Never:Kubelet 不会尝试获取镜像。如果镜像已经以某种方式存在本地, kubelet 会尝试启动容器;否则,会启动失败。
  • IfNotPresent:只有当镜像在本地不存在时才会拉取。
##所以在写yaml文件的时候,就应该以这种形式来确认要启动容器的镜像的来源
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:containers:- name: pod-demoimage: nginximagePullPolicy: Always ## 默认拉取策略:总是去下载

举个栗子

我有下面这个pod文件,我尝试启动一下试试:

#####pod-test1.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:containers:- name: pod-demoimage: wordpressimagePullPolicy: Never

image-20230225220247465

私有仓库的拉取策略

如果我们需要从自己的阿里云私人镜像仓库拉取镜像,又应该如何操作呢?看一下官方帮助文档kubectl explain pod.spec中的【imagePullSecrets <[]Object>】

image-20230225220917430

官方地址:

https://kubernetes.io/zh-cn/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod

官方是这样说的:

  1. 要创建一个Secret

  2. 然后在 Pod 中引用 ImagePullSecrets

举个栗子

我要拉取我自己阿里云镜像仓库的镜像:

  • 我需要先创建一个Secret,这个怎么创建呢?官方是这样说的
kubectl create secret docker-registry <name> \--docker-server=DOCKER_REGISTRY_SERVER \--docker-username=DOCKER_USER \--docker-password=DOCKER_PASSWORD \--docker-email=DOCKER_EMAIL

我就创建一个试试:

kubectl create secret docker-registry test \--docker-server=registry.cn-hangzhou.aliyuncs.com \--docker-username=tb330504_33 \--docker-password=xxxxxxxx \--docker-email=565616251@qq.com

image-20230225222046858

我在准备一个Pod文件

apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:imagePullSecrets:- name: testcontainers:- name: pod-demoimage: registry.cn-hangzhou.aliyuncs.com/publiclibrary/tomcat:8.5-jdk11-temurin-focalimagePullPolicy: IfNotPresent

运行一下,看是否能拉取后正常运行:

  • 正在拉取镜像

image-20230225222729867

  • 拉取成功,运行成功

image-20230225222907947

容器的环境变量和启动命令

容器的环境变量

  • kubectl explain pod.spec.containers.env

image-20230226182054008

  • 按照官方描述,有关容器的环境变量就应该这样写了
####以mysql镜像为例
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:containers:- name: pod-mysql-demoimage: mysqlimagePullPolicy: Alwaysenv:- name: MYSQL_DATABASEvalue: my-test- name: MYSQL_ROOT_PASSWORDvalue: admin@123
  • 尝试并验证一下:OK

image-20230226183241856

容器的启动命令

  • kubectl explain pod.spec.containers.command

https://kubernetes.io/zh-cn/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell

image-20230227133904452

image-20230227135528022

  • 尝试一下(覆盖容器默认的启动命令)
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels:app: MYAPP
spec:containers:- name: pod-demoimage: nginxcommand:- /bin/sh- -c- "echo hello world;sleep 3600;"

image-20230227134820426

  • 可以看到,如果设置了command字段信息,就会覆盖默认的容器启动命令,对于这个,官方有明确的说明:

    1. 如果在配置文件中设置了容器启动时要执行的命令及其参数,那么容器镜像中自带的命令与参数将会被覆盖而不再执行。
    2. 如果配置文件中只是设置了参数,却没有设置其对应的命令,那么容器镜像中自带的命令会使用该新参数作为其执行时的参数。

    image-20230227135440569

  • 从最新的文档发现,有些内容有所出入

容器的生命周期钩子

https://kubernetes.io/zh-cn/docs/concepts/containers/container-lifecycle-hooks/#container-hooks

kubectl explain pod.spec.containers.lifecycle

image-20230227142655173

kubectl explain pod.spec.containers.lifecycle.postStart

image-20230227143050232

kubectl explain pod.spec.containers.lifecycle.preStop

image-20230227143147357

k8s 中提供了二个关于容器的生命周期钩子

  • postStart

在容器创建后将立刻执行。但是,并不能保证该钩子函数在容器的 ENTRYPOINT 之前

执行。该钩子函数没有输入参数。

  • preStop

在容器被 terminate(终止)之前执行

postStart

k8s 在容器启动后立刻发送postStart事件,但是并不能确保postStart事件处理程序在容器的EntryPoint之前执行,意思就是容器启动了就会触发,不管容器执行是否成功?在 k8s 管理容器的时候,将一直等待 postStart事件处理程序结束后,才会将容器的状态标记为Running

  • exec:容器创建以后,钩子函数执行一个命令
  • httpGet:容器创建以后,钩子函数发送一个http的get请求
  • tcpSocket:容器创建以后,钩子函数连上一个TCP端口

我们以httpGet为例

我们先启动一个 nginx pod

##pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:containers:- name: pod-demoimage: nginx

image-20230227152057674

我们在准备一个示例yaml

##lifecycle-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: lifecycle-demolabels: app: MYAPP
spec:containers:- name: lifecycle-demoimage: nginxlifecycle:postStart:httpGet:host: 192.168.0.190path: /lifecycle-testport: 80scheme: HTTP  ####注意这个地方是大写

启动一下

image-20230227153045576

查看一下钩子的设置是否生效

  • 是有相关请求,证明是生效的

image-20230227153136409

preStop

钩子函数在容器被terminate之前执行,执行是同步的,执行完才删除容器,写法也是和postStart一样

##lifecycle-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: lifecycle-demolabels: app: MYAPP
spec:containers:- name: lifecycle-demoimage: nginxlifecycle:preStop:httpGet:host: 192.168.0.190path: /lifecycle-testport: 80scheme: HTTP  ####注意这个地方是大写

我们先启动一个这样的 pod

image-20230227153727455

我将这个pod杀死

kubectl delete -f lifecycle-demo.yaml

看下是否生效

image-20230227153826868

容器的探针

健康检查机制

probe 是由 kubelet 对容器执行的定期诊断。 要执行诊断,kubelet 既可以在容器内执行代码,也可以发出一个网络请求。

  • startupProbe:启动探针

    指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器, 而容器依其重启策略进行重启。 如果容器没有提供启动探测,则默认状态为 Success。

  • livenessProbe:存活探针

    指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其重启策略决定未来。如果容器不提供存活探针, 则默认状态为 Success。

  • readinessProbe:就绪探针

    指示容器是否准备好为请求提供服务。如果就绪态探测失败, 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。 初始延迟之前的就绪态的状态值默认为 Failure。 如果容器不提供就绪态探针,则默认状态为 Success。

  • 写法是一致的 kubectl explain pod.spec.containers.startupProbe

    • initialDelaySeconds:容器启动后要等待多少秒后才启动启动、存活和就绪探针, 默认是 0 秒,最小值是 0。

    • periodSeconds:执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。

    • timeoutSeconds:探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。

    • successThreshold:探针在失败后,被视为成功的最小连续成功数。默认值是 1。 存活和启动探测的这个值必须是 1。最小值是 1。

    • failureThreshold:探针连续失败了 failureThreshold 次之后, Kubernetes 认为总体上检查已失败:容器状态未就绪、不健康、不活跃。 对于启动探针或存活探针而言,如果至少有 failureThreshold 个探针已失败, Kubernetes 会将容器视为不健康并为这个特定的容器触发重启操作。 kubelet 会考虑该容器的 terminationGracePeriodSeconds 设置。 对于失败的就绪探针,kubelet 继续运行检查失败的容器,并继续运行更多探针; 因为检查失败,kubelet 将 Pod 的 Ready 状况设置为 false

    • terminationGracePeriodSeconds:为 kubelet 配置从为失败的容器触发终止操作到强制容器运行时停止该容器之前等待的宽限时长。 默认值是继承 Pod 级别的 terminationGracePeriodSeconds 值(如果不设置则为 30 秒),最小值为 1。

  • 检查机制

    • exec
      在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功

    • httpGet

      对容器的 IP 地址上指定端口和路径执行 HTTP GET 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的

    • tcpSocket

      对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。 如果远程系统(容器)在打开连接后立即将其关闭,这算作是健康的

  • 探测结果

    • Success(成功)
      容器通过了诊断。
    • Failure(失败)
      容器未通过诊断。
    • Unknown(未知)
      诊断失败,因此不会采取任何行动。

startupProbe

我先启动了一个 pod-demo 的容器:

image-20230227165026071

我现在准备一个另一个 pod:

apiVersion: v1
kind: Pod
metadata:name: probe-demolabels: app: MYAPP
spec:containers:- name: probe-demoimage: nginxstartupProbe:httpGet:host: 192.168.0.190path: /index2.htmlport: 80scheme: HTTP  ####注意这个地方是大写initialDelaySeconds: 60failureThreshold: 3periodSeconds: 10

我们启动验证一下:

  • 最开始肯定是失败的,因为探针设置的路径不存在的,所以pod的状态也是未就绪的

image-20230227165632242

  • 我们对pod-demo中的文件进行一个操作,让测试pod可以探针成功

image-20230227165724162

image-20230227165829042

livenessProbe

我们还是以上面的为例,准备一个测试 yaml

###每个1秒就去检查特定服务器的服务是否正常访问,
apiVersion: v1
kind: Pod
metadata:name: probe-demolabels: app: MYAPP
spec:containers:- name: probe-demoimage: nginxlivenessProbe:httpGet:host: 192.168.0.190path: /index.htmlport: 80scheme: HTTP  ####注意这个地方是大写initialDelaySeconds: 60failureThreshold: 3periodSeconds: 1
  • 查看一下各状态

image-20230227170427680

  • 我们删除探针里面需要用到的pod,再看下状态

image-20230227170534804

  • 看下探针的事件:检查失败就会一直重启

image-20230227170658527

image-20230227170839132

但是我不知道为啥pod还是处于READY的状态

readinessProbe

就绪探针,理论是和上面一样的

有时候,应用会暂时性地无法为请求提供服务。 例如,应用在启动时可能需要加载大量的数据或配置文件,或是启动后要依赖等待外部服务。 在这种情况下,既不想杀死应用,也不想给它发送请求。 Kubernetes 提供了就绪探针来发现并缓解这些情况。 容器所在 Pod 上报还未就绪的信息,并且不接受通过 Kubernetes Service 的流量。

后续实际应用中,我再来探一下更多的用法场景

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

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

相关文章

利用GPT-3 Fine-tunes训练专属语言模型

利用GPT-3 Fine-tunes训练专属语言模型 文章目录什么是模型微调&#xff08;fine-tuning&#xff09;&#xff1f;为什么需要模型微调&#xff1f;微调 vs 重新训练微调 vs 提示设计训练专属模型数据准备清洗数据构建模型微调模型评估模型部署模型总结什么是模型微调&#xff0…

JavaScript split()方法

JavaScript split()方法 目录JavaScript split()方法一、定义和用法二、语法三、参数值四、返回值五、更多实例5.1 省略分割参数5.2 使用limit参数5.3 使用一个字符作为分割符一、定义和用法 split() 方法用于把一个字符串分割成字符串数组。 二、语法 string.split(separat…

NCRE计算机等级考试Python真题(四)

第四套试题1、以下选项中&#xff0c;不属于需求分析阶段的任务是&#xff1a;A.需求规格说明书评审B.确定软件系统的性能需求C.确定软件系统的功能需求D.制定软件集成测试计划正确答案&#xff1a; D2、关于数据流图&#xff08;DFD&#xff09;的描述&#xff0c;以下选项中正…

RTMP的工作原理及优缺点

一.什么是RTMP&#xff1f;RTMP&#xff08;Real-Time Messaging Protocol&#xff0c;实时消息传输协议&#xff09;是一种用于低延迟、实时音视频和数据传输的双向互联网通信协议&#xff0c;由Macromedia&#xff08;后被Adobe收购&#xff09;开发。RTMP的工作原理是&#…

IP-GUARD控制台账户输入多次错误密码锁定后该如何解锁?

其他管理员账户给锁定了,暂时只能等其锁定时间到了才可以再次输入,默认是设置是锁定30min; 1、如果急需此账户查看,可以使用admin系统管理员账户登录控制台,在工具-账户中清除这个账户的密码,重新登录设置密码。

NIO与零拷贝

目录 一、零拷贝的基本介绍 二、传统IO数据读写的劣势 三、mmap优化 四、sendFile优化 五、 mmap 和 sendFile 的区别 六、零拷贝实战 6.1 传统IO 6.2 NIO中的零拷贝 6.3 运行结果 一、零拷贝的基本介绍 零拷贝是网络编程的关键&#xff0c;很多性能优化都离不开。 在…

【云原生kubernetes】k8s 常用调度策略使用详解

一、前言 通过之前的学习&#xff0c;我们了解到k8s集群中最小工作单位是pod&#xff0c;对于k8s集群来说&#xff0c;一个pod的完整生命周期是由一系列调度策略来控制&#xff0c;这些调度策略具体是怎么工作的呢&#xff1f;本文将详细讨论下这个问题。 二、k8s调度策略简介…

【多目标优化算法】多目标蚱蜢优化算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

APP测试的7大注意点。

1. 运行 1&#xff09; App安装完成后的试运行&#xff0c;可正常打开软件。 2&#xff09; App打开测试&#xff0c;是否有加载状态进度提示。 3&#xff09; App⻚面间的切换是否流畅&#xff0c;逻辑是否正确。 4&#xff09; 注册 同表单编辑⻚面 用户名密码⻓度 …

快手电商新增商品信息诊断规则,对商家有何影响?

1、2022年快手短剧日活跃用户达2.6亿 新榜讯 近日&#xff0c;快手数据显示&#xff0c;2022年快手短剧日活跃用户达2.6亿&#xff0c;现在的付费用户数对比2022年4月增长超过480%&#xff0c;快手已经是最大的短剧消费市场。此外&#xff0c;2023年快手小游戏日活跃用户峰值超…

一文掌握项目管理工具 —— 时标网络图

一、认识时标网络图二、时标网络图的绘制方法三、自由时差、关键路径、总时差四、时标网络图可解决哪些问题进度调整的问题计算检测点时的 PV 数据资源平滑问题在系统集成项目管理工程师下午的案例分析考试中,有一道计算题分值达 20 分。整套试卷的总分为 75分,考试能否通过合…

ubuntu下用i686-w64-mingw32交叉编译支持SDL、Openssl的ffmpeg库

前言 本篇博客是基于前两篇关于ffmpeg交叉编译下&#xff0c;进行再次编译操作。ubuntu下ffmpeg的交叉编译环境搭建可以参看以下我的这篇博客&#xff1a;https://blog.csdn.net/linyibin_123/article/details/108759367 &#xff1b; ubuntu下交叉编译openssl及交叉编译支持o…

20分钟6个示例4个动图教你学会Async Hooks

序幕 async_hooks模块提供了一个全新的功能世界,但作为 Node.js 爱好者,我最感兴趣的是,它可以让您轻松了解我们在应用程序中经常执行的一些任务的幕后情况。 在本文中,我将尝试借助async_hooks模块来演示和解释一个典型的异步资源的生命周期。 Async Hooks API 简介 as…

OSWatcher.sh脚本说明

OSWatcher.sh脚本位于oswbb目录下&#xff08;Oracle 19c数据库中脚本的路径是&#xff1a; /u01/app/oracle/product/19.0.0/dbhome_1/suptools/tfa/release/tfa_home/ext/oswbb/&#xff09;&#xff0c;由脚本startOSWbb.sh和stopOSWbb.sh来调用启动和停止它。 1. startOSW…

《数据库系统概论》学习笔记——第七章 数据库设计

教材为数据库系统概论第五版&#xff08;王珊&#xff09; 这一章概念比较多。最重点就是7.4节。 7.1 数据库设计概述 数据库设计定义&#xff1a; 数据库设计是指对于一个给定的应用环境&#xff0c;构造&#xff08;设计&#xff09;优化的数据库逻辑模式和物理结构&#x…

C#窗口介绍

窗口就是打开程序我们所面对的一个面板&#xff0c;里面可以添加各种控件&#xff0c;如下图所示&#xff0c;我们可以在属性栏设置其标题名称、图标、大小等。图1 窗口图 图2 设置面板 图3 设置双击标题框&#xff0c;会生成Load函数&#xff0c;也可以到事件里面去找Load函数…

线上监控诊断神器arthas

目录 什么是arthas 常用命令列表 1、dashboard仪表盘 2、heapdump dumpJAVA堆栈快照 3、jvm 4、thread 5、memory 官方文档 安装使用 1、云安装arthas 2、获取需要监控进程ID 3、运行arthas 4、进入仪表盘 5、其他命令使用查看官方文档 什么是arthas arthas是阿…

《嵌入式应用开发》实验一、开发环境搭建与布局(上)

1. 搭建开发环境 去官网&#xff08;https://developer.android.google.cn/studio&#xff09;下载 Android Studio。 安装SDK&#xff08;默认Android 7.0即可&#xff09; 全局 gradle 镜像配置 在用户主目录下的 .gradle 文件夹下面新建文件 init.gradle&#xff0c;内容为…

web服务器(1)

阻塞和非阻塞、同步和异步 网络IO阶段一&#xff1a;数据就绪 操作系统&#xff0c;tcp接受缓冲区 阻塞&#xff1a;调用IO方法的线程进入阻塞状态 非阻塞&#xff1a;不会改变线程的状态&#xff0c;通过返回值判断 网络IO阶段二&#xff1a;数据读写 应用程序 同步…

新闻稿的制作流程:从确定新闻稿目的到将其分发给媒体

对于任何希望向媒体和公众传达具有新闻价值的信息的组织来说&#xff0c;新闻稿都是必不可少的工具。精心制作的新闻稿可以帮助您宣传您的业务、产品或服务&#xff0c;并可以产生有价值的媒体报道。在本文中&#xff0c;我们将指导您完成新闻稿的制作过程&#xff0c;从确定新…