apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.8
ports:
- containerPort: 80
image.png
类似 Deployment 这样的一个控制器,实际上都是由上半部分的控制器定义(包括期望状态),加上下半部分的被控制对象的模板组成的。
Deployment版本控制
Kubernetes 项目中一个非常重要的功能:
Pod的“水平扩展 / 收缩”(horizontal scaling out/in)。
Deployment 同样通过“控制器模式”,来操作 ReplicaSet 的个数和属性,进而实现水平扩展 / 收缩和滚动更新这两个编排动作。
扩容
kubectl scale deployment nginx-deployment --replicas=3
kubectl get pods
nginx-deployment-69fbc8b64f-4f97r 1/1 Running 0 95m
nginx-deployment-69fbc8b64f-4n9nj 1/1 Running 0 95m
nginx-deployment-69fbc8b64f-wdjcs 1/1 Running 0 95m
滚动更新
Deployment Controller 还会确保,在任何时间窗口内,只有指定比例的 Pod 处于离线状态。同时,它也会确保,在任何时间窗口内,只有指定比例的新 Pod 被创建出来。这两个比例的值都是可以配置的,默认都是 DESIRED 值的 25%。
kubectl create -f nginx-deployment.yaml --record
#record 的作用在于记录每次操作的命令
Deployment 对应用进行版本控制的具体原理
设置错误的镜像版本
kubectl set image deployment/nginx-deployment nginx=nginx:1.91
查看ReplicaSet 的状态:
kubectl get rs
Deployment 回滚到上一个版本
kubectl rollout undo deployment [deployment-name]
查看每次 Deployment 变更对应的版本
kubectl rollout history deployment [deployment-name]
看到每个版本对应的 Deployment 的API 对象的细节
kubectl rollout history deployment/[deployment-name] --revision=2
回滚指定版本
kubectl rollout undo deployment/[deployment-name] --to-revision=2
Deployment 的多次更新操作,最后只生成一个 ReplicaSe
kubectl rollout pause deployment/nginx-deployment
# Deployment 进入“暂停”状态
kubectl rollout resume deploy/nginx-deployment
# Deployment“恢复”
你就可以随意使用 kubectl edit 或者 kubectl set image 指令,修改这个Deployment 的内容了
Deployment 正处于“暂停”状态,所以我们对 Deployment 的所有修改,都不会触发新的“滚动更新”,也不会创建新的 ReplicaSet。
Deployment 修改操作都完成之后,只需要再执行一条 kubectl rollout resume
指令,就可以把这个 Deployment“恢复”回来
Deployment 实际上是一个两层控制器。
首先,它通过ReplicaSet 的个数来描述应用的版本.然后,它再通过ReplicaSet 的属性(比如 replicas 的值),来保证 Pod 的副本数量。
控制这些“历史”ReplicaSet 的数量
kubectl edit deployment nginx-deployment
image.png
网友评论