k8s主要控制器简述(一)ReplicaSet与Deployment

发布于:2025-03-20 ⋅ 阅读:(13) ⋅ 点赞:(0)

目录

一、ReplicaSet

关键特性

示例

解释

支持的 Operator

二、Deployment

1. 声明式更新

示例

2. 滚动更新

示例

3. 回滚

示例

4. ReplicaSet 管理

示例

5. 自动恢复

示例

6. 扩展和缩容

示例

示例


一、ReplicaSet

ReplicaSet 是 Kubernetes 中的一个核心控制器,用于确保指定数量的 Pod 副本始终处于运行状态。它的主要职责是维护一组稳定的 Pod 副本,确保在任何时候都有指定数量的 Pod 在运行。ReplicaSet 是 Kubernetes 中实现 Pod 水平扩展的基础组件之一。

关键特性
  1. 副本管理

    • ReplicaSet 的核心功能是确保指定数量的 Pod 副本始终在运行。你可以通过 replicas 字段指定期望的 Pod 副本数量。

    • 如果实际运行的 Pod 数量少于预期,ReplicaSet 会自动创建新的 Pod。

    • 如果实际运行的 Pod 数量多于预期,ReplicaSet 会自动删除多余的 Pod。

  2. 标签选择器(Label Selector)

    • ReplicaSet 使用标签选择器来识别它管理的 Pod。只有那些与选择器匹配的 Pod 才会被 ReplicaSet 管理。

    • 标签选择器可以是简单的等值匹配(matchLabels),也可以是更复杂的集合匹配(matchExpressions)。

  3. Pod 模板

    • ReplicaSet 使用 Pod 模板来创建新的 Pod。Pod 模板定义了 Pod 的规格,包括容器镜像、环境变量、卷等。

    • 当 ReplicaSet 需要创建新的 Pod 时,它会根据 Pod 模板生成新的 Pod 实例。

  4. 自动恢复

    • 如果某个 Pod 意外终止(例如,节点故障或手动删除),ReplicaSet 会自动创建一个新的 Pod 来替换它,以确保 Pod 副本数量始终符合预期。

  5. 手动管理

    • ReplicaSet 通常不直接由用户创建和管理,而是通过更高级的控制器(如 Deployment)来管理。用户通常只需要与 Deployment 交互,Deployment 会自动创建和管理 ReplicaSet。

示例

以下是一个简单的 ReplicaSet 定义示例:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: nginx

在这个示例中:

  • replicas: 3 表示期望有 3 个 Pod 副本在运行。

  • selector 指定了 ReplicaSet 管理的 Pod 的标签为 app: my-app

  • template 定义了 Pod 的规格,包括容器镜像 nginx

以下是一个使用几个匹配的ReplicaSet实例

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replicaset
spec:
  replicas: 3
  selector:
    matchExpressions:
      - key: app
        operator: In
        values:
          - my-app
          - my-backup-app
      - key: environment
        operator: NotIn
        values:
          - production
  template:
    metadata:
      labels:
        app: my-app
        environment: staging
    spec:
      containers:
      - name: my-container
        image: nginx

解释

  1. selector.matchExpressions

  • 这是集合匹配的核心部分,允许你定义多个标签选择规则。
  • 每个规则由 keyoperatorvalues 组成。
  1. 规则 1:app 标签
  • key: app:表示选择标签键为 app 的 Pod。
  • operator: In:表示标签值必须在 values 列表中。
  • values: [my-app, my-backup-app]:表示选择标签值为 my-appmy-backup-app 的 Pod。
  1. 规则 2:environment 标签

  • key: environment:表示选择标签键为 environment 的 Pod。
  • operator: NotIn:表示标签值不能出现在 values 列表中。
  • values: [production]:表示排除标签值为 production 的 Pod。
  1. 综合效果

    • 这个 ReplicaSet 会选择满足以下条件的 Pod:

      • 标签 app 的值为 my-appmy-backup-app

      • 标签 environment 的值不为 production

  2. Pod 模板

    • template 部分,定义了新创建的 Pod 的标签为 app: my-appenvironment: staging

    • 这些标签满足 ReplicaSet 的选择条件,因此这些 Pod 会被 ReplicaSet 管理。

支持的 Operator

matchExpressions 中,operator 可以取以下值:

  • In:标签值必须在 values 列表中。

  • NotIn:标签值不能在 values 列表中。

  • Exists:标签键必须存在(不需要指定 values)。

  • DoesNotExist:标签键必须不存在(不需要指定 values)。

二、Deployment

Deployment 是 Kubernetes 中用于管理无状态应用的高级控制器。它基于 ReplicaSet 实现,提供了声明式更新、滚动更新和回滚等功能。Deployment 是 Kubernetes 中最常用的控制器之一,特别适用于需要频繁更新和扩展的应用场景。

