趋近智
在管理 Kubernetes 时,您可以使用 kubectl 向 Kubernetes API 服务器传达您的意图。这些意图的表达遵循两种不同的管理模型:指令式和声明式。虽然两种模型都可以使用,但了解它们之间的区别对于高效且可靠地管理应用程序非常有用。
指令式模型就像给出直接的、分步的指令。您确切地告诉 Kubernetes 做什么 以及 什么时候做。如果您想创建一个资源,就运行一个创建命令。如果您想对其进行扩缩容,就运行一个扩缩容命令。
例如,要启动一个 Nginx 容器,您可能会运行:
# 创建一个名为 'nginx-web' 的 Deployment,使用 nginx 镜像
kubectl create deployment nginx-web --image=nginx
该命令指示 API 服务器创建一个 Deployment 对象。稍后,如果您决定需要三个该应用程序的实例来实现冗余,您将发出另一个命令:
# 将 'nginx-web' Deployment 的副本数扩容至 3
kubectl scale deployment nginx-web --replicas=3
指令式模型的特点:
create(创建)、scale(扩缩容)、expose(暴露服务)或 delete(删除)。指令式方法对于学习和尝试很有帮助,但在生产系统中很快就会变得难以管理。它会导致“配置漂移”,即集群的运行状态会逐渐偏离您最初的设定,且没有关于如何变成现状的审计历史。
声明式模型将重点从“如何做”转向“做什么”。您不再告诉 Kubernetes 要执行的一系列步骤,而是提供一个通常由 YAML 编写的清单文件(manifest),其中描述了您希望达到的 最终状态。
您在 .yaml 文件中定义应用程序的所有特征:要使用的容器镜像、副本数量、要暴露的端口以及任何其他配置。然后,您指示 Kubernetes 使集群的状态与文件中描述的状态相匹配。
以下是同一个 Nginx 应用程序的简单 Deployment 清单:
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-web
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
要应用此期望状态,您只需使用一条命令:
kubectl apply -f nginx-deployment.yaml
当 Kubernetes 接收到此清单时,其控制平面组件会努力使当前状态与您的期望状态保持一致。
nginx-web Deployment 不存在,Kubernetes 会创建它并带有三个副本。如果您稍后需要将容器镜像更改为新版本,只需更新 YAML 文件中的 image 字段并再次运行 kubectl apply -f nginx-deployment.yaml。Kubernetes 将智能地执行滚动更新以实现新的期望状态。
指令式工作流包含一系列直接命令,而声明式工作流侧重于在清单文件中定义期望状态,并让 Kubernetes 控制器调谐集群以与之匹配。
对于 Kubernetes 的任何正式使用,声明式模型都是推荐的方法。它的优点对于构建可靠的系统至关重要:
kubectl apply 命令是幂等的,这意味着您可以对同一个文件重复运行它,结果都是一样的。Kubernetes 会计算期望状态与当前状态之间的差异,并仅执行必要的动作。这使得通过 CI/CD 流水线实现的自动化变得安全且可预测。在整个课程中,我们几乎只专注于声明式模型。虽然我们可能会使用指令式命令进行查看和调试,但所有应用程序定义都将通过 YAML 清单完成。这种做法为在 Kubernetes 上管理复杂的、生产级的应用程序奠定了基础。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造