【k8s】Kubernetes(K8s)YAML 配置文件

文章目录

  • [一、YAML 文件通用结构](#一、YAML 文件通用结构)
  • 二、常用资源类型详解
    • [1. Pod(最小调度单元)](#1. Pod(最小调度单元))
    • [2. Deployment(管理无状态应用)](#2. Deployment(管理无状态应用))
    • [3. Service(服务发现与负载均衡)](#3. Service(服务发现与负载均衡))
    • [4. ConfigMap(非敏感配置)](#4. ConfigMap(非敏感配置))
    • [5. Secret(敏感信息)](#5. Secret(敏感信息))
    • [6. PersistentVolumeClaim(PVC,存储申请)](#6. PersistentVolumeClaim(PVC,存储申请))
  • [三、编写 YAML 的最佳实践](#三、编写 YAML 的最佳实践)
    • [1.使用 kubectl explain 查看字段说明](#1.使用 kubectl explain 查看字段说明)
    • [2.验证 YAML 语法](#2.验证 YAML 语法)
    • 3.标签(labels)要一致
    • [4.不要手动管理 Pod](#4.不要手动管理 Pod)
    • [5.敏感信息用 Secret,非敏感用 ConfigMap](#5.敏感信息用 Secret,非敏感用 ConfigMap)
  • [四、完整示例:部署一个 Web 应用](#四、完整示例:部署一个 Web 应用)
  • [五、附录:常用 apiVersion 对照表](#五、附录:常用 apiVersion 对照表)
  • 六、总结

带你了解常见 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 容器列表,每个容器需指定 name 和 image
spec.containers.image 镜像地址(如 xxx.com/nginx:1.25)
spec.containers.ports 容器暴露的端口(仅声明,不发布)

示例

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-container
    image: xxx.com/nginx:1.25
    ports:
    - containerPort: 8080

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

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

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

字段说明

字段 说明
apiVersion apps/v1
kind Deploymentmet
adata.name Deployment 名称
spec.replicas 期望的 Pod 副本数(默认 1)
spec.selector.matchLabels 选择器,匹配 Pod 的标签
spec.templatePod 模板(内容与 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: xxx.com/nginx:1.25
        ports:
        - containerPort: 8080

✅ selector.matchLabels 和 template.metadata.labels 必须匹配,否则创建失败!

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

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

字段说明

字段 说明
apiVersion v1
kind Service
spec.type 类型:ClusterIP(默认)、NodePort、LoadBalancer
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=1      # echo -n "admin" | base64
  password: MWYyZDFlMmU2N2Rm1

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

6. PersistentVolumeClaim(PVC,存储申请)

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

示例

yaml 复制代码
yaml 体验AI代码助手 代码解读复制代码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 查看字段说明

yaml 复制代码
kubectl explain deployment.spec.replicas

2.验证 YAML 语法

yaml 复制代码
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

应用部署:

yaml 复制代码
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 的基本结构,并编写常见的资源定义。多练习实际去操作。

相关推荐
zybsjn2 小时前
【实战】如何在docker中访问宿主主机的api服务
docker
岳来2 小时前
docker 容器的标准输入输出
docker·stdin·stdout
理智的煎蛋3 小时前
单节点 K8S IP 修改步骤
tcp/ip·云原生·容器·kubernetes
无痕melody3 小时前
allinssl自动申请部署飞牛域名ssl证书
docker
眠りたいです3 小时前
Docker:Docker Volume存储卷-宿主机与容器的数据双向交流通道
运维·docker·中间件·容器
破烂pan3 小时前
企业级 Docker 运维命令速查表
运维·docker
Samson Bruce3 小时前
【docker swarm】
java·docker·eureka
幺零九零零4 小时前
Docker底层-Namespaces(网络隔离)
网络·docker·容器
隔壁阿布都4 小时前
Docker 离线安装 GitLab 完整步骤
docker·gitlab