Kubernetes 中 YAML 文件详解

embedded/2025/3/14 12:03:44/

Kubernetes 中 YAML 文件详解

在 Kubernetes(简称 K8s)的世界里,YAML(Yet Another Markup Language)文件是核心配置工具。K8s 作为一个强大的容器编排系统,允许用户通过 YAML 文件来定义和管理各种资源,如 Pods、Deployments、Services 等。使用 YAML 文件可以实现声明式配置,清晰地描述系统的期望状态,而 K8s 会自动确保实际状态与期望状态一致。下面将详细介绍 K8s 中 YAML 文件的结构、常用字段以及不同资源类型的 YAML 示例。

二、YAML 文件基础结构

所有 K8s 资源的 YAML 文件通常包含以下四个基本部分:

1. apiVersion

指定使用的 Kubernetes API 版本,不同的资源类型可能使用不同的 API 版本。例如,v1 是核心 API 版本,常用于 Pod、Service 等资源;apps/v1 用于 Deployment、StatefulSet 等工作负载资源。

2. kind

明确资源的类型,如 Pod、Deployment、Service、ConfigMap 等。

3. metadata

包含资源的元数据,如名称(name)、命名空间(namespace)、标签(labels)和注解(annotations)等。
name:资源的唯一标识符,在同一命名空间内必须唯一。
namespace:可选字段,用于将资源划分到不同的逻辑组中,默认是 default 命名空间。
labels:键值对形式,用于对资源进行分类和选择,例如可以根据应用名称、环境等进行标记。
annotations:也是键值对,但主要用于存储非标识性的额外信息,供工具或系统使用。

4. spec

定义资源的具体规格,不同的资源类型其 spec 部分差异很大。例如,对于 Pod 资源,spec 会包含容器的定义;对于 Deployment 资源,spec 会包含副本数量、选择器和 Pod 模板等信息。
以下是一个简单的 Pod 资源 YAML 文件示例:

apiVersion: v1
kind: Pod
metadata:name: my-podlabels:app: my-app
spec:containers:- name: my-containerimage: nginx:1.19ports:- containerPort: 80

三、常用资源类型的 YAML 配置

1. Pod

Pod 是 K8s 中最小的可部署单元,一个 Pod 可以包含一个或多个紧密相关的容器。除了上述示例中的基本配置外,还可以添加更多字段,如资源请求与限制、环境变量、健康检查等。

apiVersion: v1
kind: Pod
metadata:name: my-podlabels:app: my-app
spec:containers:- name: my-containerimage: nginx:1.19ports:- containerPort: 80resources:requests:cpu: "200m"memory: "512Mi"limits:cpu: "500m"memory: "1Gi"env:- name: DB_HOSTvalue: "db.example.com"livenessProbe:httpGet:path: /healthzport: 80initialDelaySeconds: 15periodSeconds: 5

resources:用于设置容器对 CPU 和内存的请求和限制,requests 表示容器运行所需的最小资源,limits 表示容器最多能使用的资源。
env:定义容器的环境变量,这里设置了一个名为 DB_HOST 的环境变量。
livenessProbe:存活探针,用于检查容器是否正常运行。这里使用 HTTP GET 请求 /healthz 路径来判断容器的健康状态。

2. Deployment

Deployment 用于管理 Pod 的副本数量,并支持滚动更新、回滚等操作。

apiVersion: apps/v1
kind: Deployment
metadata:name: my-deployment
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:1.19ports:- containerPort: 80

replicas:指定要运行的 Pod 副本数量。
selector:用于选择要管理的 Pod,通过匹配标签来确定。
template:定义 Pod 的模板,即创建 Pod 时使用的配置。

3. Service

Service 用于为一组 Pod 提供统一的访问入口,实现服务发现和负载均衡。

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-appports:- protocol: TCPport: 80targetPort: 80type: ClusterIP

selector:同样用于选择要关联的 Pod。
ports:定义服务的端口映射,port 是服务对外暴露的端口,targetPort 是 Pod 内部容器的端口。
type:指定服务的类型,常见的有 ClusterIP(默认,只能在集群内部访问)、NodePort(通过节点的端口暴露服务)、LoadBalancer(使用云提供商的负载均衡器)等。

4. ConfigMap

ConfigMap 用于存储非敏感的配置数据,可将其注入到 Pod 中作为环境变量或配置文件。

apiVersion: v1
kind: ConfigMap
metadata:name: my-config
data:app.properties: |db.host=db.example.comdb.port=3306
yaml
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-app-imageenv:- name: DB_HOSTvalueFrom:configMapKeyRef:name: my-configkey: app.propertiesoptional: falsevolumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:name: my-config

在 ConfigMap 中,data 字段存储配置数据,可以是键值对或文件内容。
在 Pod 中,可以通过 env 字段将 ConfigMap 中的数据作为环境变量注入,也可以通过 volumeMounts 和 volumes 将其挂载为配置文件。

5. Secret

Secret 用于存储敏感数据,如密码、令牌等,其使用方式与 ConfigMap 类似,但数据会进行加密存储。

apiVersion: v1
kind: Secret
metadata:name: my-secret
type: Opaque
data:username: base64_encoded_usernamepassword: base64_encoded_password
yaml
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-app-imageenv:- name: DB_USERNAMEvalueFrom:secretKeyRef:name: my-secretkey: username- name: DB_PASSWORDvalueFrom:secretKeyRef:name: my-secretkey: password

在 Secret 中,data 字段的值需要进行 Base64 编码。
在 Pod 中,可以通过 env 字段将 Secret 中的数据作为环境变量注入。

四、YAML 文件的编写和使用注意事项

1. 语法规则

