如何快速部署容器化應用
$ git clone github.com/kplcloud/kplcloud && cd kplcloud/ $ kubectl apply -f install/kubernetes/kpaas/
下圖是開普勒雲平臺所對接的平臺及流程。
開普勒雲平臺通過呼叫Jenkins、Gitlab(Github)、Kubernetes等API的方式對應用進行操作。
將Consul的KV功能作為配置中心來使用,在開普勒雲平臺上可以直接呼叫Consul API進行操作,可以在配置檔案決定是否啟用Consul KV功能。
Jenkins目前只擔任程式碼編譯及將Docker映象上傳倉庫的功能。開普勒通過呼叫JenkinsAPI來建立Job或Build Job,並監聽Job狀態。
開普勒平臺還可呼叫Github或Gitlab API獲取專案的分支及需要上線的tags。並將相關資訊傳給jenkins,Jenkins拉取程式碼並執行相關構建過程。
三、使用
平臺呼叫Kubernetes API的資源及Jenkins API或告警都是以模版的方式進行處理,管理員可以根據自己公司所處的環境隨意調整相關資源的模版。
除了對生產最基本的需求外,還增加了對測試環境測試人員的需求支援。
- 應用克隆: 測試人員可能需要做到一個版本多套環境的場景。在平臺可以假設一個空間就是一種場景,在一個空間下部署完所有應用之後,需要在其他空間下也生成一樣的應用,為了方便操作,可以直接使用“工具集-克隆”功能完成一鍵克隆。
- 調整容器時間: 金融產品應該都會遇到調整時間的問題。通常測試一個功能需要對服務的時間進行修改,由於Docker使用的是宿主機的核心時間,容器無法對核心時間進行調整,那就需要藉助其他工具來完成這項工作。推薦使用一款開源的工具https://github.com/wolfcw/libfaketime,我們將該工具編譯到宿主機上,通過掛載的方式掛入容器裡,就能對單個容器進行調整而不影響其他容器了。
開普勒雲平臺功能眾多,下面挑幾個大家比較關心、常用的功能進行簡單介紹。(更多的功能介紹請檢視文件https://docs.nsini.com)
- 建立應用
- 釋出新版本
- 日誌採集
- 監控告警
- 持久化儲存
3.1 建立應用
建立一個應用的流程非常簡單,只需要填寫一些簡單的資訊,管理員稽核之後就會執行構建。應用升級只需要選擇tags,然後執行構建就可以完成。
以建立一個Go應用為例:
Dockerfile:
FROM golang:latest as build-env ENV GO111MODULE=on ENV BUILDPATH=github.com/kplcloud/hello RUN mkdir -p /go/src/${BUILDPATH} COPY ./ /go/src/${BUILDPATH} RUN cd /go/src/${BUILDPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -v FROM alpine:latest COPY --from=build-env /go/bin/hello /go/bin/hello WORKDIR /go/bin/ CMD ["/go/bin/hello"]
將以上Dockerfile放入專案目錄,填寫相關資訊:
一個應用就建立完成了,管理員稽核提交的資訊是否合格,不合格便駁回;合格了就直接通過並進行部署。
部署應用會根據使用者所提交的資訊獲取我們事先定義好的基礎模版,再根據基礎模版生成Kubernetes所能識別的資源,然後呼叫Kubernetes API建立這些資源。建立完成後再呼叫Jenkins API建立Job,最後執行構建。
Jenkins完成構建,並將Docker Image 上傳完倉庫之後,開普勒才會更新Kubernetes相關應用的版本。
在這個過程中若想加入更多操作,可以修改JenkinsCommand
模版。
3.2 釋出新應用
構建應用的流程是通過建立應用提交一些資訊進行處理。
- 從git 倉庫獲取tags列表。
- 呼叫jenkins API 將應用的相關引數及版本資訊傳給它並進行構建。
- Jenkins Job執行Shell命令,執行docker build並上傳至Docker Image倉庫。
- 平臺監聽到job已經成功執行,呼叫kubernetes API更新應用的Image地址。
- 監聽升級情況。
- 傳送通知。
以上是構建應用的後端流程,而前端就比較簡單了,只需要在應用詳情頁點選"Build"按鈕,在彈出的對話方塊中選擇想應用的tags版本並提交就行了,如下圖:
點選詳情頁的build日誌選項卡,會顯示最近的構建記錄,點選左側相應的版本,可以檢視該版本的構建情況,也可以對正在構建的應用進行中斷,如下圖:
3.3 日誌採集
我們的日誌收集採用的是低耦合、擴充套件性強、方便維護和升級的方案。
- 每個節點Filebeat收集宿主機日誌。
- 每個Pod注入Filebeat容器收集業務日誌。
Filebeat會跟應用容器部署在一起,應用也不需要知道它的存在,只需要指定日誌輸入的目錄就可以了。Filebeat所使用的配置是從ConfigMap讀取,只需要維護好收集日誌的規則。
如果配置了上面的採集器,那麼它會向服務所在的Pod注入一個Filebeat採集器對應用服務的業務日誌進行採集。把採集到的日誌注入到kafka叢集,然後logstash進行訊息處理及格式化。
處理完後入到ES叢集,最終我們就可以通過kibana查詢到業務日誌了。
Filebeat容器及filebeat的ConfigMap也可以通過模版的方式進行引數調整。
3.4 監控告警
應用監控告警也是非常重要的一個環節,我們採用Prometheus+Grafana的方案進行監控,Prometheus+AlertManager進行告警的處理。
AlertManager所丟擲的告警資訊會發送至開普勒雲平臺進行處理,若你在平臺訂閱了告警型別的訊息則會發送至所訂閱型別的相關工具。
我們可以在“個人設定-訊息訂閱設定”裡選擇需要訂閱的型別及接收的工具:
以下是微信接收到的操作通知:
更多的教程請查閱我們提供的文件。https://docs.nsini.com
3.5 持久化儲存
Kubernetes叢集管理員通過提供不同的儲存類,可以滿足使用者不同的服務質量級別、備份策略和任意策略要求的儲存需求。動態儲存卷供應使用StorageClass來實現,允許儲存卷按需被建立。 如果沒有動態儲存供應,Kubernetes叢集的管理員將不得不通過手工的方式來建立新的儲存卷。 通過動態儲存卷,Kubernetes能夠按照使用者的需求,自動建立其需要的儲存。
在選單找到“配置與儲存”->"持久化儲存卷宣告",選擇應用的空間,並點選“建立”按鈕,先建立一個儲存卷,然後我們找到需要掛載持久化儲存盤應用並進入詳情頁,找到“持久化儲存”選項卡,掛載剛剛所建立的持久化儲存卷就好了。
四、尾巴
開普勒平臺目前已開源,並且已有演示平臺可使用,提供完整文件供參考。文件詳細地介紹了相關服務的搭建過程,同時,提供了多種部署方案。
- Github: https://github.com/kplcloud/kplcloud
- Document: https://docs.nsini.com
- Demo: https://kplcloud.nsini.com
作者:王聰
宜信技術學院