Kubernetes 吊舱和部署有什么区别?

Kubernetes 吊舱和部署有什么区别?,kubernetes,Kubernetes,我一直在使用type:deployment创建pod,但我看到一些文档使用type:pod,更具体地说: 但要创建豆荚,我可以使用: 我注意到pod文档上说: create命令可用于直接创建pod,也可以 通过展开创建一个或多个吊舱。强烈推荐 使用部署来创建吊舱。它监视失败的数据 POD,并将根据需要启动新的POD,以维持指定的POD 号码。如果您不希望部署来监视您的pod(例如 pod正在写入无法在重启后生存的非持久性数据,或 你的豆荚寿命很短),你可以创建一个豆荚 直接使用create命令

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

但要创建豆荚,我可以使用:

我注意到pod文档上说:

create命令可用于直接创建pod,也可以 通过展开创建一个或多个吊舱。强烈推荐 使用部署来创建吊舱。它监视失败的数据 POD,并将根据需要启动新的POD,以维持指定的POD 号码。如果您不希望部署来监视您的pod(例如 pod正在写入无法在重启后生存的非持久性数据,或 你的豆荚寿命很短),你可以创建一个豆荚 直接使用create命令

注意:我们建议使用部署来创建POD。你应该使用 仅当您不想创建展开时,才可以使用以下说明


但这就提出了一个问题:pod有什么好处?你能在部署中引用吊舱吗?我看不出有什么办法。看起来pods提供的是一些额外的元数据,但没有部署选项,例如
副本
或重新启动策略。一个不能持久保存数据的pod在重启后还能生存有什么好处?我想我也可以创建一个带有部署的多容器pod。

在Kubernetes API中,pod和部署都是成熟的对象。部署管理通过复制集创建POD。归根结底,部署将使用模板中的规范创建pod。您不太可能需要为生产用例直接创建pod。

Radek的答案很好,但我想根据我的经验,您几乎不会将对象pod一起使用,因为这在实践中没有任何意义

因为您需要一个部署对象,或者其他Kubernetes API对象,如复制控制器复制集,它需要保持副本(POD)处于活动状态(这就是使用Kubernetes的要点)

在典型应用中,您将实际使用的是:

  • 部署对象(您将在其中指定应用程序容器),该对象将承载具有其他一些规范的应用程序容器

  • 服务对象(这类似于分组对象,为具有特定标签的
    pods
    提供了所谓的虚拟IP(集群IP)——这些
    pods
    基本上就是您使用前一个部署对象部署的应用程序容器)

  • 您需要使用服务对象,因为部署对象中的
    pod
    可以被杀死、放大和缩小,并且您不能依赖它们的IP地址,因为它们不会持久化

    因此,您需要一个像服务这样的对象,为那些
    吊舱
    提供一个稳定的IP

    我只是想给你一些关于
    pods
    的背景知识,让你了解事物是如何协同工作的


    希望这能为您澄清一些事情,不久前我还站在您的立场上:)

    尝试避免Pod并实施部署,而不是管理容器,因为在节点故障或Pod终止的情况下,Pod类对象不会被重新调度(或自我修复)


    部署通常更可取,因为它定义了一个复制集,以确保所需数量的POD始终可用,并指定了替换POD的策略,例如RollingUpdate

    在库伯内特斯,吊舱是最小的可部署单元。每次我们创建kubernetes对象(如部署、副本集、状态集、守护进程)时,它都会创建pod

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


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

    pod是容器实例。

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

    这是
    副本:3的输出

    设想一个
    部署可以有多个正在运行的实例(副本)


    Kubernetes有三种对象类型,您应该知道:

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

    controlplane $ kubectl -n my-namespace get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    webapp-mysql-75dfdf859f-mqrcx   1/1     Running   0          76s
    
    • 运行一组容器
    • 适用于一次性开发目的
    • 很少直接用于生产
    部署:

    controlplane $ kubectl -n my-namespace get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    webapp-mysql-75dfdf859f-mqrcx   1/1     Running   0          76s
    
    • 运行一组相同的吊舱
    • 监控每个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.
    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
    
    controlplane $ kubectl -n my-namespace delete pod webapp-mysql-75dfdf859f-9c54j
    pod "webapp-mysql-75dfdf859f-9c54j" deleted
    
    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
    
    controlplane $ kubectl -n my-namespace delete pod mysql
    pod "mysql" deleted
    
    controlplane $ kubectl -n my-namespace get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    webapp-mysql-75dfdf859f-mqrcx   1/1     Running   0          76s