1. Kubernetes资源清单入门指南
刚接触Kubernetes时,最让我困惑的就是那些YAML文件——它们看起来简单,但实际写起来总是报错。资源清单(Manifest)是Kubernetes世界的"施工图纸",它用声明式语法告诉集群你想要什么样的资源状态。经过多次实践后,我总结出这套新手也能快速上手的资源清单编写方法。
2. 核心概念解析
2.1 什么是资源清单
资源清单本质上是YAML或JSON格式的文本文件,用于定义Kubernetes对象(如Pod、Service等)的期望状态。与命令式操作不同,你不需要告诉Kubernetes"如何做",只需声明"想要什么"。
2.2 基础结构剖析
每个资源清单都包含以下必填字段:
apiVersion: v1 # API版本 kind: Pod # 资源类型 metadata: # 元数据 name: my-pod spec: # 期望状态 containers: - name: nginx image: nginx:1.14.2注意:缩进必须使用空格而非Tab,这是YAML的硬性要求。我建议用2个空格作为缩进单位。
3. 完整资源清单编写实战
3.1 Pod资源示例
下面是一个典型的Pod清单,包含了我实际项目中积累的实用配置:
apiVersion: v1 kind: Pod metadata: name: web-server labels: app: nginx env: prod spec: containers: - name: nginx image: nginx:1.19.0 ports: - containerPort: 80 resources: requests: cpu: "500m" memory: "512Mi" limits: cpu: "1" memory: "1Gi" env: - name: NGINX_ENV value: "production" restartPolicy: Always关键参数说明:
resources.requests:容器启动的最低资源需求resources.limits:容器能使用的资源上限env:设置容器环境变量(SpringBoot应用常用)
3.2 Deployment进阶配置
对于生产环境,我强烈建议使用Deployment而非直接创建Pod:
apiVersion: apps/v1 kind: Deployment metadata: name: frontend spec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: nginx image: nginx:1.19.0 ports: - containerPort: 80 livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 15 periodSeconds: 20这个配置包含几个生产级特性:
- 多副本(replicas: 3)保证高可用
- livenessProbe实现健康检查
- selector确保Pod标签匹配
4. 环境变量管理技巧
4.1 基础环境变量配置
在SpringBoot等应用中,环境变量配置尤为关键:
env: - name: JAVA_OPTS value: "-Xmx512m -Xms256m" - name: SPRING_PROFILES_ACTIVE value: "prod" - name: DB_URL valueFrom: secretKeyRef: name: db-secret key: connection-string4.2 安全敏感信息处理
永远不要将密码等敏感信息直接写在清单中!应该使用Secret:
# 先创建Secret kubectl create secret generic db-secret \ --from-literal=username=admin \ --from-literal=password='S!B\*d$zDsb='然后在清单中引用:
env: - name: DB_USERNAME valueFrom: secretKeyRef: name: db-secret key: username - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password5. 常见问题排查指南
5.1 格式验证与调试
我常用的诊断命令:
# 验证YAML语法 kubectl apply -f pod.yaml --dry-run=client # 查看详细错误 kubectl describe pod/pod-name # 查看容器日志 kubectl logs pod-name -c container-name5.2 典型错误案例
镜像拉取失败:
- 错误现象:
ErrImagePull或ImagePullBackOff - 解决方法:检查镜像名称拼写,确保镜像仓库可访问
- 错误现象:
CrashLoopBackOff:
- 通常表示容器启动后立即退出
- 使用
kubectl logs查看应用日志
Pending状态:
- 资源不足或节点选择器不匹配
- 使用
kubectl describe查看事件详情
6. 高级技巧与最佳实践
6.1 资源请求与限制配置
CPU单位说明:
1= 1个vCPU/core500m= 0.5个vCPU100m= 0.1个vCPU
内存单位:
1Gi= 1024Mi512Mi= 512MB1G≠ 1Gi(前者是1000进制,后者是1024进制)
6.2 使用ConfigMap管理配置
对于复杂配置,推荐使用ConfigMap:
# 从文件创建ConfigMap kubectl create configmap nginx-config \ --from-file=nginx.conf=./nginx.conf在Pod中挂载:
volumes: - name: config-volume configMap: name: nginx-config containers: - name: nginx volumeMounts: - name: config-volume mountPath: /etc/nginx6.3 多容器Pod设计
一个Pod内可以运行多个紧密关联的容器:
containers: - name: web image: nginx - name: log-collector image: fluentd volumeMounts: - name: logs mountPath: /var/log/nginx volumes: - name: logs emptyDir: {}这种模式常用于边车(Sidecar)容器场景,如日志收集、服务网格等。
7. 工具链推荐
7.1 编辑器插件
- VS Code:Kubernetes插件 + YAML扩展
- IntelliJ IDEA:Kubernetes插件
7.2 校验工具
- kubeval:离线验证YAML文件
- kubectl neat:清理自动生成的字段
7.3 模板生成
# 快速生成模板 kubectl create deploy nginx --image=nginx --dry-run=client -o yaml > deploy.yaml8. 生产环境注意事项
- 资源限制:必须设置requests和limits,防止单个Pod耗尽节点资源
- 标签规范:制定统一的标签策略(如app/env/version)
- 版本控制:所有清单文件必须纳入Git管理
- 变更流程:任何修改都应通过CI/CD流水线
我在实际运维中发现,合理的资源限制可以避免80%的稳定性问题。比如Java应用建议:
resources: requests: memory: "1Gi" cpu: "500m" limits: memory: "2Gi" cpu: "2"这样的配置既保证了应用有足够资源启动,又防止内存泄漏时影响整个节点。