Pod容器

news2025/7/19 4:30:32

1、Pod基础概念

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

1.1 在Kubrenetes集群中Pod有如下两种使用方式

1.1.1一个Pod中运行一个容器

“每个Pod中一个容器”的模式是最常见的用法;在这种使用方式中,你可以把Pod想象成是单个容器的封装,kuberentes管理的是Pod而不是直接管理容器。

在一个Pod中同时运行多个容器。一个Pod中也可以同时封装几个需要紧密耦合互相协作的容器,它们之间共享资源。这些在同一个Pod中的容器可以互相协作成为一个service单位,比如一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。

1.1.2 一个Pod下的容器必须运行于同一节点上

现代容器技术建议一个容器只运行一个进程,该进程在容器中PID命令空间中的进程号为1,可直接接收并处理信号,进程终止时容器生命周期也就结束了。若想在容器内运行多个进程,需要有一个类似Linux操作系统init进程的管控类进程,以树状结构完成多进程的生命周期管理。运行于各自容器内的进程无法直接完成网络通信,这是由于容器间的隔离机制导致,k8s中的Pod资源抽象正是解决此类问题,Pod对象是一组容器的集合,这些容器共享Network、UTS及IPC命令空间,因此具有相同的域名、主机名和网络接口,并可通过IPC直接通信。

Pod资源中针对各容器提供网络命令空间等共享机制的是底层基础容器pause,基础容器(也可称为父容器)pause就是为了管理Pod容器间的共享操作,这个父容器需要能够准确地知道如何去创建共享运行环境的容器,还能管理这些容器的生命周期。为了实现这个父容器的构想,kubernetes中,用pause容器来作为一个Pod中所有容器的父容器。这个pause容器有两个核心的功能,一是它提供整个Pod的Linux命名空间的基础。二来启用PID命名空间,它在每个Pod中都作为PID为1进程(init进程),并回收僵尸进程。

1.2 pause容器使得Pod中的所有容器可以共享两种资源:网络和存储。

1.2.1 网络

每个Pod都会被分配一个唯一的IP地址。Pod中的所有容器共享网络空间,包括IP地址和端口。Pod内部的容器可以使用localhost互相通信。Pod中的容器与外界通信时,必须分配共享网络资源(例如使用宿主机的端口映射)。

1.2.2 存储

Pod可以指定多个共享的Volume。Pod中的所有容器都可以访问共享的Volume。Volume也可以用来持久化Pod中的存储资源,以防容器重启后文件丢失。

总结:

每个Pod都有一个特殊的被称为“基础容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或者多个紧密相关的用户应用容器。

1.3 kubernetes中的pause容器主要为每个容器提供以下功能

在pod中担任Linux命名空间(如网络命令空间)共享的基础;

启用PID命名空间,开启init进程。

1.4 Kubernetes设计这样的Pod概念和特殊组成结构有什么用意

原因一:在一组容器作为一个单元的情况下,难以对整体的容器简单地进行判断及有效地进行行动。比如,一个容器死亡了,此时是算整体挂了么?那么引入与业务无关的Pause容器作为Pod的基础容器,以它的状态代表着整个容器组的状态,这样就可以解决该问题。

原因二:Pod里的多个应用容器共享Pause容器的IP,共享Pause容器挂载的Volume,这样简化了应用容器之间的通信问题,也解决了容器之间的文件共享问题。

1.5 K8s 创建pod分为两种

1.5.1 自主式/静态pod:不被控制管理的pod 没有自愈能力,一旦pod挂掉了,不会被重新拉起,而且副本数量也不会因为达不到期望值而创建新的pod

1.5.2 控制器管理的pod:被控制器管理的pod,有自愈能力了,一旦pod挂了,会被重新拉起,而且副本数量会因为达不到期望值而创建新的pod

2、初始化容器(initcontainers)

除了初始化容器另一个是基础容器(infrastructure container) Init容器必须在应用程序容器启动之运行完成,而应用程序容器是并行运行的,所以Init容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法。

2.1 Init 容器与普通的容器非常像,除了以下两点

