k8s--pod管理-资源清单-生命周期

news/2024/5/14 18:02:01/文章来源:https://blog.csdn.net/Gong_yz/article/details/129414323

文章目录

  • 一、资源清单
    • 1. 格式和内容的书写方法
    • 2. 示例及执行操作
  • 二、pod生命周期:Init容器&探针
    • 1.简介
    • 2.Init 容器
    • 3.探针
      • 3.1存活探针
      • 3.2就绪探针


一、资源清单

- 格式如下:apiVersion: group/version  //指明api资源属于哪个群组和版本,同一个组可以有多个版本$ kubectl api-versions		//查询命令kind: 		//标记创建的资源类型,k8s主要支持以下资源类别Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjobmetadata:	//元数据name:	//对像名称namespace:	//对象属于哪个命名空间labels:	//指定资源标签,标签是一种键值数据spec: 		//定义目标资源的期望状态$ kubectl explain pod		//查询帮助文档

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

1. 格式和内容的书写方法

## 方法一:书写时候的查找方法,可以直接通过explain一步一步查找参数内容用法
[root@server2 ~]# kubectl explain pod      ##查看pod所有参数,-required-带有required是必须存在的参数
[root@server2 ~]# kubectl explain pod.apiVersion   ##查看api对应需要添加的参数## 方法二: 直接打开一个已经有的deployment,然后生成相应的yaml文件,进行参考
[root@server2 ~]# kubectl get pod 
NAME   READY   STATUS    RESTARTS   AGE
demo   1/1     Running   0          3h51m 
[root@server2 ~]# kubectl get pod demo -o yaml   ##生成一个yaml文件

获取帮助:spec.containers针对容器的参数
[root@server2 pod]# kubectl explain pod.spec.containers
获取yaml模板
[root@server2 pod]# kubectl run demo --image nginx --dry-run=client -o yaml > pod.yaml
注:上面容器不是真的运行

2. 示例及执行操作

##如果俩个镜像使用的是同一个端口,只有一个可以成功
[root@server2 ~]# kubectl delete deployments.apps nginx  ##删除原来pod,为了下面进行实验
[root@server2 ~]# vim pod.yml    ##编写yml文件,可用性较高
[root@server2 ~]# cat pod.yml 
apiVersion: v1
kind: Pod
metadata:labels:run: demoname: demo
spec:hostNetwork: true                    ##true让节点使用宿主机网络;占用宿主机的端口nodeSelector:                          ##节点选择(选择标签)标签可以给多个节点加,主机名不推荐kubernetes.io/hostname: k8s3          ##标签containers:- image: myapp:v1name: demoimagePullPolicy: IfNotPresent      ##本地没有再去拉取#ports:							#端口映射#- name: http#  containerPort: 80       ##容器内端口#  hostPort: 80                 ##主机端口#resources:						#资源限制      ##资源控制决定pod的QoS Class(质量控制),资源不够的情况下,保障资源敏感性高资源的正常运行;#  limits:                            ##最多资源   ##QoS Class(质量控制)只能通过resources控制#    cpu: 1                        ##1=1000m#    memory: 200Mi#  requests:                       ##最少资源#    cpu: 0.5#    memory: 100Mi#- name: demo2					#定义多个容器#  image: busyboxplus#  command: ["/bin/sh", "-c", "sleep 3600"]      ##运行3600秒[root@server2 ~]# kubectl apply -f pod.yml        ##deployment使用apply,会自动更新修改内容## $ kubectl create -f demo.yaml  ##不是deployment使用create,不会自动更新修改内容
deployment.apps/nginx created
[root@server2 ~]# kubectl get pod
NAME                   READY   STATUS    RESTARTS   AGE
demo                   1/1     Running   0          4h47m
nginx-79cc587f-fs8l5   1/1     Running   0          2
查看详情
[root@server2 pod]# kubectl get pod -o wide
[root@server2 pod]# kubectl describe  pod demo
[root@server2 pod]# kubectl get pod demo -o yaml
[root@server2 pod]# kubectl delete  -f pod.yml

资源控制的意义资源不够的情况下,保障资源敏感性高资源的正常运行;QoS Class(质量控制)只能通过resources控制;resources的值:不同、相同、注释,这3中方式

二、pod生命周期:Init容器&探针

1.简介

k8s官网:https://kubernetes.io/zh-cn/docs/home/

- Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。- Init 容器与普通的容器非常像,除了如下两点:它们总是运行到完成。Init 容器不支持 Readiness,因为它们必须在 Pod 就绪之前运行完成,每个 Init 容器必须运行成功,下一个才能够运行。- 如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。
- Init 容器能做什么?Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。
- 探针 是由 kubelet 对容器执行的定期诊断:ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的。每次探测都将获得以下三种结果之一:成功:容器通过了诊断。失败:容器未通过诊断。未知:诊断失败,因此不会采取任何行动
- Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应:livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success。startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探测(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success。- 重启策略PodSpec 中有一个 restartPolicy 字段,可能的值为 Always、OnFailure 和 Never。默认为 Always。
- Pod 的生命一般Pod 不会消失,直到人为销毁他们,这可能是一个人或控制器。建议创建适当的控制器来创建 Pod,而不是直接自己创建 Pod。因为单独的 Pod 在机器故障的情况下没有办法自动复原,而控制器却可以。三种可用的控制器:1.使用 Job 运行预期会终止的 Pod,例如批量计算。Job 仅适用于重启策略为 OnFailure 或 Never 的 Pod。2.对预期不会终止的 Pod 使用 ReplicationController、ReplicaSet 和 Deployment ,例如 Web 服务器。 ReplicationController 仅适用于具有 restartPolicy 为 Always 的 Pod。3.提供特定于机器的系统服务,使用 DaemonSet 为每台机器运行一个 Pod

2.Init 容器

[root@k8s2 pod]# vim init-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: myapp-podlabels:app.kubernetes.io/name: MyApp
spec:containers:- name: myapp-containerimage: busyboxcommand: ['sh', '-c', 'echo The app is running! && sleep 3600']initContainers:- name: init-myserviceimage: busyboxcommand: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"][root@k8s2 pod]# kubectl apply -f init-pod.yaml[root@k8s2 pod]# kubectl get pod
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:0/1   0          41s

在init容器没有成功运行之前,主容器不会被运行

添加svc定义
[root@k8s2 pod]# vim myservice.yaml
---
apiVersion: v1
kind: Service
metadata:name: myservice
spec:ports:- protocol: TCPport: 80targetPort: 9376[root@k8s2 pod]# kubectl apply -f myservice.yaml[root@k8s2 pod]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   3d1h
myservice    ClusterIP   10.103.221.131   <none>        80/TCP    2ssvc解析成功后,init容器退出,主容器运行
[root@k8s2 pod]# yum install -y bind-utils
[root@k8s2 pod]# dig -t A myservice.default.svc.cluster.local. @10.96.0.10

在这里插入图片描述

[root@k8s2 pod]# kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
myapp-pod   1/1     Running   0          3m35s回收资源
[root@k8s2 pod]# kubectl delete  -f init-pod.yml
[root@k8s2 pod]# kubectl delete  -f myservice.yml

3.探针

3.1存活探针

[root@k8s2 pod]# vim liveness-pod.yaml
apiVersion: v1
kind: Pod
metadata:labels:test: livenessname: liveness-http
spec:containers:- name: livenessimage: nginxlivenessProbe:tcpSocket:port: 8080initialDelaySeconds: 3periodSeconds: 3[root@k8s2 pod]# kubectl apply -f liveness-pod.yaml在存活探针检测失败导致容器不断被重启
[root@k8s2 pod]# kubectl get pod -w
NAME            READY   STATUS    RESTARTS   AGE
liveness-http   1/1     Running   0          5s
liveness-http   1/1     Running   1 (0s ago)   13s
liveness-http   1/1     Running   2 (0s ago)   22s[root@k8s2 pod]# kubectl describe  pod liveness-http[root@k8s2 pod]# kubectl delete  -f liveness-pod.yaml

在这里插入图片描述

3.2就绪探针

[root@k8s2 pod]# vim liveness-pod.yaml
apiVersion: v1
kind: Pod
metadata:labels:test: livenessname: liveness-http
spec:containers:- name: livenessimage: nginxlivenessProbe:tcpSocket:port: 80initialDelaySeconds: 3periodSeconds: 3readinessProbe:httpGet:path: /test.htmlport: 80initialDelaySeconds: 5periodSeconds: 5[root@k8s2 pod]# kubectl apply -f liveness-pod.yaml就绪探针失败导致容器一直未就绪
[root@k8s2 pod]# kubectl get pod
NAME            READY   STATUS    RESTARTS   AGE
liveness-http   0/1     Running   0          34s[root@k8s2 pod]# kubectl describe  pod liveness-http

在这里插入图片描述

创建测试页面
[root@k8s2 pod]# kubectl exec  liveness-http -- touch /usr/share/nginx/html/test.html就绪探针成功
[root@k8s2 pod]# kubectl get pod
NAME            READY   STATUS    RESTARTS   AGE
liveness-http   1/1     Running   0          100s创建svc
[root@k8s2 pod]# kubectl expose pod liveness-http --port 80 --target-port 80就绪容器自动上线
[root@k8s2 pod]# kubectl describe  svc liveness-http
Name:              liveness-http
Namespace:         default
Labels:            test=liveness
Annotations:       <none>
Selector:          test=liveness
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.108.21.178
IPs:               10.108.21.178
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.33:80	                               ##有值
Session Affinity:  None
Events:            <none>
删除测试页面
[root@k8s2 pod]# kubectl exec  liveness-http -- rm /usr/share/nginx/html/test.html就绪探针失败,容器未就绪
[root@k8s2 pod]# kubectl get pod
NAME            READY   STATUS    RESTARTS   AGE
liveness-http   0/1     Running   0          6m15s在svc中容器自动下线
[root@k8s2 pod]# kubectl describe  svc liveness-http
Name:              liveness-http
Namespace:         default
Labels:            test=liveness
Annotations:       <none>
Selector:          test=liveness
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.108.21.178
IPs:               10.108.21.178
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:                                                                              ##为空
Session Affinity:  None
Events:            <none>回收
[root@k8s2 pod]# kubectl delete  -f liveness-pod.yaml

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

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

相关文章

金三银四面试热潮将至,靠这一份软件测试面经,offer拿到手软

不知不觉又到了新一年的金三银四&#xff0c; 去年的疫情紧张&#xff0c;造成的一系列影响我相信大家都还历历在目&#xff0c;尤其是工作这块更是如此&#xff0c;找工作的紧迫度&#xff0c;导致很大部分人群在工作发展可能并没有想象中的那样迅速。 作为一名在职的测试人员…

git团队合作 - branch分支的使用、主分支合并、冲突处理方案

情景例子开发部3人&#xff0c;组长man&#xff0c; 组员devA&#xff0c;devB&#xff1b;1&#xff09;组长man负责代码合并、冲突处理、检查代码、合并代码到master主分支&#xff1b;2&#xff09;组员devA负责开发3&#xff09;组员devB负责开发git仓库主次分支安排1&…

C++ linux下获取时间戳 秒、微妙、纳秒

1.例子#include <iostream>#include <sys/time.h>#include <cstdlib>#include <cstdio>#include <ctime>#include <cmath>#include <unistd.h>usingnamespace std;time_t clocktime(){time_t t time(NULL);std::cout << &quo…

swoole的强大之处,你可能只是略知一二!

首先 swoole 是 php 的一个扩展程序swoole 是一个为 php 用 c 和 c 编写的基于事件的高性能异步 & 协程并行网络通信引擎swoole 是一个多进程模型的框架&#xff0c;当启动一个进程 swoole 应用时&#xff0c;一共会创建 2nm 个进程&#xff0c;n 为 worker 进程数&#xf…

vector你得知道的知识

vector的基本使用和模拟实现 一、std::vector基本介绍 1.1 常用接口说明 std::vector是STL中的一个动态数组容器&#xff0c;它可以自动调整大小&#xff0c;支持在数组末尾快速添加和删除元素&#xff0c;还支持随机访问元素。 以下是std::vector常用的接口及其说明&#xf…

熬夜30天吃透这九大Java核心专题,我收割了3个大厂offer

这次一共收割了3个大厂offer&#xff0c;分别是蚂蚁金服、美团和网易&#xff0c;特意分享这次对我帮助非常大的宝典资料&#xff0c;一共涉及九大核心专题&#xff0c;分别是计算机网络、操作系统、MySQL、Linux、JAVA、JVM、Redis、消息队列与分布式、网站优化相关&#xff0…

DSF深度搜索时到底是如何回溯的(小tip)

这一段让我迷了两次&#xff0c;为什么回溯的时候&#xff0c;恢复了最后一位&#xff0c;往上递归一层之后&#xff0c;把最后一位填在它前一位&#xff0c;但是原本的前一位没有恢复&#xff0c;最后一位要怎么办&#xff1f;其实这还是递归没明白 也就是这一步是如何实现的 …

一点就分享系列(实践篇6——上篇)【迟到补发】Yolo-High_level系列算法开源项目融入V8 旨在研究和兼容使用【持续更新】

一点就分享系列&#xff08;实践篇5-补更篇&#xff09;[迟到补发]—Yolo系列算法开源项目融入V8旨在研究和兼容使用[持续更新] 题外话 去年我一直复读机式强调High-level在工业界已经饱和的情况&#xff0c;目的是呼吁更多人看准自己&#xff0c;不管是数字孪生交叉领域&#…

C++基础了解-21-C++ 继承

C 继承 一、C 继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类&#xff0c;这使得创建和维护一个应用程序变得更容易。这样做&#xff0c;也达到了重用代码功能和提高执行效率的效果。 当创建一个类时&#xff0c;不需要重新编写新的…

量子计算(8)pyqpanda编程3测量操作

作为一名高产博主&#xff0c;小编我一天不写文章就浑身难受&#xff0c;这不&#xff0c;一闲下来就来给大家科普量子计算编程操作了。 今天我们要来探讨“测量操作”&#xff0c;众所周知&#xff0c;薛定谔的猫是一种既死又活的状态&#xff0c;很多人认为&#xff0c;猫是死…

Java代码优化|提高代码质量的一些小技巧

1.需要 Map 的主键和取值时&#xff0c;应该迭代 entrySet()当循环中只需要 Map 的主键时&#xff0c;迭代 keySet() 是正确的。但是&#xff0c;当需要主键和取值时&#xff0c;迭代 entrySet() 才是更高效的做法&#xff0c;比先迭代 keySet() 后再去 get 取值性能更佳。正例…

Git设置SSH Key

一、git 配置 &#xff08;1&#xff09;打开 git 命令窗口 &#xff08;2&#xff09;配置用户名&#xff08;填自己的姓名&#xff09; git config --global user.name “xinyu.xia” &#xff08;3&#xff09;配置用户邮箱&#xff08;填自己的邮箱&#xff0…

Python+Yolov8目标识别特征检测

Yolov8目标识别特征检测如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<Yolov8目标识别特征检测>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐…

Easy Deep Learning——PyTorch中的自动微分

目录 什么是深度学习&#xff1f;它的实现原理是怎么样的呢&#xff1f; 什么是梯度下降&#xff1f;梯度下降是怎么计算出最优解的&#xff1f; 什么是导数&#xff1f;求导对于深度学习来说有何意义&#xff1f; PyTorch 自动微分&#xff08;自动求导&#xff09; 为什么…

小孩用什么样的台灯比较好?2023眼科医生青睐的儿童台灯推荐

小孩子属于眼睛比较脆弱的人群&#xff0c;所以选购护眼台灯时&#xff0c;选光线温和的比较好&#xff0c;而且调光、显色效果、色温、防蓝光等方面也要出色&#xff0c;否则容易导致孩子近视。 1、调光。台灯首先是照度高&#xff0c;国AA级&#xff0b;大功率发光&#xff0…

C++学习笔记(以供复习查阅)

视频链接 代码讲义 提取密码: 62bb 文章目录1、C基础1.1 C初识&#xff08;1&#xff09; 第一个C程序&#xff08;2&#xff09;注释&#xff08;3&#xff09;变量&#xff08;4&#xff09;常量&#xff08;5&#xff09;关键字&#xff08;6&#xff09;标识符命名规则1.2 …

前端jQuery ajax请求,后端node.js使用cors跨域

前言 跨域&#xff0c;一句话介绍&#xff1a; 你要请求的URL地址与当前的URL地址&#xff0c;协议不同、域名不同、端口不同时&#xff0c;就是跨域。 步入正题 前端&#xff0c;jQuery ajax请求 $.ajax({async: false,method: post,//URl和端口与后台匹配好&#xff0c;当…

HTTPS加密解析

日升时奋斗&#xff0c;日落时自省 目录 1、加密解释 2、对称加密 3、非对称加密 4、证书 HTTPS&#xff08;HyperText Transfer Protocol over Secure Socket Layer&#xff09;也是一个应用层协议&#xff0c;是在HTTP协议的基础上引入了一个加密层 HTTP协议内容都是按…

Docker学习(二十一)构建 java 项目基础镜像

目录1.下载 JDK 包2.编写 Dockerfile3.构建镜像4.创建容器测试1.下载 JDK 包 JDK各版本官网下载地址&#xff1a; https://www.oracle.com/java/technologies/downloads/archive/#JavaSE 这里我们以 JDK 8u351 为例&#xff0c;点击 Java SE (8U211 and later)。 点击下载 jd…

自动化测试实战篇(9),jmeter常用断言方法,一文搞懂9种测试字段与JSON断言

Jmeter常用的断言主要有&#xff0c;JSON断言和响应断言这两种方式。 断言主要就是帮助帮助人工进行快速接口信息验证避免繁杂的重复的人工去验证数据 第一种响应断言Apply to&#xff1a;表示应用范围测试字段&#xff1a;针对响应数据进行不同的匹配响应文本响应代码响应信息…