Kubernetes (k8s) 的YAML 编写规范

发布于:2024-08-15 ⋅ 阅读:(145) ⋅ 点赞:(0)

目录

1. 基础结构

2. 缩进和格式

3. 命名规范

4. 字段填写

5. 数组和对象

6. 字段类型

7. 注释

8. 版本控制

9. 环境和秘密管理

10. 资源限制

11. 健康检查和探针

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 资源时,使用 --- 可以将这些资源分开,提高可读性和管理性。 

使用 --- 示例:

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

示例

# 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

参考文档


网站公告

今日签到

点亮在社区的每一天
去签到