【发布时间】:2018-05-02 08:01:38
【问题描述】:
我对文档的理解是:
-
在集群中创建新的 k8s 资源kubectl create -
更新实时集群中的资源kubectl replace -
如果我想做创建 + 替换 (Reference)kubectl apply
我的问题是
- 为什么要在一个集群中执行相同的任务需要三个操作?
- 这些操作有哪些用例?
- 它们在底层有何不同?
【问题讨论】:
标签: kubernetes kubectl
我对文档的理解是:
kubectl create
在集群中创建新的 k8s 资源kubectl replace
更新实时集群中的资源kubectl apply
如果我想做创建 + 替换 (Reference)我的问题是
【问题讨论】:
标签: kubernetes kubectl
这是两种不同的方法:
kubectl create 就是我们所说的Imperative Management。在这种方法中,您告诉 Kubernetes API 您要创建、替换或删除什么,而不是您希望 K8s 集群世界的样子。
kubectl apply 是Declarative Management 方法的一部分,即使您apply对象的其他更改。
您可以在Kubernetes Object Management 文档中阅读有关命令式和声明式管理的更多信息。
kubectl create 会报错,kubectl apply 不会报错。【讨论】:
kubectl create和kubectl apply这两个操作是否有相同的效果。
kubectl create 将抛出错误。 kubectl apply 不会。不同之处在于 kubectl create 专门说“创建这个东西”,而 kubectl apply 说“做任何必要的事情(创建、更新等)以使其看起来像这样”。
在 CI 脚本中运行时,您将无法使用命令式命令,因为如果资源已经存在,create 会引发错误。
您可以通过使用--dry-run=true 和-o yaml 选项应用(声明式模式)命令式命令的输出:
kubectl create whatever --dry-run=true -o yaml | kubectl apply -f -
如果资源已经存在,上面的命令将不会引发错误(并且会在需要时更新资源)。
这在您无法使用声明性模式的某些情况下非常有用(例如在创建 docker-registry 机密时)。
【讨论】:
kubectl delete deployment nginx --ignore-not-found; kubectl create deployment nginx --image=nginx
kubectl。
这是了解初学者差异的最佳方式。
图片中提到的示例有错误。请参考 cmets 以获得更好的理解。
你也可以参考下面的例子。
命令式:
声明式:
从 K8s 的角度来看:
命令式:您必须自己管理不同的资源,如 pod、服务、副本集等。
声明式: K8 将处理所有资源,您需要指定您的实际需求。
【讨论】:
根据我的理解,只是给出一个更直接的答案:
apply - 对现有对象进行增量更改 create - 创建一个全新的对象(以前不存在/已删除)
取自 Kubernetes 网站链接的 DigitalOcean article:
我们在这里使用 apply 而不是 create,以便将来我们可以逐步将更改应用到 Ingress Controller 对象,而不是完全覆盖它们。
【讨论】:
apply 像 docker-compose up -d + 使用 create 像 docker-compose up -d --build?
apply 仍然会在对象不存在时创建它。
┌─────────┬───────────────────────┬────────────────────────┐
│ command │ object does not exist │ object already exists │
├─────────┼───────────────────────┼────────────────────────┤
│ create │ create new object │ ERROR │
│ │ │ │
│ apply │ create new object │ configure object │
│ │ (needs complete spec) │ (accepts partial spec) │
│ │ │ │
│ replace │ ERROR │ delete object │
│ │ │ create new object │
└─────────┴───────────────────────┴────────────────────────┘
【讨论】:
kubectl run = kubectl create deployment
kubectl create -f your-object-config.yaml
kubectl delete -f your-object-config.yaml
kubectl replace -f your-object-config.yaml
kubectl diff -f configs/
kubectl apply -f configs/
【讨论】:
kubectl run 现在创建 pod。
official documentation 下面的解释帮助我理解了kubectl apply。
此命令会将您推送的配置版本与之前的版本进行比较,并应用您所做的更改,而不会覆盖对您未指定的属性的任何自动更改。
另一方面,kubectl create 将创建(应该是不存在的)资源。
【讨论】:
kubectl create 一次可以使用一个对象配置文件。这也称为命令式管理
kubectl create -f 文件名|url
kubectl apply 适用于目录及其包含对象配置 yaml 文件的子目录。这也称为声明式管理。可以从目录中提取多个对象配置文件。 kubectl apply -f 目录/
详情:
https://kubernetes.io/docs/tasks/manage-kubernetes-objects/declarative-config/
https://kubernetes.io/docs/tasks/manage-kubernetes-objects/imperative-config/
【讨论】:
我们喜欢 Kubernetes 是因为一旦我们给了他们我们想要的东西,它就会在没有我们任何参与的情况下弄清楚如何实现它。
“创造”就像玩上帝,把事情掌握在自己手中。当您只想使用 POD 而不关心部署/复制控制器时,这对本地调试很有用。
“申请”是按规则进行的。 “应用”就像一个主工具,可以帮助您创建和修改,并且不需要您管理 pod。
【讨论】: