我一直在使用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。
答案 0 :(得分:148)
拉德克的回答非常好,但我想从我的经验中汲取经验,你几乎不会使用善于 对象 > pod ,因为这在实践中没有任何意义。
因为您需要部署对象 - 或其他Kubernetes API对象,如复制控制器或 replicaset - 需要保持复制品(pods)活着(这就是使用kubernetes的重点)。
您在实践中将用于典型应用的是:
部署对象(您将在其中指定您的应用容器/容器),它将托管您的应用程序的容器以及其他一些规范。
服务对象(就像分组对象一样,为具有特定标签的pods
提供所谓的虚拟IP(群集IP) - 以及那些pods
基本上是您使用以前的部署对象部署的应用容器。
您需要拥有服务对象,因为部署对象中的pods
可以被杀死,按比例放大和缩小,并且您无法依赖其IP地址,因为他们不会坚持不懈。
因此,您需要一个像服务这样的对象,为pods
提供稳定的IP。
只是想给你一些关于pods
的背景信息,这样你就知道事情是如何协同工作的。
希望能为你清除一些东西,不久前我还在你的鞋子里:)
答案 1 :(得分:102)
Pod和Deployment都是Kubernetes API中的完整对象。部署通过ReplicaSet管理创建Pod。它归结为部署将使用模板中的规范创建Pod。您不太可能需要直接为生产用例创建Pod。
答案 2 :(得分:11)
Kubernetes具有三种您应该了解的对象类型:
豆荚:
部署:
我会同意其他答案,忘记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的运行数量始终与所需数量相匹配。
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 创建和管理
让我们考虑发生了什么。通过更改部署资源中的Pod模板,您可以通过更改单个字段将应用程序更新为较新的版本!
最后,将部署回滚到先前的版本或任何较早的版本,这样可以轻松利用“部署”资源。
这些图像也来自Kubernetes In Action书。
答案 4 :(得分:2)
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
答案 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。