Kubernetes (k8s) 的YAML 编写规范

目录

[1. 基础结构](#1. 基础结构)

[2. 缩进和格式](#2. 缩进和格式)

[3. 命名规范](#3. 命名规范)

[4. 字段填写](#4. 字段填写)

[5. 数组和对象](#5. 数组和对象)

[6. 字段类型](#6. 字段类型)

[7. 注释](#7. 注释)

[8. 版本控制](#8. 版本控制)

[9. 环境和秘密管理](#9. 环境和秘密管理)

[10. 资源限制](#10. 资源限制)

[11. 健康检查和探针](#11. 健康检查和探针)

[12. 使用 ---](#12. 使用 ---)

示例

参考文档


1. 基础结构

  • apiVersion : 定义使用的 API 版本,如 v1, apps/v1, batch/v1
  • kind : 资源的类型,如 Pod, Service, Deployment, ConfigMap
  • metadata: 资源的元数据,包括名称、命名空间、标签等。
  • spec: 描述资源的期望状态。具体字段取决于资源类型。

2. 缩进和格式

  • 缩进: 使用两个空格进行缩进,避免使用制表符(Tab)。
  • 格式 : 确保字段名称后跟 :,字段值与字段名在同一行,多个项用 - 分隔。

3. 命名规范

  • 名称: 资源名称应具有描述性并且符合命名规范(小写字母、数字和连字符),避免使用特殊字符。
  • 标签和注解 : 使用标签(labels)和注解(annotations)来组织和标识资源。标签应符合 key: value 格式,并且使用统一的命名约定。

4. 字段填写

  • metadata:

    • name: 资源的名称,必须唯一。
    • namespace : 资源所在的命名空间,省略时默认为 default
    • labels: 适用于选择器,使用有意义的键值对。
    • annotations: 用于存储附加信息。
  • spec:

    • replicas : 对于 DeploymentStatefulSet 等,指定副本数量。
    • selector: 用于选择匹配特定标签的资源。
    • template : 在 DeploymentStatefulSet 中定义 Pod 模板。

5. 数组和对象

  • 数组 : 使用 - 表示数组项,确保数组项对齐。
  • 对象: 对象内字段应按字母顺序排列,以提高可读性(可选)。

6. 字段类型

  • 字符串 : 使用引号("')包围复杂的字符串或包含特殊字符的字符串。
  • 数字: 直接写数字,不需要引号。
  • 布尔值 : 使用 truefalse,注意大小写。

7. 注释

  • 注释 : 使用 # 进行注释,确保注释简洁且具有描述性。

8. 版本控制

  • 版本管理 : 使用适当的 apiVersion 和资源类型版本,以确保兼容性和功能支持。

9. 环境和秘密管理

  • ConfigMap: 用于存储配置信息。
  • Secret: 用于存储敏感信息,使用 base64 编码来存储数据。

10. 资源限制

  • 资源请求和限制 : 在 spec 中为容器设置资源请求(requests)和限制(limits),以便 Kubernetes 能够合理调度资源。

11. 健康检查和探针

  • Liveness Probe: 用于检查容器是否仍然运行。
  • Readiness Probe: 用于检查容器是否准备好接受流量。

12. 使用 ---

作用 : --- 是 YAML 的文档分隔符,用于分隔一个 YAML 文件中的多个文档或资源。

单文档文件 : 如果你的 YAML 文件只包含一个 Kubernetes 资源,则可以省略 ---。这在大多数情况下是完全可以接受的。

自动处理 : Kubernetes 的命令行工具(如 kubectl)可以处理没有 --- 的单一文档文件,而不会受到影响。

适用场景 : 当你需要在同一个文件中定义多个 Kubernetes 资源时,使用 --- 可以将这些资源分开,提高可读性和管理性。

使用 --- 示例:

TypeScript 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - name: container1
    image: nginx

---

apiVersion: v1
kind: Service
metadata:
  name: service1
spec:
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

示例

TypeScript 复制代码
# Deployment 配置
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  labels:
    app: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: nginx:1.21
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /healthz
            port: 80
          initialDelaySeconds: 30
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /readiness
            port: 80
          initialDelaySeconds: 10
          timeoutSeconds: 5

---
# Service 配置
apiVersion: v1
kind: Service
metadata:
  name: my-service
  labels:
    app: my-app
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

---
# ConfigMap 配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
  labels:
    app: my-app
data:
  key1: value1
  key2: value2

参考文档

相关推荐
问简1 天前
docker 镜像相关
运维·docker·容器
Benszen1 天前
Docker容器化技术实战指南
运维·docker·容器
Hommy881 天前
【开源剪映小助手】Docker 部署
docker·容器·开源·github·aigc
斯普信云原生组1 天前
Prometheus 环境监控虚机 Redis 方案(生产实操版)
运维·docker·容器
喵了几个咪1 天前
如何在 Superset Docker 容器中安装 MySQL 驱动
mysql·docker·容器·superset
工具罗某人1 天前
docker compose部署kafka集群搭建
docker·容器·kafka
❀͜͡傀儡师1 天前
k8s部署的Nexus 3 数据库损坏恢复指南:从删除损坏数据库到完整数据重建
数据库·kubernetes·nexus3
开心码农1号1 天前
k8s中service和ingress的区别和使用
云原生·容器·kubernetes
张3231 天前
K8s 不部署源代码、不构建应用
kubernetes
L1624761 天前
Kubernetes 完整学习手册(1 主多从 + 纯 YAML 部署 + 访问原理)
学习·容器·kubernetes