Kubernetes容器环境持续交付

栏目: 服务器 · 发布时间: 7年前

内容简介:业内各大云服务商以及公司逐渐选择Kubernetes与Docker作为微服务支撑的首选平台。为了更好满足DevOps,我们采用了开源框架Spinnaker作为持续交付平台,完成服务的快速部署,回滚,A/B测试,以及金丝雀等等的部署方式,同时我们在生产做了多区的容灾,更好的保障线上服务。Spinnaker介绍Spinnaker是Netflix的开源项目,是一个持续交付平台,它定位于将产品快速且持续的部署到多种云平台上。Spinnaker有两个核心的功能集群管理和部署管理。Spinnaker通过将发布和各个云
编辑推荐:
本文来自于csdn,本文主要介绍为了更好满足DevOps,我们采用了开源框架Spinnaker作为持续交付平台,完成服务的快速部署。

业内各大云服务商以及公司逐渐选择Kubernetes与 Docker 作为微服务支撑的首选平台。为了更好满足DevOps,我们采用了开源框架Spinnaker作为持续交付平台,完成服务的快速部署,回滚,A/B测试,以及金丝雀等等的部署方式,同时我们在生产做了多区的容灾,更好的保障线上服务。

Spinnaker介绍

Spinnaker是Netflix的开源项目,是一个持续交付平台,它定位于将产品快速且持续的部署到多种云平台上。Spinnaker有两个核心的功能集群管理和部署管理。Spinnaker通过将发布和各个云平台解耦,来将部署流程流水线化,从而降低平台迁移或多云平台部署应用的复杂度,它本身内部支持Google、AWS EC2、Microsoft Azure、Kubernetes和OpenStack等云平台,并且它可以无缝集成其他持续集成(CI)流程,如Git、Jenkins、Travis CI、Docker registry、cron调度器等。

应用管理

Spinnaker主要用于展示与管理你的云端资源。

先要了解一些关键的概念:Applications,Cluster,and Server Groups,通过Load balancers and firewalls将服务展示给用户。官方给的结构如下:

Kubernetes容器环境持续交付

Application

定义了集群中一组的Cluster的集合,也包括了Firewalls与Load Balancers,存储了服务所有的部署相关的的信息。

Server Group

定义了一些基础的源比如(VM image、Docker image),以及一些基础的配置信息,一旦部署后,在容器中对应Kubernetes Pod的集合。

Cluster

Server Groups的有关联的集合。(Cluster中可以按照dev,prod的去创建不同的服务组),也可以理解为对于一个应用存在多个分支的情况。

Load Balancer

它在实例之间做负载均衡流量。您还可以为负载均衡器启用健康检查,灵活地定义健康标准并指定健康检查端点,有点类似于Kubernetes中Ingress。

Firewall

防火墙定义了网络流量访问,定义了一些访问的规则,如安全组等等。

页面预览

页面展示如下,还是比较精简的,可以在它的操作页面上看到项目以及应用的详细信息,还可以进行集群的伸缩、回滚、修改以及删除的操作。

Kubernetes容器环境持续交付

部署管理

上图中,Infrastructure左侧为Pipeline的设计:主要讲两块内容:Pipeline的创建以及基础功能,与部署的策略。

Pipeline

1.较强的Pipeline的能力:它的Pipeline可以复杂到无以复加,它还有很强的表达式功能(后续的操作中前面的参数均通过表达式获取)。

2.触发的方式:定时任务、人工触发、Jenkins job、Docker images,或者其他的Pipeline的步骤。

3.通知方式:Email、SMS or HipChat。

4.将所有的操作都融合到Pipeline中,比如回滚、金丝雀分析、关联CI等等。

部署策略

由于我们用的是Kubernetes Provider V2(Manifest Based)方式:可修改yaml中:spec.strategy.type。

1.Recreate,先将所有旧的Pod停止,然后再启动新的Pod对应其中的第一种方式。

2.RollingUpdate,即滚动升级,对应下图中第二种方式。

3.Canary下面会单独的介绍其中的使用。

Kubernetes容器环境持续交付

Spinnaker安装踩过的坑

很多人都是感觉这个很难安装,其实主要的原因还是墙的问题,只要把这个解决了就会方便很多,官方的文档写的很详细,而且Spinnaker的社区也非常的活跃,有问题均可以在上面进行提问。

安装提供的方式

1.Halyard安装方式(官方推荐安装方式)

2.Helm搭建Spinnaker平台

3.Development版本安装

我采用Halyard安装方式,因为后期我们会集成很多其他的插件,类似于GitLab、LDAP、Kayenta,甚至多个Jenkins,Kubernetes服务等等,可配置性较强。Helm方式若是需要自定义一些个性化的内容会比较复杂,完全依赖于原始镜像,而Development需要对Spinnaker非常的熟悉,以及每个版本之间的对应关系均要了解。

Halyard方式安装注意点

Halyard代理的配置

vim /opt/halyard/bin/halyard

DEFAULT_JVM_OPTS='-Dhttp.proxyHost=192.168.102.10 -Dhttps.proxyPort=3128'

