YAML 在运维(DevOps、SRE、自动化、云原生)场景中使用非常广泛,下面从设计、编写、管理、安全、可维护性等角度,系统性地总结 YAML 运维最佳实践。
✅ 正确认知:
YAML = 声明式配置,不是脚本
server:
host: 127.0.0.1
port: 8080
❌ 错误示例:
server:
host: 127.0.0.1 # 4 空格
YAML 会自动推断类型,容易出 Bug:
# 危险
port: 8080 # 看起来像数字
enable: no # 会被解析为 false
version: 1.10 # 可能被解析为 1.1
✅ 推荐写法:
port: "8080"
enable: false
version: "1.10"
| 写法 | 行为 |
|---|---|
> |
折叠成一行 |
| ` | ` |
description: >
这是一个很长的描述,
会被合并成一行。
script: |
#!/bin/bash
echo "hello"
❌ 不推荐:
deployment:
...
service:
...
configmap:
...
✅ 推荐拆分:
deployment.yaml
service.yaml
config.yaml
适合静态重复配置:
defaults: &defaults
timeout: 30
retries: 3
service_a:
<<: *defaults
name: a
service_b:
<<: *defaults
name: b
⚠️ 不建议过度使用,影响可读性
❌ 不推荐:
image: myapp:20240101
✅ 推荐:
image: "{{ .Values.image }}:{{ .Values.tag }}"
✅ 推荐流程:
Git → CI → 自动校验 → 自动部署
使用工具避免低级错误:
| 场景 | 工具 |
|---|---|
| Kubernetes | kubeval, kubectl --dry-run |
| Ansible | ansible-lint |
| 通用 YAML | yamllint |
yamllint deployment.yaml
kubectl apply --dry-run=client -f deployment.yaml
❌ 禁止:
password: admin123
✅ 正确方式:
Secretansible-vaultpassword:
valueFrom:
secretKeyRef:
name: db-secret
privileged: truehostNetwork / hostPathapiVersion: apps/v1
kind: Deployment
metadata:
name: app
namespace: default
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
dev/
test/
prod/
✅ 手写 YAML 只用于最终产物或调试
| 反模式 | 问题 |
|---|---|
| 一个 YAML 几千行 | 不可维护 |
| 大量重复配置 | 易出错 |
| 手动改线上 YAML | 不可追溯 |
| 用 YAML 写逻辑 | 可读性差 |
| 明文存密钥 | 安全风险 |
| 类型 | 工具 |
|---|---|
| 校验 | yamllint, kubeval |
| 模板 | Helm, Kustomize |
| 安全 | kubesec, trivy |
| GitOps | ArgoCD, Flux |
| 调试 | yq |
YAML 运维最佳实践 = 可读 + 可校验 + 可版本化 + 不存敏感 + 模板化 + 自动化
如果你愿意,我可以:
只要告诉我你的具体场景即可。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。