2.1.1 Init 容器总是运行到成功完成为止

2.1.2 每个 Init 容器都必须在下一个 Init 容器启动之前成功完成启动和退出

如果 Pod 的 Init 容器失败,k8s 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的重启策略(restartPolicy)为 Never,它不会重新启动。

2.2 Init 的容器作用

因为init容器具有与应用容器分离的单独镜像,其启动相关代码具有如下优势:

2.2.1 Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。例如,没有必要仅为了在安装过程中使用类似 sed、 awk、 python 或 dig 这样的工具而去FROM 一个镜像来生成一个新的镜像。

2.2.2 Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。

2.2.3 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。

2.2.4 Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。

2.2.5 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,

直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。

3、应用容器(Maincontainer)

//并行启动

官网示例:

https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/init-containers/

apiVersion: v1

kind: Pod

metadata:

name: myapp-pod

labels:

app: myapp

spec:

containers:

- name: myapp-container

image: busybox:1.28

command: ['sh', '-c', 'echo The app is running! && sleep 3600']

initContainers:

- name: init-myservice

image: busybox:1.28

command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']

- name: init-mydb

image: busybox:1.28

command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

这个例子是定义了一个具有 2 个 Init 容器的简单 Pod。 第一个等待 myservice 启动, 第二个等待 mydb 启动。 一旦这两个 Init容器都启动完成,Pod 将启动 spec 中的应用容器。

kubectl describe pod myapp-pod

kubectl logs myapp-pod -c init-myservice

vim myservice.yaml

apiVersion: v115:55 2023/2/2115:56 2023/2/21

kind: Service

metadata:

name: myservice

spec:

ports:

- protocol: TCP

port: 80

targetPort: 9376

kubectl create -f myservice.yaml

kubectl get svc

kubectl get pods -n kube-system

kubectl get pods

vim mydb.yaml

apiVersion: v1

kind: Service

metadata:

name: mydb

spec:

ports:

- protocol: TCP

port: 80

targetPort: 9377

kubectl create -f mydb.yaml

kubectl get pods

//特别说明:

●在Pod启动过程中,Init容器会按顺序在网络和数据卷初始化之后启动。每个容器必须在下一个容器启动之前成功退出。

●如果由于运行时或失败退出,将导致容器启动失败,它会根据Pod的restartPolicy指定的策略进行重试。然而,如果Pod的restartPolicy设置为Always,Init容器失败时会使用RestartPolicy策略。

●在所有的Init容器没有成功之前,Pod将不会变成Ready状态。Init容器的端口将不会在Service中进行聚集。正在初始化中的Pod处于Pending状态,但应该会将Initializing状态设置为true。

●如果Pod重启,所有Init容器必须重新执行。

●对Init容器spec的修改被限制在容器image字段,修改其他字段都不会生效。更改Init容器的image字段,等价于重启该Pod。

●Init容器具有应用容器的所有字段。除了readinessProbe,因为Init容器无法定义不同于完成(completion)的就绪(readiness)之外的其他状态。这会在验证过程中强制执行。

●在Pod中的每个app和Init容器的名称必须唯一;与任何其它容器共享同一个名称,会在验证时抛出错误。

//镜像拉取策略(image PullPolicy):

Pod 的核心是运行容器,必须指定容器引擎,比如 Docker,启动容器时,需要拉取镜像,k8s 的镜像拉取策略可以由用户指定:

1、IfNotPresent:在镜像已经存在的情况下,kubelet 将不再去拉取镜像,仅当本地缺失时才从仓库中拉取,默认的镜像拉取策略

2、Always:每次创建 Pod 都会重新拉取一次镜像;

3、Never:Pod 不会主动拉取这个镜像,仅使用本地镜像。

注意:对于标签为“:latest”的镜像文件,其默认的镜像获取策略即为“Always”;而对于其他标签的镜像,其默认策略则为“IfNotPresent”。

官方示例:

https://kubernetes.io/docs/concepts/containers/images

kubectl apply -f - <<EOF

apiVersion: v1

kind: Pod

metadata:

