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