Kubernetes常见的部署方案(十四)

一、常见的部署方案

  • 滚动更新
    • 服务不会停止,但是整个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、 重新创建

如果我们需求不希望新老版本共存,希望老版本全停后再上新版本就要用到这方法了
(1)编写recreate.yaml 文件
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 、蓝绿

蓝绿部署呢其实就是一个标饰,标记一个蓝色一个绿色,版本切换通过蓝和绿进行声明;
(1)创建一个bluegreen.yaml 
#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
 (4)写一个service脚本,文件名是bluegreen-service.yaml
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测试,新功能部署少一些的实例

上一篇:UIActionSheet警告,提示调用showFromTabBar方法


下一篇:Android:The connection to adb is down, and a severe error has occured.解决方法一