Kubernetes 中 YAML 文件详解

news/2025/3/13 10:05:45/

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/news/1578762.html

相关文章

【Android】adb shell基本使用教程

adb shell 是 Android Debug Bridge (ADB) 工具中的一个命令,用于在连接的 Android 设备或模拟器上执行 shell 命令。通过 adb shell,你可以直接与设备的 Linux 内核交互,执行各种操作。 基本用法 启动 adb shell: 在终端或命令提…

Spring Boot集成EasyExcel

1. 初始化Spring Boot项目 首先,使用Spring Initializr(https://start.spring.io/)生成一个基本的Spring Boot项目。选择以下依赖项: Spring WebLombok (用于减少样板代码)SLF4J (用于日志记录) 2. 添加依赖 在你的pom.xml文件…

高阶哈希算法

SHA-256简介 SHA-256 是 **SHA-2(Secure Hash Algorithm 2)**家族中的一种哈希算法,由美国国家安全局设计,并于 2001 年发布。它能够将任意长度的数据映射为一个固定长度256 位,即 32 字节的哈希值,通常以…

日志系统项目——准备工作了解类的设计模式如单例模式、工厂模式、代理模式

1.六大原则 1.1 单一职责原则 类的职责应该单⼀,⼀个⽅法只做⼀件事。职责划分清晰了,每次改动到最⼩单位的⽅法或 类。 使⽤建议:两个完全不⼀样的功能不应该放⼀个类中,⼀个类中应该是⼀组相关性很⾼的函 数、数据的封装 ⽤例…

Rust 之一 基本环境搭建、各组件工具的文档、源码、配置

概述 Rust 是一种强调性能、类型安全和并发性的通用编程语言。它强制执行内存安全,使用其特有的所有权机制,而无需传统的垃圾收集器。Rust 不强制执行编程范式,但受到函数式编程思想的影响。 最初是由 Mozilla 员工 Graydon Hoare 在 2006 年…

cocos creator使用mesh修改图片为圆形,减少使用mask,j减少drawcall,优化性能

cocos creator版本2.4.11 一个mask占用drawcall 3个以上,针对游戏中技能图标,cd,以及多玩家头像,是有很大优化空间 1.上代码,只适合单独图片的,不适合在图集中的图片 const { ccclass, property } cc._decorator;c…

Flink SQL 读取 Kafka 数据到 Mysql 实战

Flink 1.9.2 SQL 读取 Kafka 数据到 Mysql 实战 案例需求 通过Flinksql使用DDL的方式,实现读取kafka用户行为数据,对数据进行实时处理,根据时间分组,求PV 和UV ,然后输出到 mysql 中。 1、kafka中的消息的格式 数据以…

Django REST Framework 中 ModelViewSet 的接口方法及参数详解,继承的方法和核心类方法,常用查询方法接口

第一部分(ModelViewSet) 一、ModelViewSet 的继承结构 ModelViewSet 继承自以下类: ModelViewSet (CreateModelMixin # 创建RetrieveModelMixin # 检索单个UpdateModelMixin # 更新DestroyModelMixin # 删除ListModelMixin …