轉(zhuǎn)載:基于Kubernetes的持續(xù)部署方案
方案概述
本技術(shù)方案為基于Kubernetes為核心的持續(xù)部署(下文簡(jiǎn)稱CD)方案,可以滿足開(kāi)發(fā)方的程序級(jí)日志查看分析伯襟,運(yùn)維方的快速擴(kuò)容與日常運(yùn)維分析,并且可以保證用戶的服務(wù)體驗(yàn)敞恋。并且整套放在可以在資源利用率上進(jìn)一步提升甸昏,在不降低服務(wù)可靠性的前提下降低資源使用成本蛤迎。
使用場(chǎng)景分析
本方案適用于以Tomcat為容器的JavaWeb項(xiàng)目的持續(xù)部署過(guò)程,在Kubernetes方案中觅彰,所有的Node節(jié)點(diǎn)均采用統(tǒng)一配置吩蔑,根據(jù)業(yè)務(wù)環(huán)境的需求進(jìn)行節(jié)點(diǎn)數(shù)量的控制。
技術(shù)架構(gòu)與選型
Kubernetes:一個(gè)開(kāi)源的填抬,用于管理云平臺(tái)中多個(gè)主機(jī)上的容器化的應(yīng)用烛芬,Kubernetes的目標(biāo)是讓部署容器化的應(yīng)用簡(jiǎn)單并且高效,Kubernetes提供了應(yīng)用部署,規(guī)劃赘娄,更新仆潮,維護(hù)的一種機(jī)制。
Nginx:一款輕量級(jí)的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器擅憔。
Harbor:Harbor是一個(gè)用于存儲(chǔ)和分發(fā)Docker鏡像的企業(yè)級(jí)Registry服務(wù)器鸵闪,通過(guò)添加一些企業(yè)必需的功能特性,例如安全暑诸、標(biāo)識(shí)和管理等蚌讼,擴(kuò)展了開(kāi)源Docker Distribution。
Jenkins:一個(gè)開(kāi)源軟件項(xiàng)目个榕,是基于Java開(kāi)發(fā)的一種持續(xù)集成工具篡石,用于監(jiān)控持續(xù)重復(fù)的工作,旨在提供一個(gè)開(kāi)放易用的軟件平臺(tái)西采,使軟件的持續(xù)集成變成可能凰萨。
Filebeats:是一個(gè)日志文件托運(yùn)工具,在你的服務(wù)器上安裝客戶端后械馆,F(xiàn)ilebeat會(huì)監(jiān)控日志目錄或者指定的日志文件胖眷,追蹤讀取這些文件(追蹤文件的變化,不停的讀)霹崎,并且轉(zhuǎn)發(fā)這些信息到Elasticsearch或者Logstarsh中存放珊搀。
Elasticsearch:是一個(gè)基于Lucene構(gòu)建的開(kāi)源、分布式尾菇、RESTful接口的全文搜索引擎境析。
Kibana是一個(gè)開(kāi)源的分析和可視化平臺(tái),設(shè)計(jì)用于和Elasticsearch一起工作來(lái)搜索派诬,查看劳淆,并和存儲(chǔ)在Elasticsearch索引中的數(shù)據(jù)進(jìn)行交互。
GitLab自托管的Git項(xiàng)目倉(cāng)庫(kù)默赂,可通過(guò)Web界面進(jìn)行訪問(wèn)公開(kāi)的或者私人項(xiàng)目(這里的GitLab并不涉及到開(kāi)發(fā)的CI方案沛鸵,主要為運(yùn)維的CD方案)。
Weave Scope Docker和Kubernetes可視化監(jiān)控工具缆八。Scope提供了至上而下的集群基礎(chǔ)設(shè)施和應(yīng)用的完整視圖谒臼,用戶可以輕松對(duì)分布式的容器化應(yīng)用進(jìn)行實(shí)時(shí)監(jiān)控和問(wèn)題診斷。
Kubernetes集群部署模式:Stacked etcd topology
Kubernetes的安裝使用kubeadm安裝為高可用集群耀里,并選用Stacked etcd topology 模式。?
詳情參考https://kubernetes.io/docs/setup/independent/high-availability/拾氓。
Kubernetes生態(tài)技術(shù)選型:網(wǎng)絡(luò)層面選型Weave
容器網(wǎng)絡(luò)解決方案冯挎。Weave創(chuàng)建的虛擬網(wǎng)絡(luò)可以將部署在多個(gè)主機(jī)上的容器連接起來(lái)。對(duì)容器來(lái)說(shuō),Weave就像一個(gè)巨大的以太網(wǎng)交換機(jī)房官,所有容器都被接入這個(gè)交換機(jī)趾徽,容器可以直接通信,無(wú)需 NAT 和端口映射翰守。?
原理詳解:http://dockone.io/article/262
Kubernetes生態(tài)技術(shù)選型:對(duì)外服務(wù)選型NodePort
Kubernetes目前支持NodePort孵奶、LoadBanlace、Ingress三種對(duì)外提供服務(wù)的模式蜡峰,其中LoadBanlace需要云平臺(tái)的支持了袁,阿里云提供了解決方案,但騰訊云未找到湿颅,Ingress技術(shù)為新出技術(shù)载绿。整體評(píng)估采用NodePort方式更為靈活,每個(gè)服務(wù)一個(gè)唯一的對(duì)外IP地址油航,并且使用Nginx進(jìn)行負(fù)載均衡(采用Nginx主要為日志分析)崭庸。?
介紹與使用方法:https://kubernetes.io/docs/concepts/services-networking/service/#nodeport。
持續(xù)部署過(guò)程
Jenkins構(gòu)建時(shí)谊囚,需要傳入程序版本號(hào)怕享,構(gòu)建類型(發(fā)布還是刪除),程序類型(測(cè)試還是正式)镰踏。
CD的全過(guò)程由位于Jenkins上的腳本執(zhí)行
開(kāi)發(fā)部將對(duì)應(yīng)版本的ROOT.war傳入Jenkins指定目錄
下拉配置(包含config函筋,hosts,dockerfile余境,k8syaml等等)
由Dockerfile生成Docker容器驻呐,并將root.war,hosts與配置文件內(nèi)置入容器中
將Docker容器打包并推送入Registry
通過(guò)kubectl通過(guò)k8syaml更新/生成新的服務(wù)
各組件業(yè)務(wù)配置
Kubernetes業(yè)務(wù)配置
命名空間
在業(yè)務(wù)上芳来,Kubernetes默認(rèn)配置兩套Namespace含末,分別為Master存放正式環(huán)境,Develop配置測(cè)試環(huán)境即舌。
對(duì)外端口
正式環(huán)境Web端口以32001開(kāi)始佣盒,測(cè)試環(huán)境以31001開(kāi)始,且一一對(duì)應(yīng)顽聂。
Master數(shù)據(jù)目錄
/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目錄存放各業(yè)務(wù)的yaml配置,二級(jí)目錄為域名紊搪,三級(jí)目錄劃分Master(正式)蜜葱,Develop(測(cè)試),目錄下以 版本號(hào)-構(gòu)建ID-GITID.yaml 命名文件耀石,時(shí)間最后一個(gè)即為當(dāng)前線上的使用配置文件牵囤,為了運(yùn)維方便,在二級(jí)目錄同級(jí)內(nèi),生成一個(gè)軟鏈連接到最新的正式與測(cè)試配置文件揭鳞。注意炕贵,k8s-cd-config僅在其中一臺(tái)Master中存在。
Node數(shù)據(jù)目錄
/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
節(jié)點(diǎn)下的/data一級(jí)目錄下分Filebeat野崇、Dockerlibs称开、Nodelogs,其中Dockerlibs存放Docker相關(guān)數(shù)據(jù)乓梨,Nodelogs目錄通過(guò)volume的方式掛載入Kubernetes的Pod鳖轰, Nodelogs下分Develop與Master目錄,區(qū)分正式環(huán)境與測(cè)試環(huán)境督禽,每個(gè)Master與Develop下分為accesslogs脆霎、devlogs、tomcatlogs分別存放訪問(wèn)日志狈惫,開(kāi)發(fā)部日志睛蛛,Tomcat日志,日志目錄下為項(xiàng)目(域名)胧谈,域名下為Pod名稱目錄忆肾。
注意事項(xiàng): 節(jié)點(diǎn)加入集群后,一定要下載手工下載kubernetes-dashboard-amd64鏡像菱肖,防止dashboard所在節(jié)點(diǎn)掛掉以后dashboard無(wú)法在其他節(jié)點(diǎn)啟動(dòng)客冈。
Harbor業(yè)務(wù)配置
業(yè)務(wù)分組
Harbor重定義其Registry的存儲(chǔ)路徑直接使用docker-compose安裝。template 存放基礎(chǔ)進(jìn)項(xiàng)稳强,各域名分組存放業(yè)務(wù)鏡像场仲。?
鏡像命名
分組下鏡像以站點(diǎn)域名:版本號(hào)-類型-CDGITLAB為名稱,并基于版本號(hào)確定不同的站點(diǎn)版本退疫。?
數(shù)據(jù)目錄
Harbor數(shù)據(jù)目錄統(tǒng)一存放在/data下渠缕。
備份策略
Harbor默認(rèn)不設(shè)置備份,對(duì)于業(yè)務(wù)鏡像無(wú)需進(jìn)行備份褒繁,每次進(jìn)行構(gòu)建即可亦鳞,對(duì)于模板類鏡像,在Jenkins機(jī)器上均可以找到棒坏,若Harbor出現(xiàn)問(wèn)題燕差,則直接重建,并將Jenkins上的模板鏡像進(jìn)行重新push坝冕。
注意:為了業(yè)務(wù)的穩(wěn)定性徒探,Harbor由獨(dú)立的服務(wù)運(yùn)行(基于Docker),并不運(yùn)行在Kubernetes內(nèi)喂窟。
Jenkins業(yè)務(wù)配置
數(shù)據(jù)目錄
.
├── 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相關(guān)文件,thinbackups存放每日的Jenkins備份钱贯,gitlab-files存放構(gòu)建GitLab的文件(運(yùn)維可以在此操作pull挫掏,push),jks-cd-config為jks構(gòu)建目錄秩命。
Jenkins機(jī)使用/data/jks-cd-config目錄存放構(gòu)建內(nèi)容尉共,二級(jí)目錄為域名,三級(jí)目錄為版本號(hào)(以開(kāi)發(fā)部版本號(hào)為準(zhǔn))弃锐,三級(jí)目錄下存放ROOT.war袄友,四級(jí)目錄為構(gòu)建ID_GITID,目錄下存放構(gòu)建的原始數(shù)據(jù)霹菊。
節(jié)點(diǎn)每天進(jìn)行images清理工作剧蚣。
業(yè)務(wù)分組
Jenkins的分組分為template與各domain,template存放模板旋廷,domain以域名的形式存放正式項(xiàng)目:?
新項(xiàng)目由運(yùn)維手工創(chuàng)建鸠按,后續(xù)的秩序構(gòu)建過(guò)程由開(kāi)發(fā)部調(diào)用API完成。
構(gòu)建參數(shù)
Jenkins構(gòu)建時(shí)饶碘,需要傳遞三參數(shù)目尖,1:程序版本號(hào),2:類型:apply與delete扎运,3:正式環(huán)境還是測(cè)試環(huán)境瑟曲,正式環(huán)境為Master,測(cè)試環(huán)境為Develop豪治,對(duì)應(yīng)Kubernetes的Namespace洞拨。?
此部分功能后期將通過(guò)開(kāi)發(fā)部的構(gòu)建憑條調(diào)用JenkinsAPI實(shí)現(xiàn)。
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插件鬼吵,配置每小時(shí)進(jìn)行一次全局備份扣甲,且最多保留10份,備份后數(shù)據(jù)傳至異地齿椅。?
注意:為了業(yè)務(wù)的穩(wěn)定性琉挖,Jenkins由獨(dú)立的服務(wù)運(yùn)行,并不運(yùn)行在Kubernetes內(nèi)涣脚。
GitLab業(yè)務(wù)配置
業(yè)務(wù)分組
CD GitLab項(xiàng)目下分兩個(gè)組template與各domain示辈,template存放模板文件。例如:?
Git分支
default下以域名劃分項(xiàng)目遣蚀,每個(gè)項(xiàng)目劃分Master與Develop兩個(gè)分支矾麻,分別存放正式環(huán)境與測(cè)試環(huán)境CD文件纱耻。?
CD文件樹(shù)
├── catalina.sh ? ? ? ? ? ? ?#tomcat配置文件
├── config ? ? ? ? ? ? ? ? ?#程序配置文件,此文件夾會(huì)替換掉容器內(nèi)的/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進(jìn)行每日定期備份弄喘,并傳送至異地。
EFK與日志管理
Elasticsearch
ES數(shù)據(jù)通過(guò)索引僅保留近10天的數(shù)據(jù)甩牺,每日通過(guò)腳本方式進(jìn)行數(shù)據(jù)刪除蘑志。ES的數(shù)據(jù)保存在/data/elasticsearch目錄下。
Filebeat
在每個(gè)Node節(jié)點(diǎn)啟動(dòng)一個(gè)Filebeat進(jìn)程贬派,用于日志的采集工作急但,filebeat分別監(jiān)控:
/data/nodelogs//accesslogs///
/data/nodelogs//devlogs///
/data/nodelogs//tomcatlogs///
其中,tomcatlogs日志需要進(jìn)行特殊處理搞乏,進(jìn)行多行合并波桩,數(shù)據(jù)寫(xiě)入ES時(shí),使用processors. Dissect進(jìn)行目錄名稱截取请敦,并使用域名作為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節(jié)點(diǎn),用于日志數(shù)據(jù)的查詢勾笆,在配置方面敌蚜。
Kibana配置使用“域名-*”方式進(jìn)行配置,每次新增域名窝爪,需要在此進(jìn)行手工配置弛车。?
Kibana使用discover查看時(shí),默認(rèn)展示一個(gè)域名下所有的日志蒲每,可以通過(guò)gy.wtype篩選選擇查看測(cè)試環(huán)境還是正式環(huán)境纷跛,或者通過(guò)gy.ltype哪種日志類型。?
容器資源監(jiān)控
容器資源使用WeaveScope進(jìn)行資源消耗監(jiān)控邀杏。?
原文鏈接:http://www.toryzen.cn/2018/12/30/基于kubernetes的持續(xù)部署(CD)方案/