name: private-image-test-1

spec:

containers:

- name: uses-private-image

image: $PRIVATE_IMAGE_NAME

imagePullPolicy: Always

command: [ "echo", "SUCCESS" ]

EOF

//master01 上操作

kubectl edit deployment/nginx-deployment

......

template:

metadata:

creationTimestamp: null

labels:

app: nginx

spec:

containers:

- image: nginx:1.15.4

imagePullPolicy: IfNotPresent#镜像拉取策略为 IfNotPresent

name: nginx

ports:

- containerPort: 80

protocol: TCP

resources: {}

terminationMessagePath: /dev/termination-log

terminationMessagePolicy: File

dnsPolicy: ClusterFirst

restartPolicy: Always#Pod的重启策略为 Always,默认值

schedulerName: default-scheduler

securityContext: {}

terminationGracePeriodSeconds: 30

......

//创建测试案例

mkdir /opt/demo

cd /opt/demo

vim pod1.yaml

apiVersion: v1

kind: Pod

metadata:

name: pod-test1

spec:

containers:

- name: nginx

image: nginx

imagePullPolicy: Always

command: [ "echo", "SUCCESS" ]

kubectl create -f pod1.yaml

kubectl get pods -o wide

pod-test1 0/1 CrashLoopBackOff 4 3m33s

//此时 Pod 的状态异常,原因是 echo 执行完进程终止,容器生命周期也就结束了

kubectl describe pod pod-test1

......

Events:

Type Reason Age From Message

---- ------ ---- ---- -------

Normal Scheduled 2m10s default-scheduler Successfully assigned default/pod-test1 to 192.168.80.11

Normal Pulled 46s (x4 over 119s) kubelet, 192.168.80.11 Successfully pulled image "nginx"

Normal Created 46s (x4 over 119s) kubelet, 192.168.80.11 Created container

Normal Started 46s (x4 over 119s) kubelet, 192.168.80.11 Started container

Warning BackOff 19s (x7 over 107s) kubelet, 192.168.80.11 Back-off restarting failed container

Normal Pulling 5s (x5 over 2m8s) kubelet, 192.168.80.11 pulling image "nginx"

//可以发现 Pod 中的容器在生命周期结束后,由于 Pod 的重启策略为 Always,容器再次重启了,并且又重新开始拉取镜像

//修改 pod1.yaml 文件

cd /opt/demo

vim pod1.yaml

apiVersion: v1

kind: Pod

metadata:

name: pod-test1

spec:

containers:

- name: nginx

image: nginx:1.14#修改 nginx 镜像版本

imagePullPolicy: Always

#command: [ "echo", "SUCCESS" ]#删除

//删除原有的资源

kubectl delete -f pod1.yaml

//更新资源

kubectl apply -f pod1.yaml

//查看 Pod 状态

kubectl get pods -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE

pod-test1 1/1 Running 0 33s 172.17.36.4 192.168.80.11 <none>

//在任意 node 节点上使用 curl 查看头部信息

curl -I http://172.17.36.4

HTTP/1.1 200 OK

Server: nginx/1.14.2

......

部署 harbor 创建私有项目

//在 Docker harbor 节点(192.168.80.30)上操作

systemctl stop firewalld.service

systemctl disable firewalld.service

setenforce 0

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install -y docker-ce

systemctl start docker.service

systemctl enable docker.service

docker version

//上传 docker-compose 和 harbor-offline-installer-v1.2.2.tgz 到 /opt 目录中

cd /opt

chmod +x docker-compose

mv docker-compose /usr/local/bin/

//部署 Harbor 服务

tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/

vim /usr/local/harbor/harbor.cfg

--5行--修改,设置为Harbor服务器的IP地址或者域名

hostname = 192.168.80.30

cd /usr/local/harbor/

./install.sh

//在 Harbor 中创建一个新项目

(1)浏览器访问:http://192.168.80.10 登录 Harbor WEB UI 界面,默认的管理员用户名和密码是 admin/Harbor12345

(2)输入用户名和密码登录界面后可以创建一个新项目。点击“+项目”按钮

