用于扩展的 Deployment

KubernetesBeginner
立即练习

简介

在之前的实验中,你创建过单个 Pod。Pod 虽然是 Kubernetes 的基本构建单元,但手动管理 Pod 很繁琐。如果某个 Pod 终止,你必须手动重启它。如果需要更多副本,也必须手动创建更多 Pod。

这时就需要使用 Deployment。

Deployment 是一种更高级别的控制器,可以替你管理 ReplicaSet 和 Pod。你只需声明应运行多少个副本,以及这些 Pod 应使用的模板,Kubernetes 就会持续让实际状态与声明保持一致。

这里的关键变化是:从管理单个 Pod,转变为管理可重复的工作负载。单个 Pod 只有一个实例,因此比较脆弱。Deployment 描述了如何创建 Pod,以及应运行多少个 Pod。正是这种模式让扩展和自愈成为可能。

在本实验中,你将学习:

  • 创建一个目标明确的 Manager(Deployment),要求运行 3 个副本。
  • 观察 Manager 创建工作 Pod。
  • “终止”一个工作 Pod,测试 Manager 的反应(自愈)。
  • 要求 Manager 创建更多工作 Pod(扩展)。

创建 Deployment YAML

在本步骤中,你将为 Manager 编写一份工作说明。这是一个 YAML 文件,用于定义要运行的镜像以及所需的副本数。

与普通的 Pod 清单相比,Deployment 包含额外的结构:selector 和 template。selector 告诉 Kubernetes 哪些 Pod 属于此 Deployment,template 则描述应如何创建新的 Pod。这两部分必须保持一致,否则 Deployment 将无法正确管理目标 Pod。

首先,确认当前位于项目目录:

cd ~/project

使用 nano 创建名为 deployment.yaml 的新文件:

nano deployment.yaml

将以下配置粘贴到文件中。注意 replicas: 3 这一行,它定义了团队所需的成员数量。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80

保存文件:按 Ctrl+X,然后按 Y,最后按 Enter。

这个文件告诉 Kubernetes:「创建一个名为 nginx-deployment 的 Deployment,确保始终有 3 个 Pod 运行 nginx:1.14.2 镜像。如果需要查找这些 Pod,就查找带有 app: nginx 标签的 Pod。」

应用配置并观察

现在你已经准备好工作说明,接下来创建 Manager。将配置应用到集群:

创建 Deployment 时,Kubernetes 通常会在后台创建另一个名为 ReplicaSet 的对象。ReplicaSet 直接负责维持所请求的 Pod 数量。初学者暂时不需要直接管理 ReplicaSet,但了解它的存在很有帮助,因为你经常会在命令输出中看到它。

kubectl apply -f deployment.yaml

Kubernetes 会确认:deployment.apps/nginx-deployment created。

Deployment(Manager)会立即开始创建 3 个 Pod。要快速查看这些 Pod,运行:

kubectl get pods

你应该会看到 3 个不同的 Pod,它们的名称都以 nginx-deployment- 开头:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-8j64w   1/1     Running   0          5s
nginx-deployment-66b6c48dd5-d95l2   1/1     Running   0          5s
nginx-deployment-66b6c48dd5-lzr5w   1/1     Running   0          5s

你还可以检查 Deployment 自身的状态:

kubectl get deployments

输出中应显示 READY 3/3,这表示所请求的 3 个副本都已启动并正在运行。

测试自愈

Kubernetes 最强大的功能之一是 自愈(Self-Healing)。Deployment 会确保 Pod 的实际数量始终与期望数量(3)一致。如果某个 Pod 消失,Deployment 会立即替换它。

这是因为 Kubernetes 会持续将实际状态与期望状态进行协调。删除一个 Pod 不会改变 Deployment 中保存的期望副本数,因此系统会将这次删除视为状态偏差,并创建一个替代 Pod。

现在手动删除一个 Pod,测试这一机制。

首先,再次列出 Pod:

kubectl get pods

复制其中 一个 Pod 的完整名称,例如 nginx-deployment-66b6c48dd5-8j64w。

然后删除这个 Pod:

kubectl delete pod <paste-pod-name-here>

Kubernetes 会提示该 Pod 已删除。立即再次运行 kubectl get pods:

kubectl get pods

你会看到以下现象:

  1. 旧 Pod 正在终止(或已经消失)。
  2. 一个名称不同、Age 很短的新 Pod 已经出现,例如 Age 为 2 秒。

Deployment 发现少了一个工作 Pod,于是立即创建了新的 Pod,使团队规模保持为 3。这样,即使单个服务器或容器发生故障,应用仍能保持在线。

扩展

假设你的网站越来越受欢迎。3 台 Web 服务器已经不够了,你需要 5 台。你是否需要手动创建新文件,或者急忙手动创建 Pod?

扩展 Deployment 会修改声明的期望数量,而不只是修改当前正在运行的进程集合。因此,这个新规模不会只在一次手动操作后生效。控制器会持续将更新后的副本数视为目标,直到你再次修改它。

不需要。你只需告诉 Manager 增加数量。

使用 kubectl scale 命令,可以动态更新副本数。

将副本数从 3 改为 5:

kubectl scale deployment/nginx-deployment --replicas=5

现在观察扩展过程:

kubectl get pods

此时你应该会看到 5 个正在运行的 Pod。Kubernetes 启动了两个新 Pod,以满足新的数量要求。

你也可以缩减副本数。如果流量下降,可以减少 Pod 数量来节省资源:

kubectl scale deployment/nginx-deployment --replicas=2

再次运行 kubectl get pods,你会看到 Kubernetes 终止多余的 Pod,直到只剩下 2 个。

这就是企业喜欢 Kubernetes 动态扩展能力的原因。

总结

在本实验中,你学习了 Deployment,也就是负责保持应用运行的智能管理器。

你已成功完成以下操作:

  1. 创建了一个包含 3 个工作 Pod 的 Deployment。
  2. 验证了 Deployment 会自动替换故障 Pod(自愈)。
  3. 使用一条命令增加和减少副本数量(扩展)。

现在你已经了解了为什么我们很少直接创建独立 Pod。Deployment 提供了可靠性和灵活性,并负责处理调度和重启等复杂工作,让你无需手动完成这些操作。