歡迎光臨
每天分享高質量文章

基於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資料目錄
 
  1. /data
  2. └── k8s-cd-config
  3. └── test.gyyx.cn
  4.    ├── develop
  5.    │   └── v1.2.0-92-3fdd00f.yaml
  6.    ├─develop.yaml -> /data/k8s-cd-config/test.gyyx.cn/develop/v1.2.0-92-3fdd00f.yaml
  7.    ├── master
  8.    │   └── v1.2.0-91-746284e.yaml
  9.    └──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資料目錄
 
  1. /data
  2. ├── filebeat
  3. ├── dockerlibs
  4. └── nodelogs
  5.    ├── develop
  6.    │   ├── accesslogs
  7.    │   │   └── test.gyyx.cn
  8.    │   │       └── test-gyyx-cn-76d9d8d5b5-hdnql
  9.    │   │           └── localhost_access_log.2018-12-24.txt
  10.    │   ├── devlogs
  11.    │   │   └── test.gyyx.cn
  12.    │   │       └── test-gyyx-cn-76d9d8d5b5-hdnql
  13.    │   │           └── interface.datareport.wyx.cn
  14.    │   │               ├── error.log
  15.    │   │               ├── info.log
  16.    │   │               └── trace.log
  17.    │   └── tomcatlogs
  18.    │       └── test.gyyx.cn
  19.    │           └── test-gyyx-cn-76d9d8d5b5-hdnql
  20.    │               ├── catalina.2018-12-24.log
  21.    │               ├── host-manager.2018-12-24.log
  22.    │               ├── localhost.2018-12-24.log
  23.    │               └── manager.2018-12-24.log
  24.    └── master
  25.        ├── accesslogs
  26.        │   └── test.gyyx.cn
  27.        │       └── test-gyyx-cn-895cc5994-sx7gk
  28.        │           └── localhost_access_log.2018-12-24.txt
  29.        ├── devlogs
  30.        │   └── test.gyyx.cn
  31.        │       └── test-gyyx-cn-895cc5994-sx7gk
  32.        └── tomcatlogs
  33.            └── test.gyyx.cn
  34.                └── test-gyyx-cn-895cc5994-sx7gk
  35.                    ├── catalina.2018-12-24.log
  36.                    ├── host-manager.2018-12-24.log
  37.                    ├── localhost.2018-12-24.log
  38.                    └── 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業務配置
 
資料目錄
 
  1. .
  2. ├── dockerlibs
  3. ├── thinbackups
  4. └── gitlab-files
  5. │  └── gyyx.cn
  6. │      └── test.gyyx.cn
  7. └── jks-cd-config
  8.    └── test.gyyx.cn
  9.        └── v1.2.0
  10.            ├── develop
  11.            │   └── 101_138a37a
  12.            │       ├── …
  13.            │       └── v1.2.0-101-138a37a.yaml
  14.            ├── master
  15.            │   └── 102_4f228a7
  16.            │       ├── …
  17.            │       └── v1.2.0-102-4f228a7.yaml
  18.            └── 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
 
  1. curl -X POST http://jenkinsapi.com/job/域名/build \
  2. –user admin:11b80a61d260aa41eb4a43ef0115bcbb26 \
  3. –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檔案樹
 
  1. ├── catalina.sh              #tomcat配置檔案
  2. ├── config                  #程式配置檔案,此檔案夾會替換掉容器內的/data/conf
  3. │   └── hello.conf
  4. ├── deployment.yaml         #k8s deploymen配置
  5. ├── dockerfile               #docker鏡像生成檔案
  6. ├── hosts                   #docker鏡像的hosts,此檔案將合併到deployment.yaml
  7. ├── service.yaml             #k8s service配置
  8. └── tomcat                 #tomcat配置檔案
  9.    ├── Catalina
  10.    │   └── localhost
  11.    ├── catalina.policy
  12.    ├── catalina.properties
  13.    ├── context.xml
  14.    ├── logging.properties
  15.    ├── server.xml
  16.    ├── tomcat-users.xml
  17.    └── 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的索引使用。
  1. processors:
  2. - dissect:
  3.    tokenizer: "%{?key1}/%{?key2}/%{?key3}/%{wtype}/%{ltype}/%{domain}/%{?key7}/%{?key8}"
  4.    field: "source"
  5. 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)方案/
赞(0)

分享創造快樂