基于Kubernetes的持续部署方案
戳藍(lán)字“CSDN云計(jì)算”關(guān)注我們哦!
文章轉(zhuǎn)載自Docker
方案概述
本技術(shù)方案為基于Kubernetes為核心的持續(xù)部署(下文簡稱CD)方案,可以滿足開發(fā)方的程序級日志查看分析,運(yùn)維方的快速擴(kuò)容與日常運(yùn)維分析,并且可以保證用戶的服務(wù)體驗(yàn)。并且整套放在可以在資源利用率上進(jìn)一步提升,在不降低服務(wù)可靠性的前提下降低資源使用成本。
使用場景分析
本方案適用于以Tomcat為容器的JavaWeb項(xiàng)目的持續(xù)部署過程,在Kubernetes方案中,所有的Node節(jié)點(diǎn)均采用統(tǒng)一配置,根據(jù)業(yè)務(wù)環(huán)境的需求進(jìn)行節(jié)點(diǎn)數(shù)量的控制。
技術(shù)架構(gòu)與選型
Kubernetes:一個(gè)開源的,用于管理云平臺中多個(gè)主機(jī)上的容器化的應(yīng)用,Kubernetes的目標(biāo)是讓部署容器化的應(yīng)用簡單并且高效,Kubernetes提供了應(yīng)用部署,規(guī)劃,更新,維護(hù)的一種機(jī)制。
Nginx:一款輕量級的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器。
Harbor:Harbor是一個(gè)用于存儲和分發(fā)Docker鏡像的企業(yè)級Registry服務(wù)器,通過添加一些企業(yè)必需的功能特性,例如安全、標(biāo)識和管理等,擴(kuò)展了開源Docker Distribution。
Jenkins:一個(gè)開源軟件項(xiàng)目,是基于Java開發(fā)的一種持續(xù)集成工具,用于監(jiān)控持續(xù)重復(fù)的工作,旨在提供一個(gè)開放易用的軟件平臺,使軟件的持續(xù)集成變成可能。
Filebeats:是一個(gè)日志文件托運(yùn)工具,在你的服務(wù)器上安裝客戶端后,Filebeat會監(jiān)控日志目錄或者指定的日志文件,追蹤讀取這些文件(追蹤文件的變化,不停的讀),并且轉(zhuǎn)發(fā)這些信息到Elasticsearch或者Logstarsh中存放。
Elasticsearch:是一個(gè)基于Lucene構(gòu)建的開源、分布式、RESTful接口的全文搜索引擎。
Kibana是一個(gè)開源的分析和可視化平臺,設(shè)計(jì)用于和Elasticsearch一起工作來搜索,查看,并和存儲在Elasticsearch索引中的數(shù)據(jù)進(jìn)行交互。
GitLab自托管的Git項(xiàng)目倉庫,可通過Web界面進(jìn)行訪問公開的或者私人項(xiàng)目(這里的GitLab并不涉及到開發(fā)的CI方案,主要為運(yùn)維的CD方案)。
Weave Scope Docker和Kubernetes可視化監(jiān)控工具。Scope提供了至上而下的集群基礎(chǔ)設(shè)施和應(yīng)用的完整視圖,用戶可以輕松對分布式的容器化應(yīng)用進(jìn)行實(shí)時(shí)監(jiā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ī)上的容器連接起來。對容器來說,Weave就像一個(gè)巨大的以太網(wǎng)交換機(jī),所有容器都被接入這個(gè)交換機(jī),容器可以直接通信,無需 NAT 和端口映射。?
原理詳解:http://dockone.io/article/262
Kubernetes生態(tài)技術(shù)選型:對外服務(wù)選型NodePort
Kubernetes目前支持NodePort、LoadBanlace、Ingress三種對外提供服務(wù)的模式,其中LoadBanlace需要云平臺的支持,阿里云提供了解決方案,但騰訊云未找到,Ingress技術(shù)為新出技術(shù)。整體評估采用NodePort方式更為靈活,每個(gè)服務(wù)一個(gè)唯一的對外IP地址,并且使用Nginx進(jìn)行負(fù)載均衡(采用Nginx主要為日志分析)。?
介紹與使用方法:https://kubernetes.io/docs/concepts/services-networking/service/#nodeport。
持續(xù)部署過程
Jenkins構(gòu)建時(shí),需要傳入程序版本號,構(gòu)建類型(發(fā)布還是刪除),程序類型(測試還是正式)。
CD的全過程由位于Jenkins上的腳本執(zhí)行
開發(fā)部將對應(yīng)版本的ROOT.war傳入Jenkins指定目錄
下拉配置(包含config,hosts,dockerfile,k8syaml等等)
由Dockerfile生成Docker容器,并將root.war,hosts與配置文件內(nèi)置入容器中
將Docker容器打包并推送入Registry
通過kubectl通過k8syaml更新/生成新的服務(wù)
各組件業(yè)務(wù)配置
Kubernetes業(yè)務(wù)配置
命名空間
在業(yè)務(wù)上,Kubernetes默認(rèn)配置兩套Namespace,分別為Master存放正式環(huán)境,Develop配置測試環(huán)境。
對外端口
正式環(huán)境Web端口以32001開始,測試環(huán)境以31001開始,且一一對應(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配置,二級目錄為域名,三級目錄劃分Master(正式),Develop(測試),目錄下以 版本號-構(gòu)建ID-GITID.yaml 命名文件,時(shí)間最后一個(gè)即為當(dāng)前線上的使用配置文件,為了運(yùn)維方便,在二級目錄同級內(nèi),生成一個(gè)軟鏈連接到最新的正式與測試配置文件。注意,k8s-cd-config僅在其中一臺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一級目錄下分Filebeat、Dockerlibs、Nodelogs,其中Dockerlibs存放Docker相關(guān)數(shù)據(jù),Nodelogs目錄通過volume的方式掛載入Kubernetes的Pod, Nodelogs下分Develop與Master目錄,區(qū)分正式環(huán)境與測試環(huán)境,每個(gè)Master與Develop下分為accesslogs、devlogs、tomcatlogs分別存放訪問日志,開發(fā)部日志,Tomcat日志,日志目錄下為項(xiàng)目(域名),域名下為Pod名稱目錄。
注意事項(xiàng): 節(jié)點(diǎn)加入集群后,一定要下載手工下載kubernetes-dashboard-amd64鏡像,防止dashboard所在節(jié)點(diǎn)掛掉以后dashboard無法在其他節(jié)點(diǎn)啟動。
Harbor業(yè)務(wù)配置
業(yè)務(wù)分組
Harbor重定義其Registry的存儲路徑直接使用docker-compose安裝。template 存放基礎(chǔ)進(jìn)項(xiàng),各域名分組存放業(yè)務(wù)鏡像。?
鏡像命名
分組下鏡像以站點(diǎn)域名:版本號-類型-CDGITLAB為名稱,并基于版本號確定不同的站點(diǎn)版本。?
數(shù)據(jù)目錄
Harbor數(shù)據(jù)目錄統(tǒng)一存放在/data下。
備份策略
Harbor默認(rèn)不設(shè)置備份,對于業(yè)務(wù)鏡像無需進(jìn)行備份,每次進(jìn)行構(gòu)建即可,對于模板類鏡像,在Jenkins機(jī)器上均可以找到,若Harbor出現(xià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)容,二級目錄為域名,三級目錄為版本號(以開發(fā)部版本號為準(zhǔn)),三級目錄下存放ROOT.war,四級目錄為構(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)建過程由開發(fā)部調(diào)用API完成。
構(gòu)建參數(shù)
Jenkins構(gòu)建時(shí),需要傳遞三參數(shù),1:程序版本號,2:類型:apply與delete,3:正式環(huán)境還是測試環(huán)境,正式環(huán)境為Master,測試環(huán)境為Develop,對應(yīng)Kubernetes的Namespace。?
此部分功能后期將通過開發(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)境與測試環(huán)境CD文件。?
CD文件樹
├── catalina.sh ? ? ? ? ? ? ?#tomcat配置文件
├── config ? ? ? ? ? ? ? ? ?#程序配置文件,此文件夾會替換掉容器內(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ù)通過索引僅保留近10天的數(shù)據(jù),每日通過腳本方式進(jìn)行數(shù)據(jù)刪除。ES的數(shù)據(jù)保存在/data/elasticsearch目錄下。
Filebeat
在每個(gè)Node節(jié)點(diǎn)啟動一個(gè)Filebeat進(jìn)程,用于日志的采集工作,filebeat分別監(jiān)控:
/data/nodelogs//accesslogs///
/data/nodelogs//devlogs///
/data/nodelogs//tomcatlogs///
其中,tomcatlogs日志需要進(jìn)行特殊處理,進(jìn)行多行合并,數(shù)據(jù)寫入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è)域名下所有的日志,可以通過gy.wtype篩選選擇查看測試環(huán)境還是正式環(huán)境,或者通過gy.ltype哪種日志類型。?
容器資源監(jiān)控
容器資源使用WeaveScope進(jìn)行資源消耗監(jiān)控。?
福利
掃描添加小編微信,備注“姓名+公司職位”,加入【云計(jì)算學(xué)習(xí)交流群】,和志同道合的朋友們共同打卡學(xué)習(xí)!
推薦閱讀:
全面剖析企業(yè)私有云
30 秒?!Chrome 插件帶你速成編程學(xué)習(xí) | 程序員硬核評測
為什么程序員下班后只關(guān)顯示器從不關(guān)電腦?
算法警告!該圖片涉嫌違規(guī)不予顯示
交易機(jī)器人春天已來?先看完這篇再說吧
2019年中國IT市場趨勢熱點(diǎn)
2019年最值得關(guān)注的五大微服務(wù)發(fā)展趨勢
總結(jié)
以上是生活随笔為你收集整理的基于Kubernetes的持续部署方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贷款买车为什么更便宜?
- 下一篇: 高尔夫纯电换锂电池需要花多少钱?