(3)填写项目名称为“kgc-project”,点击“确定”按钮,创建新项目

//在每个 node 节点配置连接私有仓库(注意每行后面的逗号要添加)

cat > /etc/docker/daemon.json <<EOF

{

"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],

"insecure-registries":["192.168.80.30"]

}

EOF

systemctl daemon-reload

systemctl restart docker

//在每个 node 节点登录 harbor 私有仓库

docker login -u admin -p harbor12345 http://192.168.80.30

//在一个 node 节点下载 Tomcat 镜像进行推送

docker pull tomcat:8.0.52

docker images

docker tag tomcat:8.0.52 192.168.80.30/kgc-project/tomcat:v1

docker images

docker push 192.168.80.30/kgc-project/tomcat:v1

//查看登陆凭据

cat /root/.docker/config.json | base64 -w 0#base64 -w 0:进行 base64 加密并禁止自动换行

ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE5NS44MCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOS4wMy41IChsaW51eCkiCgl9Cn0=

//创建 harbor 登录凭据资源清单,用于 K8S 访问 Harbor 私服拉取镜像所需要的密钥权限凭证 secret 资源

vim harbor-pull-secret.yaml

apiVersion: v1

kind: Secret

metadata:

name: harbor-pull-secret

data:

.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE5NS44MCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOS4wMy41IChsaW51eCkiCgl9Cn0=#复制粘贴上述查看的登陆凭据

type: kubernetes.io/dockerconfigjson

//创建 secret 资源

kubectl create -f harbor-pull-secret.yaml

//查看 secret 资源

kubectl get secret

//创建资源从 harbor 中下载镜像

cd /opt/demo

vim tomcat-deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: my-tomcat

spec:

replicas: 2

selector:

matchLabels:

app: my-tomcat

template:

metadata:

labels:

app: my-tomcat

spec:

imagePullSecrets:#添加 K8S 访问 Harbor 私服拉取镜像所需要的 secret 资源选项

- name: harbor-pull-secret#指定 secret 资源名称

containers:

- name: my-tomcat

image: 192.168.80.30/kgc-project/tomcat:v1#指定 harbor 中的镜像名

ports:

- containerPort: 80

---

apiVersion: v1

kind: Service

metadata:

name: my-tomcat

spec:

type: NodePort

ports:

- port: 8080

targetPort: 8080

nodePort: 31111

selector:

app: my-tomcat

//删除之前在 node 节点下载的 Tomcat 镜像

docker rmi tomcat:8.0.52

docker rmi 192.168.80.30/kgc-project/tomcat:v1

docker images

//创建资源

kubectl create -f tomcat-deployment.yaml

kubectl get pods

NAME READY STATUS RESTARTS AGE

my-tomcat-d55b94fd-29qk2 1/1 Running 0

my-tomcat-d55b94fd-9j42r 1/1 Running 0

//查看 Pod 的描述信息,可以发现镜像时从 harbor 下载的

kubectl describe pod my-tomcat-d55b94fd-29qk2

//刷新 harbor 页面,可以看到镜像的下载次数增加了

切换到opt目录下,新建pod容器

cd /opt

mkdir pod

vim demo.yaml

kubectl logsmyapp-pod -c init-myservice

没有设置always也会开始重启策略,原因是标签

删除pod-test1之后重新加入

再次创建pod1.yaml

删除后再创建之后,从running变成completed

总结镜像拉取

pod容器镜像拉取策略(imagePullProlicy)三种容器

1、ifNotPresent:优先使用本地已存在的镜像,如本地

2、Always:总是从仓库拉取镜像,无论本地是否存在已存在的镜像

3、Nerver:总是补充仓库拉取镜像,仅使用本地镜像,

镜像重启策略:

1、always:当容器终止退出后,总是重启容器,默认策略

2、ONFailure:当容器异常退出时(退出状态码非0时),重启容器,正常退出则不重启容器

3、Nerver:当容器终止退出,从不重启容器

注意:k8s中不支持重启Pod资源,只有删除重建

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

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

相关文章

