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

参考文档

相关推荐
jonssonyan1 小时前
稳了,搭建Docker国内源图文教程
运维·docker·容器
福大大架构师每日一题1 小时前
16.2 k8s容器基础资源指标讲解
云原生·容器·kubernetes·prometheus
周湘zx1 小时前
k8s中的微服务
linux·运维·服务器·微服务·云原生·kubernetes
工业甲酰苯胺2 小时前
k8s 中的 Ingress 简介
云原生·容器·kubernetes
周湘zx3 小时前
k8s中的存储
linux·运维·云原生·容器·kubernetes
[听得时光枕水眠]3 小时前
【Docker】Docker上安装MySql8和Redis
运维·docker·容器
Xinan_____5 小时前
Linux——k8s认识
linux·运维·kubernetes
nvd116 小时前
K8S - Access Control 机制介绍
kubernetes
攸攸太上6 小时前
Docker学习
java·网络·学习·docker·容器
Sylvan Ding6 小时前
Docker+PyCharm远程调试&环境隔离解决方案
docker·容器·pycharm