转载:基于Kubernetes的持续部署方案

转载:基于Kubernetes的持续部署方案


方案概述

本技术方案为基于Kubernetes为核心的持续部署(下文简称CD)方案,可以满足开发方的程序级日志查看分析,运维方的快速扩容与日常运维分析,并且可以保证用户的服务体验。并且整套放在可以在资源利用率上进一步提升,在不降低服务可靠性的前提下降低资源使用成本。

使用场景分析

本方案适用于以Tomcat为容器的JavaWeb项目的持续部署过程,在Kubernetes方案中,所有的Node节点均采用统一配置,根据业务环境的需求进行节点数量的控制。

技术架构与选型

Kubernetes:一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。

Nginx:一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。

Harbor:Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。

Jenkins:一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

Filebeats:是一个日志文件托运工具,在你的服务器上安装客户端后,Filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并且转发这些信息到Elasticsearch或者Logstarsh中存放。

Elasticsearch:是一个基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎。

Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作来搜索,查看,并和存储在Elasticsearch索引中的数据进行交互。

GitLab自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目(这里的GitLab并不涉及到开发的CI方案,主要为运维的CD方案)。

Weave Scope Docker和Kubernetes可视化监控工具。Scope提供了至上而下的集群基础设施和应用的完整视图,用户可以轻松对分布式的容器化应用进行实时监控和问题诊断。

Kubernetes集群部署模式:Stacked etcd topology

Kubernetes的安装使用kubeadm安装为高可用集群,并选用Stacked etcd topology 模式。 

详情参考https://kubernetes.io/docs/setup/independent/high-availability/。

Kubernetes生态技术选型:网络层面选型Weave

容器网络解决方案。Weave创建的虚拟网络可以将部署在多个主机上的容器连接起来。对容器来说,Weave就像一个巨大的以太网交换机,所有容器都被接入这个交换机,容器可以直接通信,无需 NAT 和端口映射。 

原理详解:http://dockone.io/article/262

Kubernetes生态技术选型:对外服务选型NodePort

Kubernetes目前支持NodePort、LoadBanlace、Ingress三种对外提供服务的模式,其中LoadBanlace需要云平台的支持,阿里云提供了解决方案,但腾讯云未找到,Ingress技术为新出技术。整体评估采用NodePort方式更为灵活,每个服务一个唯一的对外IP地址,并且使用Nginx进行负载均衡(采用Nginx主要为日志分析)。 

介绍与使用方法:https://kubernetes.io/docs/concepts/services-networking/service/#nodeport。

持续部署过程

Jenkins构建时,需要传入程序版本号,构建类型(发布还是删除),程序类型(测试还是正式)。

CD的全过程由位于Jenkins上的脚本执行

开发部将对应版本的ROOT.war传入Jenkins指定目录

下拉配置(包含config,hosts,dockerfile,k8syaml等等)

由Dockerfile生成Docker容器,并将root.war,hosts与配置文件内置入容器中

将Docker容器打包并推送入Registry

通过kubectl通过k8syaml更新/生成新的服务

各组件业务配置

Kubernetes业务配置

命名空间

在业务上,Kubernetes默认配置两套Namespace,分别为Master存放正式环境,Develop配置测试环境。

对外端口

正式环境Web端口以32001开始,测试环境以31001开始,且一一对应。

Master数据目录

/data

└── k8s-cd-config

└── test.gyyx.cn

   ├── develop

   │   └── v1.2.0-92-3fdd00f.yaml

   ├─develop.yaml -> /data/k8s-cd-config/test.gyyx.cn/develop/v1.2.0-92-3fdd00f.yaml

   ├── master

   │   └── v1.2.0-91-746284e.yaml

   └──master.yaml->/data/k8s-cd-config/test.gyyx.cn/master/v1.2.0-91-746284e.yaml

K8s-Master下的data目录下为k8s-cd-config, k8s-cd-config目录存放各业务的yaml配置,二级目录为域名,三级目录划分Master(正式),Develop(测试),目录下以 版本号-构建ID-GITID.yaml 命名文件,时间最后一个即为当前线上的使用配置文件,为了运维方便,在二级目录同级内,生成一个软链连接到最新的正式与测试配置文件。注意,k8s-cd-config仅在其中一台Master中存在。

