Kubernetes 资源管理方式详解:命令式与声明式管理

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 的资源管理方式分为三类:

  1. 命令式对象管理
  2. 命令式对象配置
  3. 声明式对象配置

这三种方式的核心区别在于:

理解这三种方式,是掌握 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

相关推荐
程序猿小郑7 小时前
Docker Compose 构建完整服务实战指南:从入门到最佳实践
docker·容器
行百里er10 小时前
5 分钟跑起 Redis(Docker 版)
redis·后端·docker
Mr.朱鹏10 小时前
Docker三剑客实战指南:Docker、Dockerfile 和 Docker Compose
python·docker·devops·dockerfile
鬼先生_sir11 小时前
Docker 完整教程
docker
java_logo11 小时前
Docker 一键部署 Jellyfin:快速搭建私有化媒体服务器
docker·私有化部署·jellyfin·硬件加速·媒体服务器·轩辕镜像·影音库
jianpeng的工程笔记13 小时前
WeKnora 搭建研发 EDA 知识库:Docker 部署、RAG 与 Wiki 实践
docker·知识库·eda·rag
ZeroNews内网穿透13 小时前
内网部署 Halo 建站,用 ZeroNews 免费内网穿透安全发布到公网(无公网 IP 也能 HTTPS 访问)
docker·https·内网穿透·nas·反向代理·halo·zeronews
九皇叔叔1 天前
K8S 资源菜单
docker·容器·kubernetes·k8s
wdfk_prog1 天前
ROS教程08:从 TransportTCP::connect() 追到 TCPROS Connection Header、序列化与 Socket 数据传输
运维·缓存·docker·容器·ros