Kubernetes Pod 创建
Pod 基本结构
一个典型的 Pod 定义文件(通常是 YAML 格式)包含以下主要字段:
apiVersion: v1
kind: Pod
metadata:
# 元数据部分
name: my-pod
namespace: default
labels:
app: my-app
tier: frontend
annotations:
description: "This is a test pod"
spec:
# 规格部分
containers:
- name: my-container
image: nginx:latest
# 容器相关配置...
# 其他 Pod 级别配置...
主要字段表格总结
字段分类 | 字段名称 | 类型 | 必填 | 描述 |
---|---|---|---|---|
基础字段 | apiVersion | string | 是 | API版本,Pod通常为v1 |
kind | string | 是 | 资源类型,此处为Pod |
|
metadata | metadata.name | string | 是 | Pod名称(命名空间内唯一) |
metadata.namespace | string | 否 | 所属命名空间,默认default |
|
metadata.labels | map | 否 | 键值对标签,用于选择识别 | |
metadata.annotations | map | 否 | 非标识性元数据,存储附加信息 | |
spec | spec.containers[] | list | 是 | 容器定义列表(至少1个) |
spec.initContainers[] | list | 否 | 初始化容器列表 | |
spec.restartPolicy | string | 否 | 重启策略(Always/OnFailure/Never) | |
spec.nodeSelector | map | 否 | 节点选择标签(键值对) | |
spec.affinity | object | 否 | 亲和性/反亲和性规则 | |
spec.tolerations[] | list | 否 | 容忍的污点列表 | |
spec.volumes[] | list | 否 | Pod级别存储卷定义 | |
containers[] | name | string | 是 | 容器名称 |
image | string | 是 | 容器镜像 | |
imagePullPolicy | string | 否 | 镜像拉取策略(Always/IfNotPresent/Never) | |
ports[] | list | 否 | 容器暴露的端口列表 | |
env[] | list | 否 | 环境变量列表 | |
resources | object | 否 | 资源请求和限制 | |
volumeMounts[] | list | 否 | 挂载到容器的卷 | |
livenessProbe | object | 否 | 存活探针配置 | |
readinessProbe | object | 否 | 就绪探针配置 |
较完整的 YAML 示例
# API版本声明
apiVersion: v1
# 资源类型声明
kind: Pod
# 元数据部分
metadata:
# Pod名称(在命名空间中必须唯一)
name: my-webapp
# 命名空间(不指定则使用default)
namespace: default
# 标签(用于选择器识别)
labels:
app: web
environment: production
tier: frontend
# 注解(存储非识别性元数据)
annotations:
owner: "dev-team"
build-version: "1.2.3"
# Pod规格定义(核心配置)
spec:
# 主容器列表(必须至少一个)
containers:
# 第一个容器定义
- name: web-container # 容器名称
image: nginx:1.19 # 容器镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略
# 端口配置
ports:
- name: http # 端口名称
containerPort: 80 # 容器内监听端口
protocol: TCP # 协议类型
# 资源限制
resources:
# 请求资源(调度依据)
requests:
cpu: "500m" # 0.5个CPU核心
memory: "512Mi" # 512MB内存
# 限制资源(运行上限)
limits:
cpu: "1" # 1个CPU核心
memory: "1Gi" # 1GB内存
# 环境变量
env:
- name: ENV_MODE # 变量名
value: "production" # 变量值
- name: DB_HOST
valueFrom:
configMapKeyRef: # 从ConfigMap获取
name: app-config
key: db.host
# 存活探针
livenessProbe:
httpGet: # HTTP检查方式
path: /healthz # 检查路径
port: 80 # 检查端口
initialDelaySeconds: 15 # 首次检查延迟(秒)
periodSeconds: 20 # 检查间隔(秒)
timeoutSeconds: 5 # 超时时间(秒)
failureThreshold: 3 # 失败阈值
# 就绪探针
readinessProbe:
tcpSocket: # TCP端口检查方式
port: 80
initialDelaySeconds: 5
periodSeconds: 10
# 存储卷挂载
volumeMounts:
- name: config-volume # 引用spec.volumes中的名称
mountPath: /etc/nginx/conf.d # 容器内挂载路径
readOnly: true # 是否只读
# 初始化容器(在主容器前运行)
initContainers:
- name: init-config
image: busybox:1.28
command: ['sh', '-c', 'echo Initializing... && sleep 5']
# Pod级别存储卷定义
volumes:
# ConfigMap类型卷
- name: config-volume
configMap:
name: nginx-config # ConfigMap名称
items: # 键映射配置
- key: nginx.conf
path: nginx.conf
# 临时空目录卷
- name: log-volume
emptyDir: {}
# 重启策略
restartPolicy: Always
# 节点选择器
nodeSelector:
disktype: ssd # 选择有disktype=ssd标签的节点
# 亲和性配置
affinity:
# Pod反亲和性(避免同类型Pod在同一节点)
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web
topologyKey: kubernetes.io/hostname
# 容忍配置
tolerations:
- key: "special" # 污点键
operator: "Exists" # 匹配方式
effect: "NoSchedule" # 污点效果
tolerationSeconds: 3600 # 容忍时间(秒)
直接创建 Pod
与通过 ReplicaSet
(RS)、ReplicationController
(RC) 或 Deployment
创建 Pod 的区别
在 Kubernetes 中,直接创建 Pod
与通过 ReplicaSet
(RS)、ReplicationController
(RC) 或 Deployment
创建 Pod 有显著区别,主要体现在生命周期管理、扩缩容、更新机制等方面。
1. 直接创建 Pod
(kind: Pod
)
特点:
- 一次性资源:直接创建的 Pod 是独立的,Kubernetes 不会自动管理其生命周期。
- 无自愈能力:如果 Pod 被删除或所在节点故障,不会自动重建(除非使用静态 Pod 或外部控制器)。
- 手动扩缩容:需要手动创建多个相同的 Pod 定义文件来实现副本。
- 直接更新:修改 Pod 定义后,必须手动删除旧 Pod 并创建新 Pod(无法滚动更新)。
适用场景:
- 临时调试或测试。
- 单次运行的批处理任务(通常更推荐使用
Job
)。 - 需要完全控制 Pod 生命周期的特殊场景。
示例:
apiVersion: v1
kind: Pod
metadata:
name: standalone-pod
spec:
containers:
- name: nginx
image: nginx:1.19
2. 通过 ReplicationController
(RC) 或 ReplicaSet
(RS) 创建 Pod
特点:
- 副本控制:确保指定数量的 Pod 副本始终运行(自动替换故障 Pod)。
- 扩缩容:通过修改
replicas
字段轻松调整副本数。 - 选择器匹配:通过
selector
匹配并管理 Pod(RS 支持更灵活的集合选择器)。 - 滚动更新:RC 不支持原生滚动更新,需手动操作;RS 通常由 Deployment 管理。
区别:
ReplicaSet
是ReplicationController
的升级版(支持matchExpressions
标签选择器)。- RC 已逐渐被 RS 和 Deployment 取代。
示例(ReplicaSet):
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-replicaset
spec:
replicas: 3 # 始终维护3个副本
selector: # 匹配Pod的标签
matchLabels:
app: nginx
template: # Pod模板
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19
3. 通过 Deployment
创建 Pod
特点:
- 声明式更新:支持滚动更新(RollingUpdate)、回滚(Rollback)和版本历史记录。
- 上层抽象:实际管理的是 ReplicaSet,由 ReplicaSet 再管理 Pod。
- 自动化:自动处理 Pod 的创建、删除、更新和扩缩容。
- 蓝绿/金丝雀发布:通过策略控制更新流程。
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
strategy:
type: RollingUpdate # 滚动更新策略
rollingUpdate:
maxSurge: 1 # 更新期间允许超出副本数的最大值
maxUnavailable: 0 # 更新期间允许不可用的副本数
核心区别对比表
特性 | 直接创建 Pod | ReplicaSet (RS) | Deployment |
---|---|---|---|
生命周期管理 | ❌ 无自动恢复 | ✅ 自动重建 Pod | ✅ 自动重建 Pod |
扩缩容 | ❌ 手动 | ✅ 通过 replicas 调整 |
✅ 通过 replicas 调整 |
滚动更新 | ❌ 需手动替换 | ❌ 需手动操作 | ✅ 原生支持 |
版本回滚 | ❌ 不支持 | ❌ 不支持 | ✅ 支持 |
选择器灵活性 | ❌ 不适用 | ✅ 支持 matchLabels /matchExpressions |
同 RS |
典型用途 | 临时任务、调试 | 需确保副本数的场景 | 生产环境应用部署 |
如何选择?
- 生产环境:始终使用
Deployment
(除非有特殊需求)。 - 需要副本保障:使用
ReplicaSet
或Deployment
。 - 单次任务:使用
Job
(批处理)或CronJob
(定时任务)。 - 临时调试:直接创建
Pod
(但更推荐kubectl run --rm -it
)。
注意:直接创建 Pod 的场景极少,大多数情况下应使用更高层次的抽象(如 Deployment)。
评论需开启科学上网!