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-pod
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:1.19
ports:
- containerPort: 80
三、常用资源类型的 YAML 配置
1. Pod
Pod 是 K8s 中最小的可部署单元,一个 Pod 可以包含一个或多个紧密相关的容器。除了上述示例中的基本配置外,还可以添加更多字段,如资源请求与限制、环境变量、健康检查等。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:1.19
ports:
- containerPort: 80
resources:
requests:
cpu: "200m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
env:
- name: DB_HOST
value: "db.example.com"
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 15
periodSeconds: 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: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:1.19
ports:
- 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-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: 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.com
db.port=3306
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-app-image
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: my-config
key: app.properties
optional: false
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
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_username
password: base64_encoded_password
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-app-image
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: my-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: 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-1
image: nginx:1.19
---
apiVersion: v1
kind: Service
metadata:
name: service-1
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
4. 版本兼容性
不同版本的 K8s 对 API 版本和字段的支持可能有所不同,在编写 YAML 文件时要确保使用的 API 版本和字段与当前 K8s 集群版本兼容。可以参考 K8s 官方文档来获取最新的版本信息和使用说明。
五、部署带有持久化存储与环境变量的ollama应用
kind: Deployment
apiVersion: apps/v1
metadata:
name: ollama
namespace: deepseek
labels:
app: ollama
annotations:
deployment.kubernetes.io/revision: '4'
kubesphere.io/creator: admin
spec:
replicas: 1
selector:
matchLabels:
app: ollama
template:
metadata:
creationTimestamp: null
labels:
app: ollama
annotations:
kubesphere.io/creator: admin
kubesphere.io/imagepullsecrets: '{"ollama":"harbor"}'
spec:
volumes:
- name: zaimode
hostPath:
path: /aimode
type: DirectoryOrCreate
containers:
- name: ollama
image: 'harbor.baiyjk.com/deepseek/ollama:v1.0'
ports:
- name: http-0
containerPort: 11434
protocol: TCP
env:
- name: OLLAMA_MODELS
value: /ollamamode
resources: {}
volumeMounts:
- name: zaimode
mountPath: /ollamamode
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
serviceAccountName: default
serviceAccount: default
securityContext: {}
imagePullSecrets:
- name: harbor
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600
---
# 同时定义 PVC(存储卷声明)
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: zaimode
namespace: deepseek
annotations:
kubesphere.io/creator: admin
finalizers:
- kubernetes.io/pvc-protection
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Gi
storageClassName: local
volumeMode: Filesystem