2. 创建第一个Deployment:使用kubectl create deployment命令、YAML文件结构解析
在Kubernetes集群中,Deployment是最常用的工作负载控制器之一。它负责声明式地管理Pod副本、滚动更新、回滚以及扩缩容。本节将带领你通过两种方式创建第一个Deployment:命令式(kubectl create deployment)和声明式(YAML文件),并深入解析YAML文件的核心结构。
2.1 使用kubectl create deployment命令快速创建
kubectl create deployment是Kubernetes提供的命令式创建方式,适合快速启动一个Deployment进行测试或验证。其基本语法如下:
kubectl create deployment <deployment-name> --image=<image-name> [--replicas=<副本数>] [--port=<容器端口>]
示例:创建一个名为nginx-deploy的Deployment,运行Nginx镜像,副本数为3。
kubectl create deployment nginx-deploy --image=nginx:1.25 --replicas=3 --port=80
执行后,Kubernetes会自动生成一个Deployment对象,并创建3个Nginx Pod。你可以通过以下命令验证:
kubectl get deployments
kubectl get pods -l app=nginx-deploy
提示:命令式创建虽然快捷,但缺乏版本控制和可重复性。在生产环境中,推荐使用YAML文件进行声明式管理。
2.2 YAML文件结构解析
YAML(YAML Ain't Markup Language)是Kubernetes资源对象的声明式定义语言。一个标准的Deployment YAML文件包含四个核心字段:apiVersion、kind、metadata和spec。下面是一个完整的Deployment YAML示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
下表详细解释了每个字段的作用:
| 字段 | 说明 | 示例值 |
|---|---|---|
apiVersion |
定义Kubernetes API的版本。Deployment在稳定版中使用apps/v1。 |
apps/v1 |
kind |
指定资源对象的类型。对于工作负载控制器,此处为Deployment。 |
Deployment |
metadata |
包含资源的元数据,如名称、命名空间、标签和注解。 | name: nginx-deploy |
spec |
定义Deployment的期望状态,包括副本数、选择器、Pod模板等。 | 见下文详解 |
2.3 spec字段深度解析
spec是Deployment的核心,它定义了控制器如何管理Pod。主要子字段包括:
replicas:期望的Pod副本数量。Kubernetes会确保集群中始终运行指定数量的Pod。selector:标签选择器,用于匹配Deployment管理的Pod。必须与Pod模板中的标签一致。template:Pod模板,定义了Pod的规格,包括容器、镜像、端口、环境变量等。
关键点:
selector.matchLabels与template.metadata.labels必须完全匹配,否则Deployment无法正确管理Pod。
下面通过一个SVG图展示Deployment YAML文件的结构层次:
2.4 使用YAML文件创建Deployment
声明式创建方式通过kubectl apply -f命令应用YAML文件,Kubernetes会根据文件内容创建或更新资源。步骤如下:
- 编写YAML文件:将上述示例保存为
nginx-deployment.yaml。 - 应用YAML文件:
kubectl apply -f nginx-deployment.yaml
- 验证Deployment状态:
kubectl get deployment nginx-deploy -o wide
kubectl describe deployment nginx-deploy
注意:如果YAML文件格式错误(如缩进不一致、字段拼写错误),
kubectl apply会报错。建议使用kubectl apply --dry-run=client -f nginx-deployment.yaml进行预检。
2.5 命令式 vs 声明式:对比总结
| 特性 | 命令式(kubectl create deployment) | 声明式(YAML + kubectl apply) |
|---|---|---|
| 创建速度 | 快速,适合临时测试 | 需要编写文件,稍慢 |
| 可重复性 | 低,参数需手动记忆 | 高,文件可版本控制 |
| 可读性 | 一般,参数分散 | 高,结构清晰 |
| 更新方式 | 需使用kubectl set或kubectl edit |
修改YAML后重新apply |
| 生产环境推荐 | 不推荐 | 强烈推荐 |