Node数据目录

/data

├── filebeat

├── dockerlibs

└── nodelogs

   ├── develop

   │   ├── accesslogs

   │   │   └── test.gyyx.cn

   │   │       └── test-gyyx-cn-76d9d8d5b5-hdnql

   │   │           └── localhost_access_log.2018-12-24.txt

   │   ├── devlogs

   │   │   └── test.gyyx.cn

   │   │       └── test-gyyx-cn-76d9d8d5b5-hdnql

   │   │           └── interface.datareport.wyx.cn

   │   │               ├── error.log

   │   │               ├── info.log

   │   │               └── trace.log

   │   └── tomcatlogs

   │       └── test.gyyx.cn

   │           └── test-gyyx-cn-76d9d8d5b5-hdnql

   │               ├── catalina.2018-12-24.log

   │               ├── host-manager.2018-12-24.log

   │               ├── localhost.2018-12-24.log

   │               └── manager.2018-12-24.log

   └── master

       ├── accesslogs

       │   └── test.gyyx.cn

       │       └── test-gyyx-cn-895cc5994-sx7gk

       │           └── localhost_access_log.2018-12-24.txt

       ├── devlogs

       │   └── test.gyyx.cn

       │       └── test-gyyx-cn-895cc5994-sx7gk

       └── tomcatlogs

           └── test.gyyx.cn

               └── test-gyyx-cn-895cc5994-sx7gk

                   ├── catalina.2018-12-24.log

                   ├── host-manager.2018-12-24.log

                   ├── localhost.2018-12-24.log

                   └── manager.2018-12-24.log

节点下的/data一级目录下分Filebeat、Dockerlibs、Nodelogs,其中Dockerlibs存放Docker相关数据,Nodelogs目录通过volume的方式挂载入Kubernetes的Pod, Nodelogs下分Develop与Master目录,区分正式环境与测试环境,每个Master与Develop下分为accesslogs、devlogs、tomcatlogs分别存放访问日志,开发部日志,Tomcat日志,日志目录下为项目(域名),域名下为Pod名称目录。

注意事项: 节点加入集群后,一定要下载手工下载kubernetes-dashboard-amd64镜像,防止dashboard所在节点挂掉以后dashboard无法在其他节点启动。

Harbor业务配置

业务分组

Harbor重定义其Registry的存储路径直接使用docker-compose安装。template 存放基础进项,各域名分组存放业务镜像。 

镜像命名

分组下镜像以站点域名:版本号-类型-CDGITLAB为名称,并基于版本号确定不同的站点版本。 

数据目录

Harbor数据目录统一存放在/data下。

备份策略

Harbor默认不设置备份,对于业务镜像无需进行备份,每次进行构建即可,对于模板类镜像,在Jenkins机器上均可以找到,若Harbor出现问题,则直接重建,并将Jenkins上的模板镜像进行重新push。

注意:为了业务的稳定性,Harbor由独立的服务运行(基于Docker),并不运行在Kubernetes内。

Jenkins业务配置

数据目录

.

├── dockerlibs

├── thinbackups

└── gitlab-files

│  └── gyyx.cn

│      └── test.gyyx.cn

└── jks-cd-config

   └── test.gyyx.cn

       └── v1.2.0

           ├── develop

           │   └── 101_138a37a

           │       ├── …

           │       └── v1.2.0-101-138a37a.yaml

           ├── master

           │   └── 102_4f228a7

           │       ├── …

           │       └── v1.2.0-102-4f228a7.yaml

           └── ROOT.war

Jenkins下的data目录分为dockerlibs、thinbackups、gitlab-files 、jks-cd-config。

Dockerlibs存放Docker相关文件,thinbackups存放每日的Jenkins备份,gitlab-files存放构建GitLab的文件(运维可以在此操作pull,push),jks-cd-config为jks构建目录。

