Kubernetes Deployment是Kubernetes中用于管理应用程序副本的对象,它提供了对应用程序的声明式定义,自动化部署、扩展和更新
「ReplicaSet」:Deployment使用ReplicaSet来确保指定数量的Pod副本正在运行。如果有Pod意外终止,ReplicaSet会创建新的Pod来代替。
「自动修复」:当使用Deployment时,Kubernetes能够自动修复故障,确保系统中运行指定数量的Pod。
「滚动升级」:Deployment支持滚动升级,允许无缝地将应用程序从旧版本切换到新版本,而不会中断服务。
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
labels:
app: deployment-nginx
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
selector:
matchLabels:
app: deployment-nginx
template:
metadata:
labels:
app: deployment-nginx
spec:
containers:
- name: deployment-nginx
imagePullPolicy: IfNotPresent
image: nginx:1.14.2
ports:
- containerPort: 80
kubectl get deploy,pod,rs
kubectl set image deployment/deployment-nginx deployment-nginx=nginx:1.16.1
kubectl get deploy,pod,rs
从结果可以看出,滚动更新并不是结束所有pod,我们再看下Recreate
# 编辑模版更新
kubectl edit deployment deployment-nginx
kubectl get deploy,pod,rs
从图中可以看这种策略会将所有的pod全部杀死,这会导致该pod不可用
kubectl scale deployment/deployment-nginx --replicas=5
kubectl rollout history deployment/deployment-nginx
可以看到我们已经更新了三个版本,但是change-cause看不到内容,不过我们可以用另外的命令能看到具体详情
kubectl rollout history deployment/deployment-nginx --revision=版本号
那回到第一个问题,我想在每次更新后,给当前版本家CHANGE-CASE,应该怎么做
# 第一种方式 在执行更新命令时加上 --record,虽然可以使用,但是已经被提示在将来版本会被移除
kubectl set image deployment/deployment-nginx deployment-nginx=nginx:1.16.1 --record
# 第二种方式,就是官方推荐的,使用annotate 方式
kubectl annotate deployment/deployment-nginx kubernetes.io/change-cause="image updated to 1.16.1"
大家可能注意到12版本没有了,这是因为k8s默认只会保留3个版本,我们可以通过设置spec.revisionHistoryLimit: 1
kubectl rollout undo deployment/deployment-nginx --to-revision=4
# 暂停保存后自动更新
kubectl rollout pause deployment/deployment-nginx
kubectl rollout resume deployment/deployment-nginx