K8S中Deployment
Deployment 同样也是Kubernetes 系统的一个核心概念,主要职责和RC一样的都是保证 Pod 的数量和健康,二者大部分功能都是完全一致的,可以看成是一个升级版的RC控制器,
特征:
RC 的全部功能:
Deployment 具备上面描述的RC 的全部功能
事件和状态查看:可以查看Deployment 的升级详细进度和状态 回滚:当升级Pod 的时候如果出现问题,可以使用回滚操作回滚到之前的任一版本
版本记录:每一次对Deployment 的操作,都能够保存下来,这也是保证可以回滚到任一版本的基础
暂停和启动:对于每一次升级都能够随时暂停和启动
一个Deployment拥有多个Replica Set(RS),而一个Replica Set拥有一个或多个Pod。一个Deployment控制多个rs主要是为了支持回滚机 制,每当Deployment操作时,Kubernetes会重新生成一个Replica Set 并保留,以后有需要的话就可以回滚至之前的状态。
vim nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
labels:
k8s-app: nginx-demo
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.18.0
ports:
- containerPort: 80
kubectl get po,deploy -o wide #查看详细信息
滚动更新
spec:
replicas: 3
minReadySeconds: 5 #在启动后5秒中后分发流量
strategy:
# 指定滚动更新的策略
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
minReadySeconds:
Kubernetes在等待设置的时间后才进行升级
如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了
如果没有设置该值,在某些极端情况下可能会造成服务不正常运行
maxSurge:
升级过程中最多可以比原先设置多出的POD数量
例如:maxSurge=1,replicas=5,则表示Kubernetes会先启动1一 个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有5+1个 POD。
maxUnavaible:
升级过程中最多有多少个POD处于无法提供服务的状态
当maxSurge不为0时,该值也不能为0
例如:maxUnavaible=1,则表示Kubernetes整个升级过程中最多 会有1个POD处于无法服务的状态。
#暂停升级
kubectl rollout pause deployment <deployment>
#继续升级
kubectl rollout resume deployment <deployment>
#升级后可查看
kubectl get rs
回滚 Deployment
查看Deployment的升级历史:
kubectl rollout history deployment nginx-deploy
deployment.apps/nginx-deploy
REVISION CHANGE-CAUSE
1 <none> #这里是改变的原因如果需要记录的话启动加参数--record=true
2 <none>
kubectl apply -f nginx.yaml --record=true
上生产时,最好通过设置Deployment的.spec.revisionHistoryLimit 来 限制最大保留的revision number,比如15个版本,回滚的时候一般只会 回滚到最近的几个版本就足够了。其实rollout history中记录的 revision都和 ReplicaSets一一对应。如果手动delete 某个 ReplicaSet,对应的rollout history就会被删除,也就是还说你无法回滚到这个revison了。
rollout history和ReplicaSet 的对应关系,可以在kubectl describe rs $RSNAME 返回的revision字段中得到,这里的revision就 对应着 rollout history返回的revison。
回退版本:
#回退到上一个版本
kubectl rollout undo deployment nginx-deploy
#回退到指定版本
kubectl rollout undo deployment nginx-deploy --to-revision=2