1. 声明式更新

Deployment 允许你通过声明式的方式更新应用。你只需要修改 Deployment 的 YAML 文件(例如更新镜像版本),然后使用 kubectl apply 命令应用更改,Deployment 会自动处理更新过程。

示例

假设你有一个 Deployment,运行的是 nginx:1.18 镜像。现在你想将镜像更新为 nginx:1.19

Deployment 定义文件 (deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: nginx
        image: nginx:1.18

更新步骤

  1. 修改 deployment.yaml 文件,将 image: nginx:1.18 改为 image: nginx:1.19

  2. 使用 kubectl apply 应用更新:

    kubectl apply -f deployment.yaml
  3. Deployment 会自动触发更新流程,逐步替换旧的 Pod 为新的 Pod。


2. 滚动更新

Deployment 默认支持滚动更新策略,逐步替换旧的 Pod 副本为新的 Pod 副本,确保应用在更新过程中不会中断。

示例

以下是一个配置了滚动更新策略的 Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: nginx
        image: nginx:1.19
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1  # 更新过程中最多允许 1 个 Pod 不可用
      maxSurge: 1        # 更新过程中最多允许超出预期副本数 1 个 Pod

更新过程

  • Deployment 会先启动一个新的 Pod,然后终止一个旧的 Pod,逐步替换所有 Pod。

  • 通过 maxUnavailablemaxSurge,你可以控制更新的速度和可用性。


3. 回滚

如果更新过程中出现问题,Deployment 允许你回滚到之前的版本。

示例

假设你更新了 Deployment,但新版本的应用有问题,需要回滚到上一个版本。

回滚步骤

  1. 查看 Deployment 的更新历史:

    kubectl rollout history deployment/my-deployment

    输出示例:

    REVISION  CHANGE-CAUSE
    1         <none>
    2         Update image to nginx:1.19

  2. 回滚到上一个版本:

    kubectl rollout undo deployment/my-deployment

  3. 回滚到指定版本(例如回滚到 Revision 1):

    kubectl rollout undo deployment/my-deployment --to-revision=1


4. ReplicaSet 管理

Deployment 通过创建和管理 ReplicaSet 来实现 Pod 的副本管理。每次更新 Pod 模板时,Deployment 都会创建一个新的 ReplicaSet,并逐步将旧的 ReplicaSet 缩容。

示例

假设你有一个 Deployment,初始版本使用 nginx:1.18 镜像。

初始 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: nginx
        image: nginx:1.18

更新 Deployment
将镜像更新为 nginx:1.19 后,Deployment 会创建一个新的 ReplicaSet,并逐步将旧的 ReplicaSet 缩容。

查看 ReplicaSet

kubectl get replicaset

输出示例:

NAME                       DESIRED   CURRENT   READY   AGE
my-deployment-1234567890   3         3         3       5m   # 新的 ReplicaSet
my-deployment-9876543210   0         0         0       10m  # 旧的 ReplicaSet

5. 自动恢复

Deployment 会自动恢复意外终止的 Pod,以确保 Pod 副本数量始终符合预期。

示例

假设你有一个 Deployment,配置了 replicas: 3

手动删除一个 Pod

kubectl delete pod <pod-name>

Deployment 的行为

  • Deployment 会检测到 Pod 数量不足,并自动创建一个新的 Pod 来替换被删除的 Pod。


6. 扩展和缩容

Deployment 支持动态扩展和缩容。你可以通过修改 replicas 字段来调整 Pod 的副本数量。

示例

假设你有一个 Deployment,初始副本数为 3。

扩展副本数

  1. 修改 deployment.yaml 文件,将 replicas: 3 改为 replicas: 5

  2. 应用更新:

    kubectl apply -f deployment.yaml
  3. Deployment 会自动创建 2 个新的 Pod。

缩容副本数

  1. 修改 deployment.yaml 文件,将 replicas: 5 改为 replicas: 2

  2. 应用更新:

    kubectl apply -f deployment.yaml
  3. Deployment 会自动删除 3 个 Pod,只保留 2 个 Pod。

示例

以下是一个简单的 Deployment 定义示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: nginx
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1

在这个示例中:

  • replicas: 3 表示期望有 3 个 Pod 副本在运行。

  • selector 指定了 Deployment 管理的 Pod 的标签为 app: my-app

  • template 定义了 Pod 的规格,包括容器镜像 nginx

  • strategy 配置了滚动更新策略,maxUnavailable: 1 表示在更新过程中最多允许 1 个 Pod 不可用,maxSurge: 1 表示在更新过程中最多允许超出预期副本数 1 个 Pod。