部署机器选择

由于Spinnaker涉及的应用较多,下面会单独的介绍,需要消耗比较大的内存,官方推荐的配置如下:

18 GB of RAM

A 4 core CPU

Ubuntu 14.04, 16.04 or 18.04

Spinnaker安装步骤

Halyard下载以及安装。

1.选择云提供者:我选择的是Kubernetes Provider V2(Manifest Based),需要在部署Spinnaker的机器上完成Kubernetes集群的认证,以及权限管理。

2.部署的时候选择安装环境:我选择的是Debian包的方式。

3.选择存储:官方推荐使用Minio,我选择的是Minio的方式。

4.选择安装的版本:我当时最新的是V1.8.0。

5.接下来进行部署工作,初次部署时间较长,会连接代理下载对应的包。

6.全部下载与完成后,查看对应的日志,即可使用localhost:9000访问即可。

完成以上的步骤则可以在Kubernetes上面部署对应的应用了。

涉及的组件

下图是Spinnaker的各个组件之间的关系。

Kubernetes容器环境持续交付

Deck:面向用户UI界面组件,提供直观简介的操作界面,可视化操作发布部署流程。

API:面向调用API组件,我们可以不使用提供的UI,直接调用API操作,由它后台帮我们执行发布等任务。

Gate:是API的网关组件,可以理解为代理,所有请求由其代理转发。

Rosco:是构建beta镜像的组件,需要配置Packer组件使用。

Orca:是核心流程引擎组件,用来管理流程。

Igor:是用来集成其他CI系统组件,如Jenkins等一个组件。

Echo:是通知系统组件,发送邮件等信息。

Front50:是存储管理组件,需要配置 Redis 、Cassandra等组件使用。

Cloud driver:是用来适配不同的云平台的组件,比如Kubernetes、Google、AWS EC2、Microsoft Azure等。

Fiat:是鉴权的组件,配置权限管理,支持OAuth、SAML、LDAP、GitHub teams、Azure groups、 Google Groups等。

Kubernetes容器环境持续交付

Pipeline部署示例

如下Pipeline设计就是开发将版本合到某一个分支后,通过Jenkins镜像构建,发布测试环境,进而自动化以及人工验证,在由人工判断是否需要发布到线上以及回滚,若是选择发布到线上则发布到prod环境,从而进行prod自动化的CI。若是选择回滚则回滚到上个版本,从而进行dev自动化的CI。

Kubernetes容器环境持续交付

Stage-configuration

设置触发的方式,定义全局变量,执行报告的通知方式,是Pipeline的起点。

Automated Triggers,其中支持多种触发的方式:定时任务Corn,Git,Jenkins,Docker Registry,Travis,Pipeline,Webhook等触发方式,从而能够满足我们自动回调的功能。

Kubernetes容器环境持续交付

Parameters,此处定义的全局变量会在整个Pipeline中使用${ parameters['branch']}得到,这样大大的简化了我们设计Pipeline的通用性。

Kubernetes容器环境持续交付

Notifications,这里通知支持:SMS,Email,HipChat等等的方式。

Kubernetes容器环境持续交付

我们使用了邮件通知的功能:需要在echo的配置文件中加入发件邮箱的基本信息。

Stage-jenkins

调用Jenkins来执行相关的任务,其中Jenkins的服务信息存在放hal的配置文件中(如下展示),Spinnaker可自动以同步Jenkins的Job以及参数等等的信息,运行后能够看到对应的Job ID以及状态:

Kubernetes容器环境持续交付

运行完成后展示如下,我们可以查看相关的build的信息,以及此stage执行的相关信息,点击build可以跳到对应的Jenkins的Job查看相关的任务信息。

Kubernetes容器环境持续交付

Stage-deploy

由于我们配置Spinnaker的时候采用的是Kubernetes Provider V2方式,我们的发布均采用yaml的方式来实现,可以将文件存放在GitHub中或者直接在页面上进行配置,同时yaml中文件支持了很多的参数化,这样大大的方便了我们日常的使用。

Halyard关联Kubernetes的配置信息:由于我们采用的云服务是Kubernetes,配置的时候需要将部署Spinnaker的机器对Kubernetes集群做认证。

Spinnaker发布信息展示:此处Manifest Source支持参数化形式,类似于我们写入的yaml部署文件,但是这里支持参数化的方式。

Kubernetes容器环境持续交付

具体的配置项如下:

- apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: '${ parameters.deployName }-deployment'

namespace: dev

spec:

replicas: 2

template:

metadata:

labels:

name: '${ parameters.deployName }-deployment'

spec:

containers:

- image: >-

192.168.105.2:5000/${ parameters.imageSource }/${

parameters.deployName }:${ parameters.imageversion }

name: '${ parameters.deployName }-deployment'

ports:

- containerPort: 8080

imagePullSecrets:

- name: registrypullsecret

- apiVersion: v1

kind: Service

metadata:

name: '${ parameters.deployName }-service'

namespace: dev

spec:

ports:

- port: 8080

targetPort: 8080

selector:

