基於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/set ... lity/
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/con ... eport 。
持續部署過程
- 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/displa ... 2BAPI
Token: https://jingyan.baidu.com/arti ... .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)方案/