【问题标题】:What is the difference between a pod and a deployment?Pod 和部署之间有什么区别?
【发布时间】:2017-05-10 13:19:12
【问题描述】:

我一直在使用 type:deployment 创建 pod,但我看到一些文档使用 type:pod,更具体地说是 the documentation for multi-container pods

apiVersion: v1
kind: Pod
metadata:
  name: ""
  labels:
    name: ""
  namespace: ""
  annotations: []
  generateName: ""
spec:
  ? "// See 'The spec schema' for details."
  : ~

但要创建 pod,我可以使用 a deployment type:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: ""
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: ""
    spec:
      containers:
        etc

我注意到 pod 文档说:

create命令可以直接创建pod,也可以 通过部署创建一个或多个 pod。强烈推荐 您使用部署来创建您的 pod。它监视失败 pods 并将根据需要启动新的 pod 以维护指定的 数字。如果您不希望 Deployment 监控您的 pod(例如,您的 pod 正在写入无法在重新启动后继续存在的非持久性数据,或者 您的 pod 的寿命很短),您可以创建一个 pod 直接用create命令。

注意:我们建议使用 Deployment 来创建 Pod。你应该使用 仅当您不想创建部署时,请按照以下说明进行操作。

但这提出了kind:pod 有什么用的问题?你能以某种方式在部署中引用 pod 吗?我没有看到办法。看起来您从 pod 中获得的是一些额外的元数据,但没有任何部署选项,例如 replica 或重启策略。一个不持久化数据的 Pod 有什么好处,可以在重启后幸存下来?我想我也可以创建一个带有部署的多容器 pod。

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    Pod 和 Deployment 都是 Kubernetes API 中的成熟对象。 Deployment 通过 ReplicaSet 管理创建 Pod。归结为,Deployment 将使用从模板中获取的规范创建 Pod。您不太可能需要直接为生产用例创建 Pod。

    【讨论】:

    • 谢谢,但你什么时候会直接创建 pod?
    • 拥有一个自定义控制器是您可能想要直接创建和管理 pod 的一种情况,而不是使用更高级别的抽象之一。
    • @BjornTipling 当我不需要 kubernetes 在删除时重新创建 pod 时,我创建了没有部署的 pod。一个用例是通过首先创建一个 pod 来进行测试。
    • 更准确地说,Deployment 创建了一个 ReplicaSet,然后创建了一组相同的无steteless Pod,w.r.t.在 Deployment 的 yaml 文件中指定的 pod 模板,以及副本字段的值(它定义了 pod 集的大小)。 Deployment 可以管理多个 ReplicaSet,以便对托管的 Pod 进行滚动更新,从而在不中断服务的情况下升级应用的版本
    【解决方案2】:

    Radek 的回答非常好,但我想根据我的经验提出建议,您几乎不会将 objectkind pod 一起使用strong>,因为这在实践中没有任何意义。

    因为您需要一个 deployment 对象 - 或其他 Kubernetes API 对象,例如 replication controllerreplicaset - 需要保持 replicas(pod)活着(这就是使用 kubernetes 的重点)。

    您将在实践中用于典型应用程序的是:

    1. 部署对象(您将在其中指定您的应用程序容器),它将托管您的应用程序容器以及其他一些规范。

    2. 服务对象(这就像一个分组对象,并为具有特定标签的pods 和那些@987654323 赋予所谓的虚拟IP(集群IP) @ 基本上是您使用以前的 deployment 对象部署的应用容器)。

    您需要有 service 对象,因为部署对象中的 pods 可以被杀死、放大和缩小,并且您不能依赖它们的 IP 地址,因为它们不会坚持不懈。

    所以你需要一个像服务这样的对象,它可以为pods 提供稳定的IP。

    只是想为您提供一些有关 pods 的背景信息,以便您了解事物如何协同工作。

    希望能为你解决一些问题,不久前我站在你的立场上 :)

    【讨论】:

    • 不错的答案,我们需要一个 replicaSet 还是一个 ReplicationController,因为我认为 Deployment 对象包装了这些控制副本的对象?
    • 是的,Deployment 对象处理副本集,但如果你真的想的话,你也可以使用带有 kind: ReplicationController 或 kind: ReplicaSet 的对象,但我没有看到太多在实践中......
    • 为什么多个kubernetes文档都以kind: Pod为例?例如,如何将 Secrets 用作环境变量:kubernetes.io/docs/concepts/configuration/secret/…
    • 我不太确定,可能是因为它更容易解释 k8 中的概念......而不考虑控制器、部署等的重要性......
    • 在某些情况下,您想要创建 pod,例如,如果您正在运行测试 sidecar(例如 helm test),您不需要永远运行应用程序,而我们不需要需要多个副本,这种情况下 pod 是合适的。
    【解决方案3】:

    尽量避免使用 Pod 并实施部署来管理容器,因为在节点故障或 pod 终止的情况下,Pod 不会被重新调度(或自我修复)。

    Deployment 通常更可取,因为它定义了一个 ReplicaSet 以确保所需数量的 Pod 始终可用,并指定替换 Pod 的策略,例如 RollingUpdate。

    【讨论】:

      【解决方案4】:

      在 kubernetes 中,Pod 是最小的可部署单元。每次我们创建一个像 Deployment、replica-sets、statefulsets、daemonsets 这样的 kubernetes 对象时,它都会创建 pod。

      如上所述,部署会根据部署对象中提到的所需状态创建 pod。例如,您想要一个应用程序的 5 个副本,您在部署清单中提到了 replicas: 5。现在部署控制器负责为给定应用程序创建 5 个相同的副本(不少于,不多),其中包含所有元数据,如 RBAC 策略、网络策略、标签、注释、健康检查、资源配额、污点/容忍度等,并与每个 pod 关联它创建。

      在某些情况下,您想要创建 pod,例如,如果您正在运行一个测试 sidecar,您不需要永远运行应用程序,您不需要多个副本,并且您可以在需要时运行应用程序在这种情况下执行 pod 是合适的。例如helm test,它是一个 pod 定义,它指定了一个容器,其中包含要运行的给定命令。

      【讨论】:

        【解决方案5】:

        Pod 是容器实例。

        那是replicas: 3的输出

        想想一个deployment可以有很多运行实例(副本)。

        //deployment.yaml
        apiVersion: apps/v1beta2
        kind: Deployment
        metadata:
          name: tomcat-deployment222
        spec:
          selector:
            matchLabels:
              app: tomcat
          replicas: 3
          template:
            metadata:
              labels:
                app: tomcat
            spec:
              containers:
              - name: tomcat
                image: tomcat:9.0
                ports:
                - containerPort: 8080
        

        【讨论】:

        • 迄今为止最好的答案。其他答案侧重于展示部署如何成为更重要的概念,并且您很少在生产中使用 Pod,但缺乏关于它们如何相互关联的明确信息。
        • 那么我们可以将 pod 命名为部署副本中的一个吗?
        • @kioria,“部署的副本”是什么意思?
        • @kioria, replicas: 3 引用图像的顶部,意思是“嘿,当你在这个进程上运行时,创建3个虚拟/真实计算机-实例。”。它就像“部署”是一个家,“豆荚”是人。一个家庭和三个人在里面工作。你想具体做什么?
        • @mutant_city:你很好,但这违背了 pod 的目的。我还没有遇到任何需要在一个 pod 中放置多个容器的用例。
        【解决方案6】:

        Kubernetes 有三种你应该知道的对象类型

        • Pods - 运行一个或多个密切相关的容器
        • 服务 - 在 Kubernetes 集群中设置网络
        • 部署 - 维护一组相同的 pod,确保它们具有正确的配置并且存在正确的数量。

        Pod:

        • 运行一组容器
        • 适合一次性开发目的
        • 很少直接用于生产

        部署:

        • 运行一组相同的 pod
        • 监控每个 pod 的状态,并根据需要进行更新
        • 适合开发人员
        • 适合生产

        我同意其他答案,忘记 Pod 并使用 Deployment。为什么?查看第二个要点,它监控每个 pod 的状态,并根据需要进行更新。

        因此,与其为诸如此类的错误消息而苦苦挣扎:

        禁止:pod 更新可能不会更改 spec.containers[*].image 以外的字段

        因此,只需将您的 Pod 重构或完全重新创建为 Deployment,该 Deployment 创建一个 pod 来完成您需要完成的工作。使用 Deployment,您可以更改任何您想要的配置,而不必担心看到该错误消息。

        【讨论】:

          【解决方案7】:

          Pod 是容器和 Kuberntes 基本对象的集合。 pod的所有容器都在同一个节点。

          • 不适合生产
          • 无滚动更新

          Deployment 是 Kubernetes 中的一种控制器。

          Controllers use a Pod Template that you provide to create the Pods for which it is responsible.

          Deployment 创建一个 ReplicaSet 反过来确保, CurrentReplicas 总是与 desiredReplicas 相同。

          优点:

          • 您可以使用部署来推出和回滚您的更改
          • 监控每个 pod 的状态
          • 最适合生产
          • 支持滚动更新

          【讨论】:

            【解决方案8】:

            我想添加一些来自Kubernetes In Action book的信息,这样你就可以看到所有的图片和Kubernetes资源之间的连接关系,比如Pod、Deployment和ReplicationController(ReplicaSet)

            豆荚

            是 Kubernetes 中的基本可部署单元。但在实际用例中,您希望您的部署能够自动保持正常运行并保持健康,而无需任何人工干预。为此,推荐的方法是使用 Deployment,它在后台创建一个 ReplicaSet

            ReplicaSet,顾名思义,是一组副本(Pod),维护着它们的Revision历史。

            (ReplicaSet 扩展了一个名为 ReplicationController 的旧对象——它完全相同,但没有修订历史记录。)

            ReplicaSet 会持续监控运行中的 pod 列表,并确保符合某个规范的 pod 的运行数量始终与所需数量匹配。

            Removing a pod from the scope of the ReplicationController comes in handy
            when you want to perform actions on a specific pod. For example, you might 
            have a bug that causes your pod to start behaving badly after a specific amount 
            of time or a specific event.
            

            部署

            是一种更高级别的资源,用于部署应用程序并以声明方式更新它们。

            当您创建 Deployment 时,会在下面创建一个 ReplicaSet 资源(最终会更多)。 ReplicaSets 也可以复制和管理 pod。使用 Deployment 时,实际的 pod 由 DeploymentReplicaSets 创建和管理,而不是由 Deployment 直接创建和管理

            让我们想想发生了什么。通过更改 Deployment 资源中的 pod 模板,您已将应用更新到较新的版本 - 只需更改单个字段!

            最后,回滚部署到以前的修订版或任何较早的修订版,使用部署资源很容易。

            这些图片也来自Kubernetes In Action book。

            【讨论】:

            • 正确解释。顺便说一句,是否有任何实际场景可以使用 kind:pod 而不是 kind:deployment。因为使用部署总是安全的,因为如果一个出现故障,一个就会上线。使用 kind:pod 有什么好处吗?
            【解决方案9】:

            这个例子可能对初学者有帮助!

            1) 列出 POD

            controlplane $ kubectl -n my-namespace get pods
            NAME                            READY   STATUS    RESTARTS   AGE
            mysql                           1/1     Running   0          92s
            webapp-mysql-75dfdf859f-9c54j   1/1     Running   0          92s
            

            2) 删除 web-app pod - 这是使用部署创建的

            controlplane $ kubectl -n my-namespace delete pod webapp-mysql-75dfdf859f-9c54j
            pod "webapp-mysql-75dfdf859f-9c54j" deleted
            

            3)列出POD(可以看到,它是自动重新创建的)

            controlplane $ kubectl -n my-namespace get pods
            NAME                            READY   STATUS    RESTARTS   AGE
            mysql                           1/1     Running   0          2m42s
            webapp-mysql-75dfdf859f-mqrcx   1/1     Running   0          45s
            

            4) 删除直接创建的mysql POD(无需部署)

            controlplane $ kubectl -n my-namespace delete pod mysql
            pod "mysql" deleted
            

            5) 列出 POD(可以看到 mysql POD 永远丢失了)

            controlplane $ kubectl -n my-namespace get pods
            NAME                            READY   STATUS    RESTARTS   AGE
            webapp-mysql-75dfdf859f-mqrcx   1/1     Running   0          76s
            

            【讨论】:

              【解决方案10】:

              我也是k8s的初学者,如有错误请指正。

              我们知道在创建部署时会创建一个 pod。我观察到,如果你看到部署的 YAML 文件,你可以看到它的 kind:deployment。但是如果你看到 pod 的 YAML 文件,你会看到它的 kind:pod

              【讨论】:

                【解决方案11】:

                在 Kubernetes 中,我们可以使用不同类型的 API 对象部署工作负载,例如 PodsDeploymentReplicaSetReplicationControllerStatefulSets

                在这些 Pods 中,是 Kubernetes 中最小的可部署单元。在 Kubernetes 中运行的任何工作负载/应用程序都必须在 Pod 的容器部分中运行。一个 Pod 可以在其中运行多个容器(即多个应用程序)。 Pod 是一个/多个正在运行的容器之上的包装器。使用 Pod,kubernetes 可以控制、监控、操作容器。

                现在使用独立的 Pod 我们不能做很多事情。我们无法更改 Pod 中的配置和卷。如果 Pod 出现故障,我们将无法重新启动该 Pod。 因此,出现了另一个名为 Deployment 的 API 对象,它维护应用程序的期望状态(有多少实例,应用程序使用多少计算资源)。 Deployment 通过运行多个 Pod 来维护同一个应用程序的多个实例。与 Pod 不同的部署是可变的。 Deployments 使用另一个名为 ReplicaSet 的 API 对象来维护所需的状态。如果一个 Pod 宕机,通过 ReplicaSet 的部署会生成另一个 Pod。

                所以 Pod 在容器中运行应用程序。 部署运行 Pod 并维护应用程序的所需状态。

                【讨论】:

                  猜你喜欢
                  • 2021-10-24
                  • 2019-04-15
                  • 1970-01-01
                  • 2015-10-01
                  • 2018-12-07
                  • 2017-12-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多