【K8s】YAML文件编写实战:从语法到多资源编排实例 📅 2026/7/15 6:49:43 1. YAML语法基础K8s资源配置的基石第一次接触K8s的YAML文件时我被那些缩进和冒号搞得晕头转向。但后来发现只要掌握几个核心规则YAML其实比JSON更易读。最典型的例子是定义Pod时用YAML能清晰表达层级关系而JSON会显得冗长。缩进规则是YAML最需要警惕的陷阱。我踩过的坑是误用Tab键缩进——必须使用空格建议用2个空格作为标准缩进量。比如定义容器镜像时containers: - name: nginx image: nginx:1.19三种核心结构需要重点掌握键值对Maps用冒号分隔键值metadata: name: my-pod列表Lists用短横线开头ports: - containerPort: 80 - containerPort: 443复合结构列表中的键值对env: - name: DB_HOST value: mysql实际编写时会遇到几个高频问题字符串引号使用包含特殊字符时必须加引号args: [--config/etc/nginx/conf.d/default.conf]多行文本用|保留换行或折叠换行command: | /bin/sh -c echo Hello Kubernetes2. K8s核心资源字段解析2.1 元数据metadata设计规范metadata就像资源的身份证我习惯先定义这三个字段metadata: name: frontend # 同一命名空间内唯一 namespace: prod # 环境隔离关键字段 labels: # 最常用的筛选标识 app: web-store tier: frontend**标签labels**的使用技巧遵循前缀/名称格式如app.kubernetes.io/name: mysql通过kubectl get pods -l tierfrontend快速过滤资源避免使用特殊字符尽量用中划线替代下划线2.2 规格spec配置精髓spec是资源的核心配置区不同资源类型差异较大。以Deployment为例spec: replicas: 3 # 副本数 selector: # 必须与template中的labels匹配 matchLabels: app: nginx template: # Pod模板 spec: containers: - name: nginx image: nginx:1.19 resources: limits: cpu: 500m memory: 512Mi**资源限制resources**配置建议CPU单位1000m1核500m0.5核内存单位Mi兆字节比MB更精确生产环境务必设置limits防止单个Pod耗尽节点资源3. 多资源编排实战Web应用完整示例3.1 前端后端数据库的编排设计下面这个电商应用编排案例是我在真实项目中优化过的配置。关键点在于前端Frontend用Deployment部署通过Service暴露后端API需要连接数据库数据库MySQL使用StatefulSet保证数据持久化# frontend-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: frontend spec: replicas: 3 selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - name: nginx image: nginx:1.19 ports: - containerPort: 80 env: - name: API_URL value: http://api-service:8080 --- # api-service.yaml apiVersion: v1 kind: Service metadata: name: api-service spec: selector: app: api ports: - protocol: TCP port: 8080 targetPort: 80803.2 跨资源依赖处理技巧服务发现是编排的核心挑战。通过K8s DNS实现的自动发现同一命名空间内service-name跨命名空间service-name.namespace.svc.cluster.local配置注入的三种方式对比环境变量适合简单配置env: - name: DB_HOST value: mysql-serviceConfigMap管理配置文件volumes: - name: config configMap: name: app-configSecret敏感信息加密env: - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password4. 高级编排技巧与调试方法4.1 资源依赖控制通过initContainers实现启动顺序控制spec: initContainers: - name: wait-for-db image: busybox command: [sh, -c, until nc -z mysql-service 3306; do sleep 2; done] containers: - name: app image: my-app:1.0健康检查配置示例livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 30 # 容器启动后等待时间 periodSeconds: 10 # 检查间隔4.2 调试与验证工具kubectl dry-run验证YAML有效性kubectl apply -f deployment.yaml --dry-runclient字段说明查询超实用kubectl explain deployment.spec.template.spec.containers常见错误排查经验镜像拉取失败检查imagePullPolicy和镜像仓库权限Pod卡在Pending状态kubectl describe pod查看事件服务无法访问检查Service的selector是否匹配Pod标签