YAML 文件使用缩进表示层级关系,必须使用空格而不是制表符进行缩进,否则会导致解析错误。同时,注意冒号后面需要有一个空格。

2. 验证和调试

可以使用 kubectl 命令来验证 YAML 文件的正确性,例如 kubectl create --dry-run=client -f your-file.yaml 可以在不实际创建资源的情况下检查文件的语法和有效性。如果出现错误,K8s 会给出相应的错误信息,帮助你定位问题。

3. 多资源定义

一个 YAML 文件中可以定义多个资源,使用 — 分隔不同的资源定义。例如:

apiVersion: v1
kind: Pod
metadata:name: pod-1
spec:containers:- name: container-1image: nginx:1.19
---
apiVersion: v1
kind: Service
metadata:name: service-1
spec:selector:app: my-appports:- protocol: TCPport: 80targetPort: 80type: ClusterIP

4. 版本兼容性

不同版本的 K8s 对 API 版本和字段的支持可能有所不同,在编写 YAML 文件时要确保使用的 API 版本和字段与当前 K8s 集群版本兼容。可以参考 K8s 官方文档来获取最新的版本信息和使用说明。

五、部署带有持久化存储与环境变量的ollama应用

kind: Deployment
apiVersion: apps/v1
metadata:name: ollamanamespace: deepseeklabels:app: ollamaannotations:deployment.kubernetes.io/revision: '4'kubesphere.io/creator: admin
spec:replicas: 1selector:matchLabels:app: ollamatemplate:metadata:creationTimestamp: nulllabels:app: ollamaannotations:kubesphere.io/creator: adminkubesphere.io/imagepullsecrets: '{"ollama":"harbor"}'spec:volumes:- name: zaimodehostPath:path: /aimodetype: DirectoryOrCreatecontainers:- name: ollamaimage: 'harbor.baiyjk.com/deepseek/ollama:v1.0'ports:- name: http-0containerPort: 11434protocol: TCPenv:- name: OLLAMA_MODELSvalue: /ollamamoderesources: {}volumeMounts:- name: zaimodemountPath: /ollamamodeterminationMessagePath: /dev/termination-logterminationMessagePolicy: FileimagePullPolicy: IfNotPresentrestartPolicy: AlwaysterminationGracePeriodSeconds: 30dnsPolicy: ClusterFirstserviceAccountName: defaultserviceAccount: defaultsecurityContext: {}imagePullSecrets:- name: harborschedulerName: default-schedulerstrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 25%maxSurge: 25%revisionHistoryLimit: 10progressDeadlineSeconds: 600
---
# 同时定义 PVC(存储卷声明)
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: zaimodenamespace: deepseekannotations:kubesphere.io/creator: adminfinalizers:- kubernetes.io/pvc-protection
spec:accessModes:- ReadWriteOnceresources:requests:storage: 500GistorageClassName: localvolumeMode: Filesystem

http://www.ppmy.cn/embedded/172182.html

相关文章

在java中使用RabbitMQ的步骤

一.引入RabbitMQ依赖 <!--AMQP依赖&#xff0c;包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><!-- jackson消息转换器-->…

FreeRTOS之队列集

文章目录 用途创建队列集把队列加入队列集读取队列集 用途 一个任务可能需要从多个不同的数据源接收数据&#xff0c;如果没有队列集&#xff0c;任务需要在多个队列之间进行轮询&#xff0c;可能导致任务在某些情况下无法及时响应。使用队列集&#xff0c;任务可以以阻塞的方…

在 Windows 11 上使用 PyCharm 创建一个 Flask 项目,并使用 `pipenv` 进行虚拟环境管理

在 Windows 11 上使用 PyCharm 创建一个 Flask 项目&#xff0c;并使用 pipenv 进行虚拟环境管理&#xff0c;可以按照以下步骤进行&#xff1a; 1. 安装必要的软件 确保已安装 Python &#xff08;建议 3.8 及以上版本&#xff09;。 在终端&#xff08;Win R 输入 cmd&#…

苍穹外卖实战附源码-DAY1

一、打开项目的Nginx 1.通过nginx成功打开包装后的前端网页 二、导入sky的数据库 sky.sql 数据 CREATE DATABASE IF NOT EXISTS sky_take_out ; USE sky_take_out;DROP TABLE IF EXISTS address_book; CREATE TABLE address_book (id bigint NOT NULL AUTO_INCREMENT COMMEN…

智慧公交救助系统科创发明课后总结

一、深入社会调研&#xff0c;洞察出行难题 在日常生活的出行场景中&#xff0c;我们深刻地体会到城市交通面临的严峻挑战&#xff0c;尤其是早高峰与晚高峰时段&#xff0c;道路拥堵成为了常态。大量车辆在道路上缓慢蠕动&#xff0c;公交的行驶速度也受到极大影响。传统的公…

wpf label 内容绑定界面不显示

<Label Content"{Binding LabelText}" /> ... public string LabelText {get;set;}后端改变值后,界面内容并不显示 查看资料后改动如下 private string _labelText; public string LabelText{get { return _labelText; }set { _labelText value; OnPropertyCh…

JAVA实现好看的俄罗斯方块小游戏(附源码)

文章目录 一、设计来源俄罗斯方块小游戏讲解1.1 主界面1.2 游戏中界面1.3 游戏结束界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/146156297 JAVA…

MATLAB 控制系统设计与仿真 - 22

稳定裕度 幅值裕度 & 相角裕度 幅值裕度 - Gain Margin 当相角为-180时,使开环增益为1的增益量,为幅值裕度GM。 GM=0-20log|GH|=20log1-20log|GH|=20log|1/GH|=-20log|GH| 相角裕度 - Phase Margin 当开环增益为1时,开环相角与180的和,为相角裕度 PM。 其几何图示…