我从文档中了解到:

kubectl创建 在集群中创建一个新的k8s资源 kubectl取代 更新活动集群中的资源 kubectl应用 如果我想创建+替换(参考)

我的问题是

为什么在集群中执行相同的任务有三种操作? 这些操作的用例是什么? 它们在本质上有什么不同?


当前回答

┌─────────┬───────────────────────┬────────────────────────┐
│ 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 create就是我们所说的命令式管理。在这种方法中,你告诉Kubernetes API你想要创建、替换或删除什么,而不是你想要你的K8s集群世界是什么样子。

声明式管理

kubectl apply是声明式管理方法的一部分,在这种方法中,即使对对象应用了其他更改,也会“维护”对活动对象应用的更改(即通过缩放)。

您可以在Kubernetes对象管理文档中阅读更多关于命令式和声明式管理的内容。

在外行他们做不同的事情。如果资源存在,kubectl create会出错,而kubectl apply不会出错。

这个问题很深刻,也很好。下面是我对这个问题的思考:

K8s有三种资源管理方法

基于命令的对象管理:直接使用命令对kubernetes资源进行操作。例如: Kubectl运行nginx-pod——image=nginx:1.17.1——port=80 命令类型对象配置:通过命令配置和配置文件操作Kubernetes资源。例如: Kubectl create/patch -f nginx-pod.yaml 声明式对象配置:通过apply命令和配置文件操作kubernetes资源。例如: Kubectl应用-f nginx-pod.yaml

Type Operate Object Suitable for environment Advantage disadvantage
Command Based Object Management Object test env Simple Only active objects can be operated, but not audited or tracked
Command Type Object Configuration File develop evn Can be audited and tracked When the project is large, there are many configuration files and the operation is troublesome
Declarative Object Configuration Directory develop evn Support directory operations It is difficult to debug under unexpected circumstances

我们喜欢Kubernetes是因为一旦我们给了他们我们想要的东西,它就会在没有我们参与的情况下找到实现它的方法。

“创造”就像扮演上帝,把事情掌握在自己手中。当您只想使用POD而不关心Deployment/Replication Controller时,它很适合用于本地调试。

“apply”是按规则行事。“apply”就像一个主工具,可以帮助您创建和修改,并且不需要您管理pod。

在CI脚本中运行时,如果资源已经存在,则创建会引发错误,因此使用命令式命令会遇到麻烦。

你能做的是应用(声明式模式)命令的输出,通过使用——dry-run=true和-o yaml选项:

kubectl create whatever --dry-run=client -o yaml | kubectl apply -f -

如果资源已经存在,上面的命令不会引发错误(如果需要,将更新资源)。

这在某些不能使用声明式模式的情况下非常有用(例如在创建docker-registry secret时)。

┌─────────┬───────────────────────┬────────────────────────┐
│ 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      │
└─────────┴───────────────────────┴────────────────────────┘