在kubernetes中,pod和部署之间有什么区别?

时间:2016-12-25 22:53:28

标签: kubernetes

我一直在使用type:deployment创建广告连播,但我发现有些文档使用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。它注意失败   pods将根据需要启动新的pod以维护指定的   数。如果您不希望部署监控您的pod(例如您的   pod正在编写非持久性数据,这些数据在重启后无法生存,或者   你的pod可能是非常短暂的,你可以创建一个pod   直接使用create命令。

     

注意:我们建议使用“部署”来创建窗格。你应该用   仅当您不想创建部署时,才会出现以下说明。

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

10 个答案:

答案 0 :(得分:148)

拉德克的回答非常好,但我想从我的经验中汲取经验,你几乎不会使用善于 对象 > pod ,因为这在实践中没有任何意义。

因为您需要部署对象 - 或其他Kubernetes API对象,如复制控制器 replicaset - 需要保持复制品(pods)活着(这就是使用kubernetes的重点)。

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

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

  2. 服务对象(就像分组对象一样,为具有特定标签的pods提供所谓的虚拟IP(群集IP) - 以及那些pods基本上是您使用以前的部署对象部署的应用容器。

  3. 您需要拥有服务对象,因为部署对象中的pods可以被杀死,按比例放大和缩小,并且您无法依赖其IP地址,因为他们不会坚持不懈。

    因此,您需要一个像服务这样的对象,为pods提供稳定的IP。

    只是想给你一些关于pods的背景信息,这样你就知道事情是如何协同工作的。

    希望能为你清除一些东西,不久前我还在你的鞋子里:)

答案 1 :(得分:102)

Pod和Deployment都是Kubernetes API中的完整对象。部署通过ReplicaSet管理创建Pod。它归结为部署将使用模板中的规范创建Pod。您不太可能需要直接为生产用例创建Pod。

答案 2 :(得分:11)

Kubernetes具有三种您应该了解的对象类型

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

豆荚:

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

部署:

  • 运行一组相同的豆荚
  • 监视每个吊舱的状态,并根据需要进行更新
  • 对开发人员有益
  • 有益于生产

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

因此,不要为这样的错误消息而苦恼:

  

禁止访问:广告连播更新不能更改spec.containers[*].image以外的其他字段

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

答案 3 :(得分:11)

我想从Kubernetes In Action的书中添加一些信息,以便您可以看到所有图片,并在Pod,Deployment和ReplicationController(ReplicaSet)等Kubernetes资源之间建立联系

豆荚

是Kubernetes中的基本可部署单元。但是在实际的用例中,您希望您的部署能够自动启动并运行,并在没有任何手动干预的情况下保持健康。为此,推荐的方法是使用 Deployment (部署),它会在内部创建 ReplicaSet

顾名思义,

ReplicaSet 是一组具有其 Revision 历史记录的副本(Pods)。

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

ReplicaSet会持续监视正在运行的Pod列表,并确保与特定规格匹配的Pod的运行数量始终与所需数量相匹配。

enter image description here

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.

部署

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

创建部署时,会在其下创建一个 ReplicaSet 资源(最终会有更多资源)。 ReplicaSets 也可以复制和管理Pod。使用部署时,实际的Pod由部署 ReplicaSet 创建和管理,而不是直接由 Deployment 创建和管理 enter image description here

让我们考虑发生了什么。通过更改部署资源中的Pod模板,您可以通过更改单个字段将应用程序更新为较新的版本!

enter image description here

最后,将部署回滚到先前的版本或任何较早的版本,这样可以轻松利用“部署”资源。

这些图像也来自Kubernetes In Action书。

答案 4 :(得分:2)

Pod是容器实例。

enter image description here

这是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

答案 5 :(得分:2)

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

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) 删除使用部署创建的网络应用程序 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

答案 6 :(得分:1)

请尽量避免使用Pod并实施部署来管理容器,因为如果发生节点故障或Pod终止,则Pod类型的对象将不会重新安排(或自我修复)。

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

答案 7 :(得分:1)

在kubernetes中,Pod是可部署的最小单元。每当我们创建一个Kubernetes对象(如Deployments,副本集,statefulsets,daemonsets)时,它都会创建pod。

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

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

答案 8 :(得分:1)

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

  • 不适合生产
  • 没有滚动更新

部署是Kubernetes中的一种控制器。

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

部署会创建一个ReplicaSet,从而确保 wantedReplicas始终与CurrentReplicas相同。

优势:

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

答案 9 :(得分:0)

我也是 k8s 的初学者,如果我错了,请纠正我。

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