如何在jmeter中把响应中的数据提取出来并引用

jmeter做接口测试过程中&#xff0c;经常遇到请求需要用到token的时候&#xff0c;我们可以把返回token的接口用后置处理器提取出来&#xff0c;但是在这种情况下&#xff0c;只能适用于当前的线程组&#xff0c;其他线程组无法引用到提取的token变量值&#xff0c;所以必须要生…

数据库三大范式

目录 1.什么是范式 2.为什么使用范式 3.数据库范式类型 4.第一范式 5.第二范式 6.第三范式 1.什么是范式 一些约束、规范、规则 来优化数据库表的设计和存储&#xff0c;这些规则就称为范式。 2.为什么使用范式 遵从不同的规范要求&#xff0c;设计出合理的关系型数据库…

vue中go.js的使用教学(三:创建零部件)

目录 1.介绍 2.创建零部件 一.复杂版 二.简洁版 a.(小复杂版)重写上方复杂版代码&#xff1a; b.&#xff08;优化版&#xff09;重写上方小复杂版 c.这边在加一个扩展&#xff08;GraphObject.make 构建一个 Brush&#xff09; 1.介绍 这边的零部件&#xff0c;指的是每…

破解遗留系统快速重构的5步心法(附实例)

前两天和一个架构师朋友闲聊&#xff0c;说到了 「重构」 这个话题&#xff0c;他们公司早年间上线的项目系统&#xff0c;因一直没专人在演进过程中为代码质量负责&#xff0c;导致现在代码越来越混乱&#xff0c;逐渐堆积成“屎山”&#xff0c;目前的维护成本已远高于重新开…

#贴改色膜前,你必须要知道的事情

关于汽车改色&#xff0c;大多数人都会觉得简单的改个颜色&#xff0c;只是上一层膜而已。但是事实不是这样&#xff0c;改色膜真的不只是看价格和颜色这么简单。最近也有车主来吐槽自己踩过的坑&#xff0c;这篇给大家科普一下&#xff0c;怎么才能避坑&#xff01;一&#xf…

Python os和sys模块

一、os模块 os 模块是 Python中的一个内置模块&#xff0c;也是 Python中整理文件和目录最为常用的模块。 该模块提供了非常丰富的方法用来处理文件和目录。比如&#xff1a;显示当前目录下所有文件/删除某个文件/获取文件大小 1、获取当前的工作路径 在 Python 中&#xff0…

传统巨头生“变”,中国毫米波雷达市场战火再升级

进入2023年&#xff0c;中国车载毫米波雷达市场战火明显升级。 一方面&#xff0c;愈演愈烈的份额抢夺战不仅仅存在于几大传统巨头之间&#xff0c;也快速转移到与国产供应商之间&#xff1b;随着部分外资巨头的本土化战略深入落地&#xff0c;同时对国产供应商造成了压力。 …

多层感知机的区间随机初始化方法

摘要&#xff1a; 训练是构建神经网络模型的一个关键环节&#xff0c;该过程对网络中的参数不断进行微调&#xff0c;优化模型在训练数据集上的损失函数。参数初始化是训练之前的一个重要步骤&#xff0c;决定了训练过程的起点&#xff0c;对模型训练的收敛速度和收敛结果有重要…

mysql -学习总结

mysql 详解1、mysql特点2、事务2.1 事务的四大特性 – ACID2.2 并发事务问题2.3 事务的四大隔离级别2.4 事务隔离级别操作sql2.5 事务原理 – LBCC MVCC2.4.1 行的隐藏列2.4.2 ReadView2.4.3 MVCC在四种隔离级别下的区别2.5 undo log、binlog、redo log2.5.1 Undo log2.5.2 bin…

【BCT_RFC 3927】IPv4 链路本地地址的动态配置

本文件规定了一个因特网标准跟踪协议互联网社区&#xff0c;并请求讨论和建议改进。请参考当前版本的“互联网标准化国家的官方协议标准”&#xff08;STD1&#xff09;和该协议的状态。 抽象的 要参与广域 IP 网络&#xff0c;主机需要为其接口配置 IP 地址&#xff0c;可以通…

