Kubernetes 中 YAML 文件详解

发布于:2025-03-13 ⋅ 阅读:(13) ⋅ 点赞:(0)

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