Kubernetes(K8s)YAML 配置文件编写教程

Kubernetes YAML 配置文件编写教程

Kubernetes 使用 YAML(或 JSON)文件以声明式方式定义资源对象。本教程将带你了解常见 K8s 资源的 YAML 结构、每个字段的含义及实际示例。


一、YAML 文件通用结构

所有 K8s 资源 YAML 文件都包含以下四个核心字段:

yaml 复制代码
apiVersion: <API组/版本>      # 使用的 API 版本
kind: <资源类型>              # 资源类型,如 Deployment、Service 等
metadata:                    # 元数据:名称、命名空间、标签等
spec:                        # 资源的具体配置(核心内容)

注意status 字段由 K8s 自动维护,不要手动写入 YAML


二、常用资源类型详解


1. Pod(最小调度单元)

Pod 是 K8s 中最小的运行单元,通常不直接创建,而是由控制器(如 Deployment)管理。

字段说明
字段 说明
apiVersion v1(Pod 属于 core API 组)
kind Pod
metadata.name Pod 名称
spec.containers 容器列表,每个容器需指定 nameimage
spec.containers.image 镜像地址(如 nginx:1.25
spec.containers.ports 容器暴露的端口(仅声明,不发布)
示例
yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-container
    image: nginx:1.25
    ports:
    - containerPort: 80

💡 适用场景:调试、临时任务。生产环境建议使用 Deployment。


2. Deployment(管理无状态应用)

用于声明 Pod 的期望状态(副本数、更新策略等),自动创建和管理 ReplicaSet。

字段说明
字段 说明
apiVersion apps/v1
kind Deployment
metadata.name Deployment 名称
spec.replicas 期望的 Pod 副本数(默认 1)
spec.selector.matchLabels 选择器,匹配 Pod 的标签
spec.template Pod 模板(内容与 Pod 的 spec 相同)
spec.template.metadata.labels 必须selector.matchLabels 一致
示例
yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80

selector.matchLabelstemplate.metadata.labels 必须匹配,否则创建失败!


3. Service(服务发现与负载均衡)

为一组 Pod 提供稳定的网络访问入口。

字段说明
字段 说明
apiVersion v1
kind Service
spec.type 类型:ClusterIP(默认)、NodePortLoadBalancer
spec.selector 匹配后端 Pod 的标签
spec.ports 端口映射:port(Service 端口)、targetPort(Pod 端口)
示例(ClusterIP)
yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80          # Service 监听端口
      targetPort: 80    # 转发到 Pod 的端口
示例(NodePort,外部可访问)
yaml 复制代码
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080  # 可选,范围 30000-32767

4. ConfigMap(非敏感配置)

存储配置数据,可挂载为文件或环境变量。

示例:从字面量创建
yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  LOG_LEVEL: "info"
  config.yaml: |
    port: 8080
    debug: false
在 Pod 中使用(作为环境变量)
yaml 复制代码
env:
  - name: LOG_LEVEL
    valueFrom:
      configMapKeyRef:
        name: app-config
        key: LOG_LEVEL

5. Secret(敏感信息)

存储密码、token 等,Base64 编码(不是加密!

示例(Opaque 类型)
yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=      # echo -n "admin" | base64
  password: MWYyZDFlMmU2N2Rm

🔐 实际使用中建议配合 kubectl create secret 命令生成,避免明文写入文件。


6. PersistentVolumeClaim(PVC,存储申请)

用户对持久化存储的"请求"。

示例
yaml 复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

在 Pod 中挂载:

yaml 复制代码
volumes:
- name: storage
  persistentVolumeClaim:
    claimName: my-pvc

三、编写 YAML 的最佳实践

  1. 使用 kubectl explain 查看字段说明

    复制代码
    kubectl explain deployment.spec.replicas
  2. 验证 YAML 语法

    ini 复制代码
    kubectl apply -f app.yaml --dry-run=client
  3. 标签(labels)要一致

    Deployment 的 selector.matchLabels 必须与 Pod 模板的 labels 完全匹配。

  4. 不要手动管理 Pod

    优先使用 Deployment、StatefulSet 等控制器。

  5. 敏感信息用 Secret,非敏感用 ConfigMap


四、完整示例:部署一个 Web 应用

yaml 复制代码
---
# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: nginx:1.25
        ports:
        - containerPort: 80
---
# Service
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  type: NodePort
  selector:
    app: web
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080

应用部署:

复制代码
kubectl apply -f web-app.yaml

访问:http://<NodeIP>:30080


五、附录:常用 apiVersion 对照表

资源类型 apiVersion
Pod, Service, ConfigMap, Secret v1
Deployment, DaemonSet, ReplicaSet apps/v1
Ingress networking.k8s.io/v1
PersistentVolumeClaim v1
Job batch/v1
CronJob batch/v1

📌 提示:YAML 对缩进和格式非常敏感!建议使用 VS Code + YAML 插件进行语法高亮和校验。


通过本教程,你应该能够理解 K8s YAML 的基本结构,并编写常见的资源定义。动手实践是掌握 K8s 的关键!

相关推荐
冰_河14 小时前
《Nginx核心技术》第11章:实现MySQL数据库的负载均衡
后端·nginx·架构
墨香幽梦客14 小时前
HTTPS/SSL证书全生命周期管理:从申请到续期的运维要点
运维·https·ssl
q***235714 小时前
使用 Nginx 搭建代理服务器(正向代理 HTTPS 网站)指南
运维·nginx·https
阿猿收手吧!14 小时前
【环境配置】vscode远程连接云服务器死机问题
运维·服务器
weixin_4365250714 小时前
SpringBoot 单体服务集成 Zipkin 实现链路追踪
java·spring boot·后端
q***783714 小时前
【玩转全栈】----Django制作部门管理页面
后端·python·django
java_logo14 小时前
NGINX WEBUI Docker 容器化部署指南
运维·nginx·docker·容器·centos·rabbitmq·运维开发
Yeats_Liao15 小时前
时序数据库系列(八):InfluxDB配合Grafana可视化
数据库·后端·grafana·时序数据库
q***465215 小时前
若依部署Nginx和Tomcat
运维·nginx·tomcat
行初心16 小时前
uos基础 dmesg 查看内核的实时日志
运维