spec
一、replicas
1.1 认识
replicas
:定义 Pod
的副本数量。 实际上, Deployment
的 spec.replicas
功能是由 ReplicaSet
提供的。 Deployment
会创建并管理一个或多个 ReplicaSet
, 由 ReplicaSet
负责维持 Pod
的副本数量。 replicas
或者 ReplicaSet
的作用如下:
-
自动恢复: 如果某个
Pod
因故障终止,Deployment
会通过其底层的ReplicaSet
自动重建新的Pod
,确保总数始终达到replicas
值。 -
水平扩展/收缩: 可以通过修改
spec.replicas
实现应用的 扩展(增加副本)或 收缩(减少副本)。适用于需要根据流量动态调整资源分配的场景。
1.2 语法
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
labels:
app: my-app
spec:
replicas: 3 # 定义希望运行的 Pod 副本数量
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
在上述配置中,Kubernetes
会确保集群中始终有 3
个与该 Deployment
匹配的 Pod
正在运行。
二、selector
在 Kubernetes
的 Deployment
中,selector
是一个核心属性,用于定义 Deployment
如何选择目标 Pod
进行管理和控制。selector
通过匹配 Pod
的标签(labels
),确保 Deployment
只管理符合条件的 Pod
,支持滚动更新、扩缩容、自愈等功能。selector
的作用:
-
选择目标
Pod
:Deployment
使用selector
匹配标签,决定哪些Pod
属于它的控制范围。 -
确保状态一致性:
Deployment
会监控符合selector
条件的Pod
,并确保它们与期望的状态一致。 -
动态管理
Pod
:通过selector
,Deployment
可以动态调整管理范围,例如扩缩容时创建新的Pod
或删除多余的Pod
。
在 Kubernetes Deployment
中,selector
是连接 Deployment
和 Pod
的桥梁,通过匹配标签来选择和管理 Pod
。配置正确的 selector
是 Deployment
正常工作的关键,特别是在处理滚动更新、扩缩容等任务时,selector
确保了资源的精确控制和高效管理。
2.1 语法
selector
使用 matchLabels
或 matchExpressions
定义筛选规则。
matchLabels
:简单的键值对匹配:
spec:
selector:
matchLabels:
app: nginx // `Deployment` 会管理所有带有 `app: nginx` 标签的 `Pod`。
matchExpressions
:支持更复杂的匹配条件,如 In
、NotIn
、Exists
等
spec:
selector:
matchExpressions:
- key: app
operator: In
values: ["nginx", "apache"] // Deployment 会管理标签中 app 的值为 nginx 或 apache 的 Pod。
2.2 规则
-
Pod
标签必须匹配selector
:selector
定义的标签必须与template.metadata.labels
一致,否则Deployment
不会管理这些Pod
。 -
Deployment
只能匹配符合条件的Pod
:Deployment
只控制匹配的Pod
,而不会管理超出范围的Pod
。 -
动态调整:如果
selector
匹配的Pod
增加或减少,Deployment
会自动更新其状态。 -
避免标签冲突:如果多个控制器(如
Deployment
和ReplicaSet
)使用相同的selector
,可能会导致控制权冲突。 -
升级或迁移时需谨慎修改
selector
: 一旦Deployment
创建后,selector
不能更改;否则会导致资源无法关联。
三、template
在 Kubernetes
的 Deployment
中,template
是定义 Pod
模板的关键部分,它指定了由 Deployment
创建和管理的 Pod
的详细配置。Deployment
使用 template
来描述 Pod
的规格,包括容器、标签、端口等。每次 Deployment
创建或更新 Pod
时,都会以 template
为蓝本。template
的作用:
-
定义
Pod
模板:template
是Pod
的一个模板,描述了Deployment
管理的Pod
的外观和行为。 -
关联
selector
标签:template
中的标签必须与selector
定义的标签一致,以确保Deployment
能正确管理这些Pod
。 -
支持动态更新:当
template
中的配置发生变化时,Deployment
会根据新模板滚动更新Pod
。
3.1 结构
template.metadata
: 用于定义 Pod
的元信息,包括 labels
和 annotations
。
-
template.metadata.labels
: 必须与Deployment
的selector.matchLabels
保持一致。 -
template.metadata.annotations
: 为Pod
添加额外的元数据
template.spec
: 描述 Pod
的具体行为和容器配置,包括容器镜像、端口、环境变量等。
3.2 语法
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template: # Pod 模板
metadata:
labels:
app: nginx # 必须与 selector.matchLabels 保持一致
spec: # Pod 的详细配置
containers:
- name: nginx
image: nginx:latest # 容器镜像
ports:
- containerPort: 80 # 容器暴露的端口
四、strategy
strategy
:定义更新策略,如 RollingUpdate
(默认)和 Recreate
。