博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kubernetes之蓝绿部署
阅读量:6231 次
发布时间:2019-06-21

本文共 3826 字,大约阅读时间需要 12 分钟。

【编者的话】毋庸置疑,Kubernetes目前已成为业内最炙手可热的容器编排框架。本文主要讲讲怎么用Kubernetes进行蓝绿部署以及如何自动化实现蓝绿部署。更多Kubernetes知识请关注
其他文章。


本文讲的是
Kubernetes之蓝绿部署对于那些有更多热情想投入其中的朋友,我已经在GitHub上上传了一个教程和一些示例清单。请访问 。
Kubernetes有一个非常棒的内置功能即部署(
)。当您将应用程序更新到一个新版本时,部署功能能够帮您对容器进行滚动更新。滚动更新是更新应用程序的一种很好的方法,因为您的应用程序在更新期间使用的资源数量,基本和不更新时所使用的资源相同,而且滚动更新过程中对性能和可用性影响最小。


尽管如此,仍然有许多老式的应用程序在滚动更新中不能很好地运行。一些应用程序只需要部署一个新版本,并需要立即切到这个版本。因此,我们需要执行蓝/绿部署。在进行蓝/绿部署时,应用程序的一个新副本(绿)将与现有版本(蓝)一起部署。然后更新应用程序的入口/路由器以切换到新版本(绿)。然后,您需要等待旧(蓝)版本来完成所有发送给它的请求,但是大多数情况下,应用程序的流量将一次更改为新版本。


Kubernetes不支持内置的蓝/绿部署。目前最好的方式是创建新的部署,然后更新应用程序的服务以指向新的部署。接下来让我们来看看这是啥意思。

蓝部署

Kubernetes部署指定一个应用程序的一组实例。在幕后,它创建一个副本,该副本负责保持指定数量的实例运行。


我们可以通过将以下yaml保存到blue.yaml文件中来创建我们的“蓝色”部署。

apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: nginx-1.10spec:replicas: 3template:metadata:  labels:    name: nginx    version: "1.10"spec:  containers:     - name: nginx      image: nginx:1.10      ports:        - name: http          containerPort: 80

然后可以使用kubectl命令创建部署。

$ kubectl apply -f blue.yaml

一旦我们进行了部署,我们可以通过创建一个服务来提供访问部署实例的方法。服务与部署分离,这意味着您不必在部署时明确指向服务。您需要做的是指定一个标签选择器,它的主要作用是列出构成服务的pods。当你使用部署时,通常会将其设置为与部署的pods相匹配。


在这种情况下,我们有两个标签,name=nginx和version=1.10。我们将这些设置为下面的服务的标签选择器。将下面的内容保存到service.yaml。

apiVersion: v1kind: Servicemetadata: name: nginxlabels: name: nginxspec:ports:- name: http  port: 80  targetPort: 80selector: name: nginxversion: "1.10"type: LoadBalancer

创建服务将创建一个可在集群外访问的负载均衡器。

$ kubectl apply -f service.yaml

现在我们看看已经部署的服务,如下图。


您可以测试该服务是否可访问并获取该版本。

$ EXTERNAL_IP = $( kubectl get svc nginx -o jsonpath = “{.status.loadBalancer.ingress [*]。ip}” ) $ curl -s http:// $ EXTERNAL_IP / version | grep nginx 

创建绿部署

对于“绿”部署,我们将部署“蓝”部署并行的新部署。如果以下是green.yaml……

apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: nginx-1.11spec:replicas: 3template:metadata:  labels:    name: nginx    version: "1.11"spec:  containers:     - name: nginx      image: nginx:1.11      ports:        - name: http          containerPort: 80

……我可以像这样创建新的部署。

$ kubectl apply -f green.yaml

现在我有两个部署,但服务仍然指向“蓝”部署。接下来我们要怎么做呢?


更新应用程序

要切换到“绿”部署,我们将更新服务的选择器。编辑service.yaml并将选择器版本更改为“1.11”。这将使它与“绿”部署中的pods匹配。

apiVersion: v1kind: Servicemetadata: name: nginxlabels: name: nginxspec:ports:- name: http  port: 80  targetPort: 80selector: name: nginxversion: "1.11"type: LoadBalancer

执行下面的命令将更新现有的nginx服务。

$ kubectl apply -f service.yaml

现在我们再看看已经部署的,如下图。