name: '${ parameters.deployName }-deployment'

- apiVersion: extensions/v1beta1

kind: Ingress

metadata:

name: '${ parameters.deployName }-ingress'

namespace: dev

spec:

rules:

- host: '${ parameters.deployName }-dev.ingress.dev.yohocorp.com'

http:

paths:

- backend:

serviceName: '${ parameters.deployName }-service'

servicePort: 8080

path: /

运行结果的示例:

Kubernetes容器环境持续交付

Stage-Webhook

Webhook我们可以做一些简单的环境验证以及去调用其他的服务的功能,它自身也提供了一些结果的验证功能,支持多种请求的方式。

Kubernetes容器环境持续交付

运行结果的示例:

Kubernetes容器环境持续交付

Stage-Manual Judgment

Spinnaker配置信息,用于人工的逻辑判断,增加Pipeline的控制性(比如发布到线上需要测试人员认证以及领导审批),内容支持多种语法表达的方式。

Kubernetes容器环境持续交付

运行结果的示例:

Kubernetes容器环境持续交付

Stage-Check Preconditions

上边Manual Judgment Stage配置了两个Judgment Inputs判断项,接下来我们建两个Check Preconditions Stage来分别对这两种判断项做条件检测,条件检测成功,则执行对应的后续Stage流程。比如上面的操作,若是选择发布到prod,则执行发布到线上的分支,若是选择执行回滚的操作则进行回滚相关的分支。

Spinnaker配置信息:

Kubernetes容器环境持续交付

运行结果的示例:如上图中我选择了rollback。

Kubernetes容器环境持续交付

则prod分支判断为失败,会阻塞后面的stage运行。

Kubernetes容器环境持续交付

Stage-Undo Rollout(Manifest)

若是我们发布发现出现问题,也可以设计回滚的stage,Spinnaker的回滚极其的方便,在我们的日常部署中,每个版本都会存在对应的部署记录,如下所示:

Kubernetes容器环境持续交付

Spinnaker Pipeline配置信息:回滚的Pipeline描述中我们需要选择对应的deployment的回滚信息,以及回滚的版本数量。

Kubernetes容器环境持续交付

运行结果的示例:

Kubernetes容器环境持续交付

Stage-Canary Analysis

金丝雀部署方式:在我们发布新版本时引入部分流量到Canary的服务中,Kayenta会读取Spinnaker中配置的Prometheus中收集的指标,比如内存,CPU,接口超时时间,失败率等等通过Kayenta中Netflix ACA Judge来进行分析与判断,将分析的结果存于S3中,最终会给出这段时间的最终结果。

Canary分析主要经过如下四个步骤:

1.验证数据

2.清理数据

3.比对指标

4.分数计算

设计的模型如下:

Kubernetes容器环境持续交付

运行结果的设计与展示:

1.我们需要对应用开启Canary的配置。

2.创建出Baseline与Canary的deployment由同一个Service指向这两个deployment。

3.我们这里采用读取Prometheus的指标,需要在hal中增加Prometheus配置。Metric可以直接匹配Prometheus的指标。

Kubernetes容器环境持续交付

需要配置收集指标以及指标的权重:

Kubernetes容器环境持续交付

Kubernetes容器环境持续交付

在Pipeline中指定收集分析的频率以及需要指定的源,同时可以配置scoring从而覆盖模板中的配置。

Kubernetes容器环境持续交付

每次分析的执行记录:

Kubernetes容器环境持续交付

结果展示如下,由于我们设置的目标是75,所以pipeline的结果判定为失败。

Kubernetes容器环境持续交付

线上容器服务的选择与多区容灾

我们是腾讯云的客户,采用腾讯云容器服务主要看重以下几个方面:

1.Kubernetes在自搭建的集群中,要实现Overlay网络,在腾讯云的环境里,它本身就是软件定义网络VPC,所以它在网络上的实现可以做到在容器环境里和原生的VM网络一样的快,没有任何的性能牺牲。

2.应用型负载均衡器和Kubernetes里的Ingress相关联,对于需要外部访问的服务能够快速的创建。

3.腾讯云的云储存可以被Kubernetes管理,便于持久化的操作。

4.腾讯云的部署以及告警也对外提供了服务与接口,可以更好的查看与监控相关的Node与Pod的情况。

5.腾讯云日志服务很好的与容器进行融合,能够方便的收集与检索日志。

下图是我们在线上以及灰度环境的发布示意图。

Kubernetes容器环境持续交付

为了容灾我们使用了北京二区与北京三区两个集群,若是需要灰度验证时,则将线上北京三区的权重修改为0,这样通过灰度负载均衡器即可到达新版本应用。日常使用中二区与三区均同时提供挂服务。


以上所述就是小编给大家介绍的《Kubernetes容器环境持续交付》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Blockchain Basics

Blockchain Basics

Daniel Drescher / Apress / 2017-3-16 / USD 20.99

In 25 concise steps, you will learn the basics of blockchain technology. No mathematical formulas, program code, or computer science jargon are used. No previous knowledge in computer science, mathema......一起来看看 《Blockchain Basics》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具