我一直在用type:deployment创建pod,但我看到一些文档使用type:pod,更具体地说,多容器pod的文档:

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

但是要创建pod,我可以使用部署类型:

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

我注意到pod文档说:

The create command can be used to create a pod directly, or it can create a pod or pods through a Deployment. It is highly recommended that you use a Deployment to create your pods. It watches for failed pods and will start up new pods as required to maintain the specified number. If you don’t want a Deployment to monitor your pod (e.g. your pod is writing non-persistent data which won’t survive a restart, or your pod is intended to be very short-lived), you can create a pod directly with the create command. Note: We recommend using a Deployment to create pods. You should use the instructions below only if you don’t want to create a Deployment.

但这就提出了一个问题:豆荚适合哪一种?你能在部署中引用pod吗?我不知道该怎么办。看起来你从pods中得到的是一些额外的元数据,但没有任何部署选项,如副本或重启策略。一个不保存数据的吊舱在重启后还能存活,这有什么用呢?我认为我能够创建一个多容器pod部署以及。


当前回答

Radek的回答非常好,但我想从我的经验中提出,你几乎永远不会使用带有这种豆荚的对象,因为这在实践中没有任何意义。

因为你需要一个部署对象——或者其他Kubernetes API对象,比如复制控制器或复制集——来保持副本(pod)的活动(这就是使用Kubernetes的意义)。

在一个典型的应用程序中,您将使用的是:

部署对象(你将在其中指定你的应用程序容器/容器),它将承载你的应用程序的容器与一些其他规格。 服务对象(类似于分组对象,并为具有特定标签的pods提供所谓的虚拟IP(集群IP) -这些pods基本上是您与前一个部署对象一起部署的应用程序容器)。

您需要有service对象,因为部署对象中的pod可以被杀死、扩展和缩小,而且您不能依赖于它们的IP地址,因为它们不是持久的。

所以你需要一个像服务这样的对象,给这些pod一个稳定的IP。

只是想给你一些关于pod的背景知识,这样你就知道它们是如何一起工作的。

希望这为你澄清了一些事情,不久以前我也是你的处境:)

其他回答

Pod和Deployment都是Kubernetes API中成熟的对象。部署通过ReplicaSets管理创建pod。归结起来,部署将使用模板中的规格创建Pods。您不太可能需要直接为生产用例创建pod。

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

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

也许这个例子对初学者会有帮助!!

1)列出PODs

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 pode -这是使用部署创建

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

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

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

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

不适合生产 没有滚动更新

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

控制器使用您提供的Pod模板来创建它负责的Pod。

部署创建了一个ReplicaSet,它反过来确保, CurrentReplicas始终与desired dreplicas相同。

优点:

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

在Kubernetes中,我们可以使用不同类型的API对象来部署我们的工作负载,比如Pods、Deployment、ReplicaSet、ReplicationController和StatefulSets。

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

Now using stand alone Pods we can't do lot of things. We can't change configurations, volumes inside Pods. We can't restart the Pod if one is down. So there is another API Object called Deployment comes into picture which maintains the desired state (how many instances, how much compute resource application uses) of the application. The Deployment maintaines multiple instances of same application by running multiple Pods. Deployments unlike Pods are mutable. Deployments uses another API Object called ReplicaSet to maintain the desired state. Deployments through ReplicaSet spawns another Pod if one is down.

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