Jenkins机使用/data/jks-cd-config目录存放构建内容,二级目录为域名,三级目录为版本号(以开发部版本号为准),三级目录下存放ROOT.war,四级目录为构建ID_GITID,目录下存放构建的原始数据。

节点每天进行images清理工作。

业务分组

Jenkins的分组分为template与各domain,template存放模板,domain以域名的形式存放正式项目: 

新项目由运维手工创建,后续的秩序构建过程由开发部调用API完成。

构建参数

Jenkins构建时,需要传递三参数,1:程序版本号,2:类型:apply与delete,3:正式环境还是测试环境,正式环境为Master,测试环境为Develop,对应Kubernetes的Namespace。 

此部分功能后期将通过开发部的构建凭条调用JenkinsAPI实现。

JenkinsAPI

curl -X POST http://jenkinsapi.com/job/域名/build \

–user admin:11b80a61d260aa41eb4a43ef0115bcbb26 \

–data-urlencode json=’{“parameter”: [{“name”:”VERSION”, “value”:”v1.2.0”}, {“name”:”TYPE”, “value”:”apply”}, {“name”:”BRANCH”, “value”:”develop”}]}’

APIDoc:https://wiki.jenkins.io/display/JENKINS/Remote+access+API

Token:https://jingyan.baidu.com/article/0eb457e5dbad8003f0a9056c.html

备份策略

Jenins安装ThinBackup插件,配置每小时进行一次全局备份,且最多保留10份,备份后数据传至异地。 

注意:为了业务的稳定性,Jenkins由独立的服务运行,并不运行在Kubernetes内。

GitLab业务配置

业务分组

CD GitLab项目下分两个组template与各domain,template存放模板文件。例如: 

Git分支

default下以域名划分项目,每个项目划分Master与Develop两个分支,分别存放正式环境与测试环境CD文件。 

CD文件树

├── catalina.sh              #tomcat配置文件

├── config                  #程序配置文件,此文件夹会替换掉容器内的/data/conf

│   └── hello.conf

├── deployment.yaml         #k8s deploymen配置

├── dockerfile               #docker镜像生成文件

├── hosts                   #docker镜像的hosts,此文件将合并到deployment.yaml

├── service.yaml             #k8s service配置

└── tomcat                 #tomcat配置文件

   ├── Catalina

   │   └── localhost

   ├── catalina.policy

   ├── catalina.properties

   ├── context.xml

   ├── logging.properties

   ├── server.xml

   ├── tomcat-users.xml

   └── web.xml

备份策略

GitLab使用gitlab-rake gitlab:backup:create进行每日定期备份,并传送至异地。

EFK与日志管理

Elasticsearch

ES数据通过索引仅保留近10天的数据,每日通过脚本方式进行数据删除。ES的数据保存在/data/elasticsearch目录下。

Filebeat

在每个Node节点启动一个Filebeat进程,用于日志的采集工作,filebeat分别监控:

/data/nodelogs//accesslogs///

/data/nodelogs//devlogs///

/data/nodelogs//tomcatlogs///

其中,tomcatlogs日志需要进行特殊处理,进行多行合并,数据写入ES时,使用processors. Dissect进行目录名称截取,并使用域名作为ES的索引使用。

processors:

- dissect:

   tokenizer: "%{?key1}/%{?key2}/%{?key3}/%{wtype}/%{ltype}/%{domain}/%{?key7}/%{?key8}"

   field: "source"

target_prefix: "gy"

截取gy. wtype ( master或develop) , ltype(accesslogs 、tomcatlogs、devlogs),domain(xxx.gyyx.cn)。

Kibana

Kibana目前我们仅使用其discover节点,用于日志数据的查询,在配置方面。

Kibana配置使用“域名-*”方式进行配置,每次新增域名,需要在此进行手工配置。 

Kibana使用discover查看时,默认展示一个域名下所有的日志,可以通过gy.wtype筛选选择查看测试环境还是正式环境,或者通过gy.ltype哪种日志类型。 

容器资源监控

容器资源使用WeaveScope进行资源消耗监控。 

原文链接:http://www.toryzen.cn/2018/12/30/基于kubernetes的持续部署(CD)方案/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容