一、常见的部署方案
- 滚动更新
- 服务不会停止,但是整个pod会有新旧并存的情况。
- 重新创建
- 先停止旧的pod,然后再创建新的pod,这个过程服务是会间断的。
- 蓝绿 (无需停机,风险较小)
- 部署v1的应用(一开始的状态)所有外部请求的流量都打到这个版本上
- 部署版本2的应用版本2的代码与版本1不同(新功能、Bug修复等)
- 将流量从版本1切换到版本2。
- 如版本2测试正常,就删除版本1正在使用的资源(例如实例),从此正式用版本2。
- 金丝雀
1.1 、滚动更新
- maxSurge :滚动升级时先启动的pod数量
- maxUnavailable :滚动升级时允许的最大unavailable的pod数量
(1)创建文件rollingupdate.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: rollingupdate
spec:
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
selector:
matchLabels:
app: rollingupdate
replicas: 4
template:
metadata:
labels:
app: rollingupdate
spec:
containers:
- name: rollingupdate
image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v1.0
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: rollingupdate
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: rollingupdate
type: ClusterIP
(2)执行脚本
kubectl apply -f rollingupdate.yaml
(3)查看pods
kubectl get pods
(4) 查看svc
kubectl get svc
(5) 上面成功后就可以直接通过ip进行访问pod对应的服务的
curl cluster-ip/dockerfile
(6) 前面如果都成功了,那下面要做的事就是实现滚动更新动作了,先修改rollingupdate.yaml文件,将镜像修改成v2.0 然后保存文件
(7)在w1上,不断地访问观察输出
while sleep 0.2;do curl cluster-ip/dockerfile;echo "";done
(8)在w2上,监控pod
kubectl get pods -w
(7)执行apply操作让文件重新生效变成2.0版本
kubectl apply -f rollingupdate.yaml
(8)执行下面命令会发现有新老版本的替换的过程
kubectl get pods
1.2、 重新创建
apiVersion: apps/v1
kind: Deployment
metadata:
name: recreate
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: recreate
replicas: 4
template:
metadata:
labels:
app: recreate
spec:
containers:
- name: recreate
image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v1.0
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 8080
(2)执行脚本
kubectl apply -f rollingupdate.yaml
(3)查看pods
kubectl get pods
(4)和前面一样修改recreate.yaml文件的版本号
kubectl apply -f recreate.yaml
(5)查看pod
kubectl get pods
(6)执行apply操作让文件重新生效变成2.0版本
kubectl apply -f rollingupdate.yaml
(7)执行下面命令会发现老版本停止后再启动新版本
kubectl get pods
1.3 、蓝绿
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: blue
spec:
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
selector:
matchLabels:
app: bluegreen
replicas: 4
template:
metadata:
labels:
app: bluegreen
version: v1.0
spec:
containers:
- name: bluegreen
image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v1.0
ports:
- containerPort: 8080
(2)执行脚本
kubectl apply -f bluegreen.yaml
(3)查看pods
kubectl get pods
apiVersion: v1
kind: Service
metadata:
name: bluegreen
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: bluegreen
version: v1.0
type: ClusterIP
(5)重新启动脚本
kubectl apply -f bluegreen-service.yaml
(6)查看svc
kubectl get svc
(7)在w1上不断访问观察
while sleep 0.3;do curl cluster-ip/dockerfile;echo "";done
(8)接下来就是要做将1.0版本升级到2.0版本了修改bluegreen.yaml,修改的内容我标记不同颜色
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: green
spec:
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
selector:
matchLabels:
app: bluegreen
replicas: 4
template:
metadata:
labels:
app: bluegreen
version: v2.0
spec:
containers:
- name: bluegreen
image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v2.0
ports:
- containerPort: 8080
(9)重新启动脚本
kubectl apply -f bluegreen.yaml
(10)查看pod
kubectl get pods
(11)同时观察刚才访问的地址有没有变化,可以发现,两个版本就共存了,并且之前访问的地址没有变化,那怎么切换版本呢,前面不是写了个bluegreen-service.yaml文件吗,很简单,修改bluegreen-service.yaml文件的指向就行,修改后的bluegreen-service.yaml文件如下
apiVersion: v1
kind: Service
metadata:
name: bluegreen
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
#也就是把流量切到了2.0版本中
selector:
app: bluegreen
version: v2.0
type: ClusterIP
(12)重启下bluegreen-service.yaml文件
kubectl apply -f bluegreen-service.yaml
(13)重新查看svc
kubectl get svc
(14)同时观察刚才访问的地址有没有变化,发现流量已经完全切到了v2.0的版本上
1.4、金丝雀
前面三种介绍完了,接下来说一种开发中常用的一种部署方式,在有些场景中,如果我们希望多版本共存,那部署怎么搞呢,方法就是接下来要说明的
(1)其实很简单,只用在我们1.3中的蓝绿部署中做一些小小的改变就好。修改下bluegreen-service.yaml文件,改动如下
apiVersion: v1
kind: Service
metadata:
name: bluegreen
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: bluegreen
version: v2.0 #把veersion删除掉只根据bluegreen进行选择
type: ClusterIP
(2)重启下bluegreen-service.yaml文件
kubectl apply -f bluegreen-service.yaml
(3)同时观察刚才访问的地址有没有变化,istio中就更方便咯,此时新旧版本能够同时被访问到,AB测试,新功能部署少一些的实例