概述

Kubernetes 是简化微服务和分布式系统容器编排的最受欢迎选择之一。其核心是管理各种实体,每个实体都有不同的功能。

在本教程中,我们将探索理解Kubernetes的两个基本实体:Pod 和 Deployment。我们将深入研究它们的角色、差异和生态系统内的功能。

1. Pod

Pod 是 Kubernetes 中最小的工作单位,提供运行一个或多个容器的规格。通常,一个 Pod 包含单个容器。

然而,在一个 Pod 内运行多个容器是可能的,并且 Pod 内部的容器可以共享存储和网络资源。在 Pod 中运行主服务容器之外的容器时,最佳实践建议运行辅助容器,处理跨切面关注点如日志记录、监控或身份验证。这些次要容器被称为 辅助容器

Pod 可以因为各种原因终止,比如超出其资源限制或者宿主机节点失败。在这种情况下,Kubernetes 会杀死 Pod。值得注意的是,系统不会自动重启被终止的独立 Pod。

让我们看看运行单个 Nginx 容器的基本 Pod 定义:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.14.2

这在集群中创建了一个唯一标识为 nginx-pod 的 Pod。其次,指定了 nginx:1.14.2 镜像在 spec 部分的 nginx-container 下运行。

2. Deployment

现在,我们来探讨 Deployment。Deployment 是 Pod 声明与 ReplicaSet 的结合。ReplicaSet 是 Kubernetes 的另一个对象,维护特定数量的 Pod 实例在任何给定时间运行。

Deployment 作为一个更高层次的对象设计用于管理并更新 Pod 的实例。它封装了 ReplicaSet 实体提供的功能,例如确保指定数量的 Pod 复制,而 Deployment 带来了无需中断或回滚即可进行 滚动更新 的能力,在发生错误时。

与 Pod 不同,Deployment 表示系统的期望状态。Kubernetes 不断比较 Deployment 请求状态与实际状态,以使实际状态匹配请求状态。这种行为负责在部署中重新运行失败的 Pod 或根据请求副本数更新运行的 Pod 数量。

让我们查看运行两个副本的 Nginx 的 Deployment 配置:

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

这设置了名为 nginx-deployment 的 Deployment,旨在确保始终运行两个副本。通过将 template 中的 app 标签匹配到 selector 块中的 matchLabels 来实现这一点。

3. Pod 和 Deployment 的对比

现在,让我们来看看 Pod 和 Deployment 之间的关键差异:

  • Pod 是 Kubernetes 中最基本的部署单元,而 Deployment 则更为复杂,代表一组 Pod 的高级抽象管理。
  • Pod 的短暂性质使得单独管理其生命周期成为一个重大努力。Deployment 提供了对包含 Pod 的自动生命周期管理,减少了人工工作量。
  • 虽然 Pod 在节点故障或资源过度使用时容易终止,但 Deployment 不断监控并替换失败的 Pod,以维持期望状态。
  • Pod 是独立定义的;而 Deployment 封装了 Pod 定义,提供了一层额外的管理。
  • Pod 需要手动更新和干预来部署和缩放。Deployment 允许自动更新、回滚和缩放,提供了增强的集群管理。

4. 选择 Pod 或 Deployment

在实际场景中,当我们在一个 Kubernetes 集群上运行应用程序时,我们通常会使用比 Pod 更高级的抽象。因此,我们往往选择使用 Deployment 来自动化关键方面,如失败时的 Pod 重建、缩放和更新,以确保应用负载的稳健和高效处理。

此外,当我们使用 Deployment 时,我们实际上仍在利用 Pod,因为我们的应用程序作为容器在 Pod 内运行。但我们并未直接管理单独的 Pod。Deployment 将此责任委托给了 Kubernetes 控制平面,它基于我们的定义规格进行操作。

5. 结论

在这篇文章中,我们学习了两个基本的 Kubernetes 概念:Pod 和 Deployment。我们强调了它们之间的差异,并看到 Pod 代表执行的基本构建块。Deployment 提供了管理多个 Pod 实例的高层次方法,以及生命周期的其他方面。

总的来说,我们应该倾向于将 Pod 声明包裹在 Deployment 中。