Kubernetes Deployment
滚动发布
滚动发布 Rolling Update: 高级发布策略,按批次一次替换老版本,逐步升级到新版本。发布过程中,应用不中断,用户体验平滑。如下图所示,每批次可以发布一个实例,或者多个实例,验证没有问题,可以继续发布多个实例。
蓝绿发布
蓝绿发布可以配合金丝雀发布,先发一个或者少量实例,验证流量,验证通过之后,可以蓝绿切换,完成升级。
K8S Deployment原理
ReplicaSet是对pod的包装,Deployment是对replicaset和滚动发布的流程一起包装起来,实现了自动化。
通过Deployment调度实现滚动发布的图例。
- 绿色应用老版本v1.0.0对应的replicaset是v1.0.0,然后通过deployment发布应用的v1.0.1蓝色版本。
- 发布之后,会创建一个新的replicaset v1.0.1. 之后deployment 会一次滚动。不管的创建和拉入新的POD并拉出和关闭绿色的POD。在过程中,deployment会保证始终有POD保持可用状态。
- 前置的Service会屏蔽POD地址的变化,让用户对发布过程无感知。
- 如果在发布过程中,蓝色POD有问题,健康检查通不过,deployment会自动终止,并回退发布。
- 即使发布成功,工程师也可以通过deployment回退版本。
Deployment发布规范样例
官方样例:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#deployment-v1-apps
v1.0.0
本实验,我们需要创建文件有:
- petclinic-deployment.yml
- petclinic-service.yml
参考之前的样例文章,修改petclinic的发布文件。
petclinic-deployment.yml内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
# Unique key of the Deployment instance
name: petclinic
spec:
# 3 Pods should exist at all times.
replicas: 3
selector:
matchLabels:
app: petclinic
# 下面minReadySeconds不需要加,只为实验效果。10秒,表示POD起来之后,等10秒才算就绪。增加时延,查看滚动发布效果。
minReadySeconds: 10
template:
metadata:
labels:
# Apply this label to pods and default
# the Deployment label selector to this value
app: petclinic
spec:
containers:
- name: petclinic
# Run this image
image: spring2go/spring-petclinic:1.0.0.RELEASE
petclinic-service.yml内容如下:
apiVersion: v1
kind: Service
metadata:
# Unique key of the Service instance
name: petclinic
spec:
ports:
# Accept traffic sent to port 80
- name: http
# port为集群内部服务前通信的端口
port: 8080
targetPort: 8080
nodePort: 31080
selector:
# 下面标签app: petclinic表示本服务会路由指向所有app标签为petclinic的pod。
app: petclinic
type: NodePort
kubectl apply -f . #发布当前目录的两个文件
kubectl get all #查看POD发布情况
浏览器校验,访问localhost:31080
下面做滚动发布。
v1.0.1
petclinic-deployment.yml内容如下:注意镜像文件已升级。
apiVersion: apps/v1
kind: Deployment
metadata:
# Unique key of the Deployment instance
name: petclinic
spec:
# 3 Pods should exist at all times.
replicas: 3
selector:
matchLabels:
app: petclinic
# 下面minReadySeconds不需要加,只为实验效果。10秒,表示POD起来之后,等10秒才算就绪。增加时延,查看滚动发布效果。
minReadySeconds: 10
template:
metadata:
labels:
# Apply this label to pods and default
# the Deployment label selector to this value
app: petclinic
spec:
containers:
- name: petclinic
# Run this image
image: spring2go/spring-petclinic:1.0.1.RELEASE
petclinic-service.yml内容如下:内容不变
apiVersion: v1
kind: Service
metadata:
# Unique key of the Service instance
name: petclinic
spec:
ports:
# Accept traffic sent to port 80
- name: http
# port为集群内部服务前通信的端口
port: 8080
targetPort: 8080
nodePort: 31080
selector:
# 下面标签app: petclinic表示本服务会路由指向所有app标签为petclinic的pod。
app: petclinic
type: NodePort
kubectl apply -f . #发布当前目录的两个文件
kubectl get all #查看POD发布情况,重复命令,观察变化
会发现俩那个replicaset。
滚动发布结束后,老的replicaset会显示desired pod数为0,current pod数为0.
浏览器校验,访问localhost:31080
查看发布历史
kubectl rollout history deployment/petclinic
快速回滚
#回退到上一个版本:
kubectl rollout undo deployment/petclinic
#查看滚动回退状态,也可以用来查看滚动发布状态
kubectl rollout status deployment/petclinic
#查看发布历史
kubectl rollout history deployment/petclinic
#刷新浏览器,校验回滚结果。
回滚指定版本
kubectl rollout undo deployment/petclinic --to-revision=2
kubectl rollout history deployment/petclinic#刷新浏览器,校验回滚结果。
环境清理
#deploy为deployment缩写
kubectl delete deploy petclinic
#发现replicaset, pods都会被删除掉。
kubectl get all
kubectl delete svc petclinic
#环境清理完毕