《Deployment 控制器》系列,共包含以下几篇文章:
- Deployment 控制器
- Deployment 的创建和使用(实战)
- Deployment 的状态
- Deployment 的清理策略及编写规则
- 应用的部署(一):金丝雀部署
- 应用的部署(二):蓝绿部署 & 滚动部署
😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!
Deployment 的创建和使用
创建 deployment-demo.yaml
文件,并在其中输入以下内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-demo
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
.metadata.name
:创建名为deployment-demo
的 Deployment。.spec.replicas
:指示 Deployment 创建具有 3 3 3 个副本的 Pod。.spec.selector
:定义 Deployment 如何查找要管理的 Pod。在这种情况下,只需在 Pod 模板中定义对应的标签,则 Kubernetes 会进行自动匹配。.spec.template
:定义 Pod 的相关属性(🚀 埋一个彩蛋,文末会提到)。.spec.template.metadata.labels
:给 Pod 添加标签 Label。.spec.template.spec
:使用 Nginx1.7.9
版本的镜像创建一个名为nginx
的容器,并暴露容器的端口。
运行以下命令创建 Deployment。
kubectl apply -f deployment-demo.yaml
查看创建的 Deployment 和 ReplicaSet。
kubectl get deployments,replicaset,pod
kubectl get deploy,rs,pod
输出的信息如下图所示:
查看每个 Pod 自动生成的标签。
kubectl get pods --show-labels
修改 YAML 文件来实现配置信息的更新。以下 YAML 文件将 Nginx 的版本升级到 1.9.1
并将 Pod 的副本数改成了 4
。
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-demo
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.9.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
🚀 也可以使用命令行的方式来实现更新,例如:
kubectl set image deploy deployment-demo nginx=nginx:1.9.1
运行以下命令重新应用 Deployment。
kubectl apply -f deployment-demo.yaml
获取 Deployment 的信息。
kubectl describe deployments deployment-demo
输出的信息如下:
执行以下命令将 Nginx 的版本更新为 1.7.9
。
kubectl --record deployment.apps/deployment-demo \
set image deployment.apps/deployment-demo nginx=nginx:1.7.9
🚀 为了能够追溯修改历史记录,这里使用了
--record
参数。
获取 Deployment 的信息。
kubectl describe deployments deployment-demo
输出的部分信息如下。可以看出,Nginx 的版本又回到了 1.7.9
。
我们看一下此时 ReplicaSet 的情况。
执行以下命令追溯修改的历史。
kubectl rollout history deployment deployment-demo
输出的信息如下:
执行以下命令将 Nginx 回滚到 2
版本。
kubectl rollout undo deployment deployment-demo --to-revision=2
重新获取 Deployment 的信息。
kubectl describe deployments deployment-demo
输出的信息如下。可以看到,Nginx 又回滚到 1.9.1
版本。
我们看一下此时 ReplicaSet 的情况。
以下命令将对 Deployment 进行缩放。
kubectl scale deployment deployment-demo --replicas=7
我们看一下此时 ReplicaSet 的情况。
我们编辑 deployment-demo.yaml
,将参数 replicas
改为 5
。
我们编辑 deployment-demo.yaml
,将 Nginx 的版本更新为 1.7.9
。
我们编辑 deployment-demo.yaml
,将 Nginx 的版本更新为 1.25.5
。
🚀 根据上述实验可知,只有修改了
pod
template
中的内容(即.spec.template
定义的内容),pod-template-hash
的值才会变化,才会生成一个新的 ReplicaSet 对象。
我们对 Deployment 进行的每一次更新操作,都会生成一个新的 ReplicaSet 对象,是不是有些多余,甚至浪费资源?所以,Kubernetes 项目还提供了一个指令,使得我们对 Deployment 的多次更新操作,最后只生成一个 ReplicaSet 对象。具体的做法是,在更新 Deployment 前,你要先执行一条 kubectl rollout pause
指令。它的用法如下所示:
kubectl rollout pause deployment deployment-demo
这个命令的作用,是让这个 Deployment 进入了一个 “暂停” 状态。由于此时 Deployment 正处于 “暂停” 状态,所以我们对 Deployment 的所有修改,都不会触发新的 “滚动更新”,也不会创建新的 ReplicaSet。而等到我们对 Deployment 修改操作都完成之后,只需要再执行一条 kubectl rollout resume
指令,就可以把它恢复回来,如下所示:
kubectl rollout resume deployment deployment-demo