更新服务的选择器将立即被应用,因此您应该看到新版本的nginx正在提供服务。

$ EXTERNAL_IP = $( kubectl get svc nginx -o jsonpath = “{.status.loadBalancer.ingress [*]。ip}” ) $ curl -s http:// $ EXTERNAL_IP / version | grep nginx

自动化

您可以通过一些脚本来自动化跑您的蓝/绿部署。以下脚本将使用服务的名称,要部署的版本以及绿色部署的yaml文件的路径,并使用kubectl运行完整的蓝/绿部署,以从API中输出原始JSON,并使用jq进行解析。通过status.conditions在更新服务定义之前检查部署对象,等待绿部署准备就绪。


脚本为简单起见做出了一些假设,例如期望部署的名称为形式 - 并且存在用于选择器的name和version标签。kubectl是超级灵活的,你可以用它写你自己需要的任何东东。

#!/bin/bash

bg-deploy.sh <servicename> <version> <green-deployment.yaml>

Deployment name should be <service>-<version>

DEPLOYMENTNAME=$1-$2 SERVICE=$1 VERSION=$2 DEPLOYMENTFILE=$3 kubectl apply -f $DEPLOYMENTFILE

Wait until the Deployment is ready by checking the MinimumReplicasAvailable condition.

READY=$(kubectl get deploy $DEPLOYMENTNAME -o json | jq '.status.conditions[] | select(.reason == "MinimumReplicasAvailable") | .status' | tr -d '"') while [[ "$READY" != "True" ]]; do READY=$(kubectl get deploy $DEPLOYMENTNAME -o json | jq '.status.conditions[] | select(.reason == "MinimumReplicasAvailable") | .status' | tr -d '"') sleep 5 done

Update the service selector with the new version

kubectl patch svc $SERVICE -p "{\"spec\":{\"selector\": {\"name\": \"${SERVICE}\", \"version\":\"${VERSION}\"\}\}\}" echo "Done."

最后,真心希望Kubernetes可以原生支持蓝/绿部署,但这美好时刻来临之前,您可以通过上面的方式来实现自动化。如需要联系那些关心Kubernetes应用程序部署的童鞋,请查看
中的#sig-apps频道 。


原文链接:(译者:ds_sky2008)

原文发布时间为:2017-09-20

本文作者:

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:Kubernetes之蓝绿部署

转载地址:http://jyana.baihongyu.com/

你可能感兴趣的文章
变形 圆形_「Photoshop教程」使用变形工具和扭曲滤镜实现极坐标照片效果
查看>>
如何使用 mega unity_MEGA构建系统发育树,以及EvolView &amp; iTOL 的入门心得.
查看>>
华三交换机mode是什么意思_弱电工程师忘记了交换机和路由器的密码后如何处理?...
查看>>
2019 coling 论文列表_COLING2020-事件抽取/关系抽取/NER/少(零)样本 论文分类整理
查看>>
培养逻辑思维的app_数学逻辑思维app哪个好
查看>>
word加载外接程序出错_COM加载项的常见异常
查看>>
冒烟的意思_【冒烟】的意思是什么?【冒烟】是什么意思?
查看>>
os什么意思python_Python中import os是什么意思?
查看>>
初识python评课稿_GitHub - jingning42/ustc-course: USTC 评课平台
查看>>
html弄多个按钮_HTML表单上的多个提交按钮 - 将一个按钮指定为默认按钮
查看>>
django判断checkbox是否选中_django视图层之请求与响应
查看>>
group by 怎么用java对象接收_生产服务宕机,线上业务挂了!Promtheus 怎么又不报警了呢?...
查看>>
himawari-8卫星叶绿素a产品、_走过50年,看“风云”眼中的世界| 卫星看中国特别版...
查看>>
mybatis使用$报空指针_打破你的认知!Java空指针居然还能这样玩,90%人不知道…...
查看>>
windows mysql 重置root密码_在Windows下Mysql如何重置root用户密码
查看>>
mysql5.6 linux下载_mysql-5.6.45-linux-glibc2.12-x86_64.tar.gz下载安装
查看>>
r语言操作mysql_R语言 RMySQL连接操作mysql数据库
查看>>
mysql 整形相除_整型相除截断的技巧
查看>>
mysql备份字符集_浅谈MySQL备份字符集的问题
查看>>
dos下设置mysql密码_dos命令下修改mysql密码的方法
查看>>