10分钟学会使用 Loki 日志聚合系统

Loki 是一个由Grafana Labs 开发的开源日志聚合系统&#xff0c;旨在为云原生架构提供高效的日志处理解决方案。 Loki 通过使用类似 Prometheus 的标签索引机制来存储和查询日志数据&#xff0c;这使得它能够快速地进行分布式查询和聚合&#xff0c;而不需要将所有数据都从存储…

五星好文·射频功率放大器(RF PA)概述

基本概念 射频功率放大器(RF PA)是发射系统中的主要部分&#xff0c;其重要性不言而喻。在发射机的前级电路中&#xff0c;调制振荡电路所产生的射频信号功率很小&#xff0c;需要经过一系列的放大&#xff08;缓冲级、中间放大级、末级功率放大级&#xff09;获得足够的射频功…

面试官:说说你对react生命周期的理解

hello&#xff0c;这里是潇晨&#xff0c;今天我们来看下react生命周期在各个阶段是怎样执行的&#xff0c;在面试的过程中有没有遇到这个问题呢&#xff0c;大家也可以学习往期react源码体系文章哦&#xff0c;往期文章目录在文章结尾。 在之前的react源码介绍中&#xff0c;…

小程序(十)签到业务流程分析

文章目录一、如何获取地理信息&#xff1f;二、如何判定某地区新冠疫情的风险等级&#xff1f;系统的人脸签到模块包含的功能非常丰富&#xff0c;不仅仅只有人脸识别的签到功能&#xff0c;而且还可以根据用户签到时候的地理定位&#xff0c;计算出该地区是 新冠疫情 的 高风险…

ChIP-seq 分析:评估片段长度与处理(6)

1. 片段长度评估 片段长度的预测是 ChIPseq 的重要组成部分&#xff0c;它会影响峰识别、峰识别和覆盖概况。 使用互相关或交叉覆盖可以评估按链进行的读取聚类&#xff0c;从而衡量质量。 fragment在 ChIPseq 中&#xff0c;通常是 dsDNA 的短单端读取。片段的 5 将在“”链上…

C语言入门教程||C语言 函数||C语言 数组

C语言 函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数&#xff0c;即主函数 main() &#xff0c;所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的&#xff0c;但在逻辑上&#x…

【YOLOv5】 02-标注图片,训练并使用自己的模型

在上一篇文章中&#xff0c;我们完成了YOLOv5的安装和测试。如果想检测自定义目标&#xff0c;就需要用到LabelImg来对图片打标签&#xff0c;本篇文章介绍了LabelImg安装与使用&#xff0c;以及如何训练并使用自己的模型。一、安装LabelImg输入如下命令进行安装&#xff1a;pi…

文献综述怎么写?有哪些准备工作和内容要求

文献综述的撰写是提高研究生论文写作能力的重要途径&#xff0c;是研究生在撰写学术论文和学位论文中必须要涉及的内容&#xff0c;是不可或缺的&#xff0c;写好一篇好的文献综述是存在诸多困难和挑战的&#xff0c;需要掌握一定的技巧和方法。 一、文献综述的写作目的 文献综…

卷起来了,2023金三银四自动化测试面试题精选【字节二面】

面试一般分为技术面和hr面&#xff0c;形式的话很少有群面&#xff0c;少部分企业可能会有一个交叉面&#xff0c;不过总的来说&#xff0c;技术面基本就是考察你的专业技术水平的&#xff0c;hr面的话主要是看这个人的综合素质以及家庭情况符不符合公司要求&#xff0c;一般来…

linux input子系统,gpio-keys,gpio中断使用

GPIO控制 嵌入式linux下应用编程会经常使用到gpio&#xff0c;GPIO 可以通过 sysfs 方式进行操控&#xff0c;进入到/sys/class/gpio 目录下&#xff0c;如下所示&#xff1a; 可以看到该目录下包含两个文件 export、 unexport 以及 5 个 gpiochipX&#xff08;X 等于 0、 32、…