Pod YAML 配置
学习目标
- 理解 Pod YAML 的基本结构
- 掌握常用配置字段
- 能够编写简单的 Pod 配置文件
核心概念
YAML 基本结构
apiVersion: v1 # API 版本
kind: Pod # 资源类型
metadata: # 元数据
name: my-pod
namespace: default
labels:
app: web
spec: # 规格定义
containers:
- name: nginx
image: nginx:latest
四个顶级字段
| 字段 | 说明 | 必填 |
|---|---|---|
| apiVersion | Kubernetes API 版本 | 是 |
| kind | 资源类型 | 是 |
| metadata | 资源元数据 | 是 |
| spec | 资源规格定义 | 是 |
Metadata 常用字段
metadata:
name: my-pod # Pod 名称(必填)
namespace: default # 命名空间(默认 default)
labels: # 标签(键值对)
app: web
env: production
annotations: # 注解(键值对)
description: "Web server"
| 字段 | 说明 | 用途 |
|---|---|---|
| name | 资源名称 | 唯一标识 |
| namespace | 命名空间 | 资源隔离 |
| labels | 标签 | 选择、过滤 |
| annotations | 注解 | 附加信息 |
Spec 容器配置
spec:
containers:
- name: nginx # 容器名称(必填)
image: nginx:1.24 # 镜像(必填)
ports: # 端口声明
- containerPort: 80
env: # 环境变量
- name: ENV
value: production
resources: # 资源限制
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
容器镜像配置
image: nginx:latest # 完整镜像地址
imagePullPolicy: Always # 镜像拉取策略
| 拉取策略 | 说明 |
|---|---|
| Always | 总是拉取(默认 latest) |
| IfNotPresent | 本地没有才拉取(默认非 latest) |
| Never | 从不拉取,只用本地 |
端口配置
ports:
- name: http # 端口名称(可选)
containerPort: 80 # 容器端口(必填)
protocol: TCP # 协议(默认 TCP)
环境变量
env:
# 直接定义
- name: ENV
value: production
# 从 ConfigMap 读取
- name: CONFIG
valueFrom:
configMapKeyRef:
name: my-config
key: config.yaml
# 从 Secret 读取
- name: PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
资源限制
resources:
requests: # 最小保证资源
memory: "64Mi"
cpu: "250m"
limits: # 最大可用资源
memory: "128Mi"
cpu: "500m"
| 单位 | 说明 | 示例 |
|---|---|---|
| Mi | 兆字节 | 64Mi = 64MB |
| m | 毫核 | 1000m = 1 CPU |
完整示例
apiVersion: v1
kind: Pod
metadata:
name: web-server
namespace: default
labels:
app: web
env: production
spec:
containers:
- name: nginx
image: nginx:1.24
ports:
- name: http
containerPort: 80
env:
- name: ENV
value: production
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
多容器 Pod 示例
apiVersion: v1
kind: Pod
metadata:
name: multi-container
spec:
containers:
# 主容器
- name: web
image: nginx
ports:
- containerPort: 80
# Sidecar 容器
- name: log-agent
image: fluentd
volumeMounts:
- name: logs
mountPath: /var/log/nginx
volumes:
- name: logs
emptyDir: {}
Pod 级别配置
spec:
# 重启策略
restartPolicy: Always
# DNS 策略
dnsPolicy: ClusterFirst
# 节点选择器
nodeSelector:
disk: ssd
# 容忍度
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
实践练习
练习 1:基础 YAML
编写一个 Pod YAML,要求:
- 名称:my-nginx
- 镜像:nginx:1.24
- 端口:80
- 标签:app=web
练习 2:资源限制
为练习 1 的 Pod 添加资源限制:
- 内存请求:64Mi,限制:128Mi
- CPU 请求:250m,限制:500m
练习 3:环境变量
为练习 1 的 Pod 添加环境变量:
- ENV=production
- LOG_LEVEL=info
练习 4:多容器
编写一个包含两个容器的 Pod:
- 容器 1:nginx (端口 80)
- 容器 2:redis (端口 6379)
常见误解
1. YAML 缩进
错误:使用 Tab 缩进
正确:使用空格缩进(通常 2 个空格)
YAML 不支持 Tab,必须使用空格
2. 字符串引号
错误:数字不加引号导致类型错误
正确:
- port: "80" # 字符串
- replicas: 3 # 数字
带冒号或特殊字符的字符串必须加引号
小结
| 要点 | 说明 |
|---|---|
| 基本结构 | apiVersion + kind + metadata + spec |
| metadata | name、namespace、labels、annotations |
| containers | name、image、ports、env、resources |
| 镜像策略 | Always / IfNotPresent / Never |
| 资源单位 | Mi (内存)、m (CPU) |
| 多容器 | 共享网络和存储卷 |
练习编辑器
bash
Loading...