$ 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
作者:王聰
宜信技術學院