K8S的项目发布方式

SunnyFan大约 4 分钟约 1064 字

K8S的项目发布方式

项目的发布方式

准备的镜像:
registry.cn-hangzhou.aliyuncs.com/gerry-docker/k8s-deploy-v1:v1open in new window
registry.cn-hangzhou.aliyuncs.com/gerry-docker/k8s-deploy-v2:v2open in new window

蓝绿发布

定义:蓝绿部署就是不停止旧版本,直接部署新版本然后进行测试,测试验证OK后,将流量全部切换到新版本,同时将旧版本也升级到新版本(或者可以将旧版本直接停掉)
优点: 无需停机,风险较小
缺点: 切换是全量的,如果版本2有问题,则对用户体验有直接影响, 需要双倍机器资源。

部署过程:

  1. 部署v1的应用(初始状态) 所有外部请求的流量都会打到这个版本上
  2. 部署版本2的应用 版本2的代码与版本1不同
  3. 如果版本2测试正常,就可以将流量切换到版本2
  4. 稳定运行一段时间,没问题就删除版本1正在使用的资源(例如实例),从此正式使用版本2

准备发布的yaml文件内容

#bluegreem.yaml
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/gerry-docker/k8s-deploy-v1:v1
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: bluegreen
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: bluegreen
    version: v1.0
  type: ClusterIP

修改bluegreen.yaml
deployment-name: blue —> green
image: v1.0—> v2.0

重新部署green

查看Pod可以发现两个一开始green,blue 两种pod共存(一共有八个pod),访问之前的ClusterIP地址,返回结果没有变化

修改service的内容(把流量切到2.0的版本中)
version: v1.0 —> v2.0

访问测试流量切换

灰度发布(金丝雀)

部署过程:

  1. 准备好部署各个阶段的工件
  2. 从负载均衡列表中移除掉“金丝雀”服务器。
  3. 升级“金丝雀”应用(排掉原有流量并进行部署)。
  4. 对应用进行自动化测试。
  5. 将“金丝雀”服务器重新添加到负载均衡列表中(连通性和健康检查)。如果“金丝雀”在线使用测试成功,升级剩余的其他服务器。(否则就回滚)

优点: 用户体验影响小,灰度发布过程出现问题只影响部分用户。

具体步骤跟上述差不多,只不过上面的service在切换的时候直接根据版本来切换,所以流量会全部切换过去,想要实现灰度部署的结果只需要把service的selector里的version标签去掉就好(两个版本的app标签都是一样的,镜像不一样,但是不影响service筛选需要负载的pod) 可以按照各自版本的设置不同的replicas,流量会按照比例进行分配

持续访问service,可以看到请求被分发到不同的版本(如果不想增加pod数量,可以修改下每个版本pod的replicas数目)

while sleep 0.2;do curl curl http://10.104.89.32 | grep "Deploy Version"; echo "";done

滚动更新

定义:一般是取出一个或者多个服务器停止服务,更新版本后重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本。

这种部署方式相对于蓝绿部署,更加节约资源——它不需要运行两个集群、两倍的实例数。我们可以部分部署,例如每次只取出集群的25%进行升级。

创建Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gerry-deployment
  labels:
    app: gerry-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: gerry-pod
  template:
    metadata:
      labels:
        app: gerry-pod
    spec:
      containers:
      - name: gerry-container
        image: registry.cn-hangzhou.aliyuncs.com/gerry-docker/k8s-deploy-v1:v1
        ports:
        - containerPort: 80

监控Deployment的状态

kubectl get deployment gerry-deployment -w

更新容器镜像

kubectl set image deployment/gerry-deployment gerry-container=registry.cn-hangzhou.aliyuncs.com/gerry-docker/k8s-deploy-v2:v2 --record

## 持续访问
while sleep 0.2;do curl curl http://10.110.155.221 | grep "Deploy Version"; echo "";done

查看Deployment滚动配置

kubectl  describe deployment gerry-deployment

检查 Deployment 修订历史

kubectl rollout history deployment gerry-deployment

回滚到之前的修订版本

kubectl  rollout  undo  deployment gerry-deployment  ## 回滚到上一个版本
kubectl  rollout  undo  deployment gerry-deployment --to-revision=1 ##回滚到指定版本