kubernetes 部署_Kubernetes和Istio的部署策略

kubernetes 部署

在这篇文章中,我将讨论各种部署策略以及如何使用K8和Istio实施它们。 基本上,所有策略的实现都基于K8同时运行微服务的多个版本的能力以及消费者只能通过某个入口点访问微服务的概念。 在那个入口点,我们可以控制应该将消费者路由到哪个版本的微服务。

本文的示例应用程序将是包装在Docker映像中的简单Spring Boot应用程序。 所以有两个图像
superapp:oldsuperapp:new分别代表应用程序的旧版本和新版本:

docker run -d –name old -p 9001:8080 eugeneflexagon / superapp:old

docker run -d –name new -p 9002:8080 eugeneflexagon / superapp:new

卷曲http:// localhost:9001 / version

{“ id”:1,“ content”:“ old”}

卷曲http:// localhost:9002 / version

{“ id”:1,“ content”:“ new”}

假设应用程序的旧版本已部署到运行在Oracle Kubernetes Engine上的K8s集群, 并且具有以下清单:

 apiVersion: apps/v1beta1  kind: Deployment  metadata: 
   name: superapp  spec: 
   replicas: 3 
   template: 
     metadata: 
        labels: 
          app: superapp 
     spec: 
       containers: 
         - name: superapp 
           image: eugeneflexagon/superapp:old 
           ports: 
             - containerPort: 8080 

因此,有一个Pod的三个副本运行旧版本的应用程序。 还有一项服务将流量路由到这些吊舱:

 apiVersion: v1  kind: Service  metadata: 
   name: superapp  spec: 
   selector: 
     app: superapp 
   ports: 
     - port: 8080 
       targetPort: 8080 

滚动更新

此部署策略以滚动更新的方式更新Pod,并逐一更改。

部署策略


这是K8s群集本身处理的默认策略,因此我们只需要参考新映像来更新superapp部署:

 apiVersion: apps/v1beta1  kind: Deployment  metadata: 
   name: superapp  spec: 
   replicas: 3 
   template: 
     metadata: 
        labels: 
          app: superapp 
     spec: 
       containers: 
         - name: superapp 
           image: eugeneflexagon/superapp: new 
           ports: 
             - containerPort: 8080 

但是,我们可以通过在清单文件中为此部署策略提供参数来微调滚动更新算法:

 spec: 
   replicas: 3 
   strategy: 
     type: RollingUpdate 
     rollingUpdate: 
        maxSurge: 30 % 
        maxUnavailable: 30 % 
   template: 
   ... 

maxSurge参数定义可以在所需数量的容器上创建的最大容器数。 它可以是百分比或绝对数字。 默认值为25%。

maxUnavailable参数   定义在更新过程中不可用的Pod的最大数量。 它可以是百分比或绝对数字。 默认值为25%。


重新建立
这种部署策略将杀死所有旧的Pod,然后创建新的Pod。

部署策略
 spec: 
   replicas: 3 
   strategy: 
     type: Recreate 
   template: 
   ... 


很简单。

蓝绿

此策略将应用程序的旧版本定义为绿色 ,将新版本定义为蓝色 。 用户始终只能访问绿色版本。

部署策略
 apiVersion: apps/v1beta1  kind: Deployment  metadata: 
   name: superapp- 01  spec: 
   template: 
     metadata: 
        labels: 
          app: superapp 
          version: "01"  ...  apiVersion: v1  kind: Service  metadata: 
   name: superapp  spec: 
   selector: 
     app: superapp 
     version: "01"  ... 

该服务仅将流量路由到标签版本为“ 01”的窗格。

我们将蓝色版本部署到K8s集群,并使其仅用于QA或测试自动化工具(通过单独的服务或直接端口转发)。

部署策略
 apiVersion: apps/v1beta1  kind: Deployment  metadata: 
   name: superapp- 02  spec: 
   template: 
     metadata: 
        labels: 
          app: superapp 
          version: "02"  ... 

一旦测试了版本,我们就将服务切换到它并按比例缩小版本:

部署策略
 apiVersion: v1  kind: Service  metadata: 
   name: superapp  spec: 
   selector: 
     app: superapp 
     version: "02"  ... 
 kubectl scale deployment superapp- 01 --replicas= 0 

完成此操作后,所有用户都将使用新版本。

因此,到目前为止,没有Istio。 一切都由开箱即用的K8s集群处理。 让我们继续下一个策略。


金丝雀
我喜欢这种部署策略,因为它可以让用户测试应用程序的新版本,而他们甚至都不知道。 我们的想法是,我们部署该应用程序的新版本,并将10%的流量路由到该应用程序。 用户对此一无所知。

部署策略


如果一段时间,我们可以将流量平衡为70/30,然后是50/50,最后是0/100。
即使仅通过使用新旧Pod的数量就可以使用K8的资源来实施此策略,但使用Istio实施该方法更为方便。 因此,新旧应用程序定义为以下部署:

 apiVersion: apps/v1beta1  kind: Deployment  metadata: 
   name: superapp- 01  spec: 
   template: 
     metadata: 
        labels: 
          app: superapp 
          version: "01"  ... 
 apiVersion: apps/v1beta1  kind: Deployment  metadata: 
   name: superapp- 02  spec: 
   template: 
     metadata: 
        labels: 
          app: superapp 
          version: "02"  ... 

该服务将流量路由到它们两个:

 apiVersion: v1  kind: Service  metadata: 
   name: superapp  spec: 
   selector: 
     app: superapp  ... 

最重要的是,我们将使用以下Istio资源:
VirtualServiceDestinationRule。

 apiVersion: networking.istio.io/v1alpha3  kind: DestinationRule  metadata: 
   name: superapp  spec: 
   host: superapp 
   subsets: 
   - name: green 
     labels: 
       version: "01" 
   - name: blue 
     labels: 
       version: "02"  ---  apiVersion: networking.istio.io/v1alpha3  kind: VirtualService  metadata: 
   name: superapp  spec: 
   hosts: 
     - superapp 
   http: 
   - match: 
     - uri: 
         prefix: /version 
     route: 
     - destination: 
         port: 
           number: 8080 
         host: superapp 
         subset: green 
       weight: 90 
     - destination: 
         port: 
           number: 8080 
         host: superapp 
         subset: blue 
       weight: 10 

VirtualService将根据提供的权重(90/10)将进入超级应用程序服务(主机)的所有流量路由到绿色蓝色吊舱。

A / B测试

通过这种策略,我们可以精确地控制将哪些用户,哪些设备,部门等路由到该应用程序的新版本。

部署策略


例如,在这里我们将分析请求标头,如果其自定义标签“最终用户”等于“ xammer” ,它将被路由到应用程序的新版本。 其余请求将路由到旧请求:

 apiVersion: networking.istio.io/v1alpha3  kind: VirtualService  metadata: 
   name: superapp  spec: 
   gateways: 
     - superapp 
   hosts: 
     - superapp 
   http: 
   - match: 
     - headers: 
         end-user: 
           exact: xammer 
     route: 
     - destination: 
         port: 
           number: 8080 
         host: superapp 
         subset: blue 
   - route: 
     - destination: 
         port: 
           number: 8080 
         host: superapp 
         subset: green 

GitHub上提供了此文章的所有示例和清单文件,因此您可以自己使用各种策略和复杂的路由规则。 您只需要预装Istio的K8s集群(例如,笔记本电脑上的Minikube)。 部署愉快!

而已!

翻译自: https://www.javacodegeeks.com/2019/04/deployment-strategies-kubernetes-istio.html

kubernetes 部署

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值