ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-29 21:00:23  阅读:178  来源: 互联网

标签:kubectl name Kubernetes 部署 rollingupdate yaml bluegreen 版本 十四


一、常见的部署方案

  • 滚动更新

 

    • 服务不会停止,但是整个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测试,新功能部署少一些的实例

标签:kubectl,name,Kubernetes,部署,rollingupdate,yaml,bluegreen,版本,十四
来源: https://www.cnblogs.com/xing1/p/15848283.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有