Kubernetes 资源管理方式详解:命令式与声明式管理
- [Kubernetes 资源管理方式详解:命令式与声明式管理](#Kubernetes 资源管理方式详解:命令式与声明式管理)
- [Kubernetes 资源管理](#Kubernetes 资源管理)
- 命令式对象管理
- 命令式对象配置
- 声明式对象配置
- 命令式与声明式的核心区别
- 三种资源管理方式对比
- 三种方式的优缺点
- 命令式对象配置的优缺点
- 声明式对象配置的优势
- [为什么 YAML 在 Kubernetes 中如此重要?](#为什么 YAML 在 Kubernetes 中如此重要?)
- 三种方式应该如何选择?
- 从运维场景理解三种方式
- 一个简单的记忆方法
- 总结
Kubernetes 资源管理方式详解:命令式与声明式管理
Kubernetes 资源管理
在 Kubernetes 中,各种内容都被抽象成了资源,例如:
- Pod
- Deployment
- Service
- Namespace
- ConfigMap
- Secret
- PersistentVolume
- PersistentVolumeClaim
因此,使用 Kubernetes 的过程,本质上就是对各种资源进行管理。
对于资源来说,最常见的操作无非是:
text
创建资源
查询资源
修改资源
删除资源
Kubernetes 提供了 kubectl 作为主要的命令行管理工具。
例如:
bash
kubectl get pods
kubectl get deployments
kubectl get services
不过,在实际操作 Kubernetes 资源时,并不是只有一种管理方式。
根据操作形式的不同,可以将 Kubernetes 的资源管理方式分为三类:
- 命令式对象管理
- 命令式对象配置
- 声明式对象配置
这三种方式的核心区别在于:

理解这三种方式,是掌握 kubectl 和 YAML 配置文件的基础。
命令式对象管理
什么是命令式对象管理?
命令式对象管理是最直接的一种 Kubernetes 资源管理方式。
简单来说就是:
直接通过 kubectl 命令告诉 Kubernetes 需要执行什么操作。
例如创建一个 Nginx Pod:
bash
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
这条命令直接描述了需要 Kubernetes 执行的操作:

所有参数直接写在命令中,不需要提前准备 YAML 配置文件。
命令式管理的特点
这种方式最大的特点就是:
简单、直接。
例如:
bash
kubectl get pods
表示查询 Pod。
bash
kubectl delete pod nginx-pod
表示删除指定 Pod。
bash
kubectl create namespace dev
表示创建一个 Namespace。
可以把这种管理方式理解为:

用户需要明确告诉 Kubernetes:
"现在执行什么操作。"
因此这种方式被称为命令式管理。
命令式对象配置
随着 Kubernetes 配置越来越复杂,如果所有参数都写在命令行中,命令会变得越来越长。
例如一个 Pod 可能需要配置:
text
名称
Namespace
镜像
端口
环境变量
CPU
内存
存储
健康检查
启动命令
如果全部通过命令参数进行配置,维护起来会非常困难。
因此,可以把资源定义写入 YAML 文件。
这就引出了第二种方式:
命令式对象配置。
其基本形式为:
bash
kubectl create -f xxx.yaml
或者:
bash
kubectl patch -f xxx.yaml
此时资源信息不再全部写到命令中,而是保存在配置文件中。
例如:

可以简单理解为:
命令负责告诉 Kubernetes "执行什么操作",YAML 文件负责告诉 Kubernetes "操作哪个资源以及资源是什么配置"。
声明式对象配置
第三种方式叫做:
声明式对象配置。
这是 Kubernetes 中非常重要的一种管理思想。
最典型的命令就是:
bash
kubectl apply -f xxx.yaml
例如:
bash
kubectl apply -f nginx-pod.yaml
与前面的方式相比,声明式管理关注的重点发生了变化。
命令式管理关注:
text
我要执行什么操作?
声明式管理关注:
text
我最终希望资源是什么状态?
也就是说,我们只需要描述资源最终应该是什么样子,然后 Kubernetes 根据当前实际状态决定应该创建还是更新资源。
命令式与声明式的核心区别
这是理解 Kubernetes 资源管理非常关键的一点。
命令式思想
假设现在有一个资源:
text
当前副本数:2
希望变成:
text
目标副本数:3
命令式思维更接近:
text
"增加一个副本"
重点是描述:
执行什么动作。
声明式思想
声明式思维则更接近:
text
"我希望最终有 3 个副本。"
至于当前到底有几个副本、具体应该增加几个,交给 Kubernetes 自己判断。
重点是描述:
最终应该达到什么状态。
因此两种思想可以概括为:
text
命令式:
告诉系统怎么做
↓
执行具体操作
↓
得到结果
而声明式则是:
text
声明目标状态
↓
系统检查当前状态
↓
计算两者差异
↓
执行必要操作
↓
达到目标状态
这也是 Kubernetes 非常核心的设计思想之一。
三种资源管理方式对比
将三种方式放到一起就比较容易理解了。
| 管理方式 | 操作对象 | 核心特点 | 常见场景 |
|---|---|---|---|
| 命令式对象管理 | 资源对象 | 直接通过命令操作 | 查询、测试、临时操作 |
| 命令式对象配置 | YAML 文件 | 命令 + 配置文件 | 基于配置文件进行明确操作 |
| 声明式对象配置 | YAML 文件/目录 | 描述资源最终状态 | 创建、更新和持续维护资源 |
分别来看:
命令式对象管理
bash
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
特点:

命令式对象配置
bash
kubectl create -f nginx-pod.yaml
特点:

声明式对象配置
bash
kubectl apply -f nginx-pod.yaml
特点:

三种方式的优缺点
1. 命令式对象管理
优点
最大的优势就是简单。
例如查询 Pod:
bash
kubectl get pods
删除 Pod:
bash
kubectl delete pod nginx-pod
都非常方便。
对于临时测试或者查询操作来说,直接使用命令效率很高。
缺点
如果创建复杂资源,大量配置参数全部写在命令行中,会导致:
text
命令越来越长
配置不容易保存
历史修改不容易追踪
多人协作困难
重复部署困难
因此这种方式更加适合简单操作,而不是维护复杂的资源定义。
命令式对象配置的优缺点
命令式对象配置解决了纯命令操作难以保存配置的问题。
资源定义可以保存到 YAML 文件中,例如:
text
nginx-pod.yaml
然后执行:
bash
kubectl create -f nginx-pod.yaml
这样 YAML 文件就可以:
text
保存
备份
复制
共享
版本管理
相比直接输入长命令,可维护性明显提高。
但它仍然需要人为指定具体动作。
例如:
bash
kubectl create -f nginx-pod.yaml
明确表示:
text
创建
而:
bash
kubectl delete -f nginx-pod.yaml
明确表示:
text
删除
因此:
YAML 文件负责描述资源,kubectl 后面的具体命令仍然决定了需要执行的动作。
声明式对象配置的优势
声明式对象配置进一步弱化了"具体执行什么动作"的概念。
例如:
bash
kubectl apply -f nginx-pod.yaml
重点不再是:
text
创建这个资源
或者:
text
修改这个资源
而是:
text
让集群中的资源最终符合
nginx-pod.yaml 描述的状态
例如第一次执行:
bash
kubectl apply -f nginx-pod.yaml
如果资源不存在:

如果再次执行,而 YAML 没有变化:

如果修改了 YAML:

所以 apply 可以简单理解为:

这也是声明式管理非常方便的地方。
为什么 YAML 在 Kubernetes 中如此重要?
随着 Kubernetes 使用深入,会发现 YAML 文件出现得越来越频繁。
原因就在于 Kubernetes 本身非常强调:
期望状态。
例如我们可以通过 YAML 描述:
yaml
replicas: 3
表达:
text
我希望有 3 个副本
通过:
yaml
image: nginx:1.17.1
表达:
text
我希望容器运行 nginx:1.17.1
通过:
yaml
containerPort: 80
表达:
text
我希望容器开放 80 端口
也就是说,YAML 本质上是在描述:
text
资源应该是什么样子
而不是:
text
具体一步一步应该怎么做
这与 Kubernetes 的声明式管理思想天然契合。
三种方式应该如何选择?
实际使用时,并不是只能选择其中一种。
三种方式可以根据具体场景结合使用。
一种比较容易理解的使用思路是:
text
查询资源
↓
命令式对象管理
例如:
bash
kubectl get pods
kubectl describe pod nginx-pod
对于创建和更新需要长期维护的资源,可以使用:
text
声明式对象配置
↓
kubectl apply
例如:
bash
kubectl apply -f nginx-pod.yaml
需要根据配置文件删除资源时,可以使用:
bash
kubectl delete -f nginx-pod.yaml
因此可以形成这样一套思路:

从运维场景理解三种方式
假设现在需要部署一个 Nginx 应用。
如果只是临时测试,可以直接执行:
bash
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
这种方式速度快,非常适合快速验证。
但如果这个 Nginx 需要长期运行,那么更适合把资源配置保存下来:
text
nginx-pod.yaml
然后通过:
bash
kubectl apply -f nginx-pod.yaml
进行管理。
这样以后即使换了一台机器,只要拥有 YAML 文件,就能够重新描述相同的资源状态。
同时 YAML 文件还可以提交到 Git:

这样资源配置的每次修改都可以留下记录。
这也是 Kubernetes 配置文件非常适合与版本控制系统结合的重要原因。
一个简单的记忆方法
三种资源管理方式容易混淆,可以通过下面的方法记忆。
命令式对象管理
text
命令
例如:
bash
kubectl run ...
记忆:
我直接告诉 Kubernetes 做什么。
命令式对象配置
text
命令 + YAML
例如:
bash
kubectl create -f xxx.yaml
记忆:
YAML 提供资源配置,我告诉 Kubernetes 执行什么动作。
声明式对象配置
text
apply + YAML
例如:
bash
kubectl apply -f xxx.yaml
记忆:
我告诉 Kubernetes 最终想要什么状态。
最终可以浓缩成:

总结
Kubernetes 资源管理主要可以分为三种方式:
命令式对象管理、命令式对象配置、声明式对象配置。
三者最大的区别在于操作资源的思路不同。
命令式对象管理:
text
直接告诉 Kubernetes 执行什么操作
命令式对象配置:
text
通过具体命令 + YAML 配置文件操作资源
声明式对象配置:
text
通过 YAML 描述资源期望状态
由 Kubernetes 判断应该如何达到目标状态
其中尤其需要理解声明式思想。
可以用一句话概括:
命令式关注"怎么做",声明式关注"最终要什么"。
随着 Kubernetes 管理规模不断增大,资源配置通常会逐渐从简单的命令操作转向 YAML 配置以及声明式管理。
因此,掌握这三种资源管理方式之后,下一步就可以进一步学习 kubectl 的具体使用方法,以及 Kubernetes 中各种资源的 YAML 配置方式。
若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/165975077