跳到主要内容

spec

2024年11月13日
柏拉文
越努力,越幸运

一、replicas


1.1 认识

replicas:定义 Pod 的副本数量。 实际上, Deploymentspec.replicas 功能是由 ReplicaSet 提供的。 Deployment 会创建并管理一个或多个 ReplicaSet, 由 ReplicaSet 负责维持 Pod 的副本数量。 replicas 或者 ReplicaSet 的作用如下:

  1. 自动恢复: 如果某个 Pod 因故障终止,Deployment 会通过其底层的 ReplicaSet 自动重建新的 Pod,确保总数始终达到 replicas 值。

  2. 水平扩展/收缩: 可以通过修改 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


KubernetesDeployment 中,selector 是一个核心属性,用于定义 Deployment 如何选择目标 Pod 进行管理和控制。selector 通过匹配 Pod 的标签(labels),确保 Deployment 只管理符合条件的 Pod,支持滚动更新、扩缩容、自愈等功能。selector 的作用:

  • 选择目标 PodDeployment 使用 selector 匹配标签,决定哪些 Pod 属于它的控制范围。

  • 确保状态一致性Deployment 会监控符合 selector 条件的 Pod,并确保它们与期望的状态一致。

  • 动态管理 Pod:通过 selectorDeployment 可以动态调整管理范围,例如扩缩容时创建新的 Pod 或删除多余的 Pod

Kubernetes Deployment 中,selector 是连接 DeploymentPod 的桥梁,通过匹配标签来选择和管理 Pod。配置正确的 selectorDeployment 正常工作的关键,特别是在处理滚动更新、扩缩容等任务时,selector 确保了资源的精确控制和高效管理。

2.1 语法

selector 使用 matchLabelsmatchExpressions 定义筛选规则。

matchLabels:简单的键值对匹配:

spec:
selector:
matchLabels:
app: nginx // `Deployment` 会管理所有带有 `app: nginx` 标签的 `Pod`。

matchExpressions:支持更复杂的匹配条件,如 InNotInExists

spec:
selector:
matchExpressions:
- key: app
operator: In
values: ["nginx", "apache"] // Deployment 会管理标签中 app 的值为 nginx 或 apache 的 Pod。

2.2 规则

  1. Pod 标签必须匹配 selector: selector 定义的标签必须与 template.metadata.labels 一致,否则 Deployment 不会管理这些 Pod

  2. Deployment 只能匹配符合条件的 PodDeployment 只控制匹配的 Pod,而不会管理超出范围的 Pod

  3. 动态调整:如果 selector 匹配的 Pod 增加或减少,Deployment 会自动更新其状态。

  4. 避免标签冲突:如果多个控制器(如 DeploymentReplicaSet)使用相同的 selector,可能会导致控制权冲突。

  5. 升级或迁移时需谨慎修改 selector: 一旦 Deployment 创建后,selector 不能更改;否则会导致资源无法关联。

三、template


KubernetesDeployment 中,template 是定义 Pod 模板的关键部分,它指定了由 Deployment 创建和管理的 Pod 的详细配置。Deployment 使用 template 来描述 Pod 的规格,包括容器、标签、端口等。每次 Deployment 创建或更新 Pod 时,都会以 template 为蓝本。template 的作用:

  1. 定义 Pod 模板templatePod 的一个模板,描述了 Deployment 管理的 Pod 的外观和行为。

  2. 关联 selector 标签template 中的标签必须与 selector 定义的标签一致,以确保 Deployment 能正确管理这些 Pod

  3. 支持动态更新:当 template 中的配置发生变化时,Deployment 会根据新模板滚动更新 Pod

3.1 结构

template.metadata: 用于定义 Pod 的元信息,包括 labelsannotations

  • template.metadata.labels: 必须与 Deploymentselector.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