Kubernetes容器雲的網際網路企業實踐

IT大咖說發表於2018-06-28
Kubernetes容器雲的網際網路企業實踐

內容來源:2017 年 11 月 25 日,噹噹網數字業務事業部技術總監李志偉在“Kubernetes Meetup | 北京站”進行《Kubernetes容器雲的網際網路企業實踐》演講分享。IT 大咖說(微信id:itdakashuo)作為獨家視訊合作方,經主辦方和講者審閱授權釋出。

閱讀字數:3488 | 9分鐘閱讀

嘉賓演講視訊及PPT回顧:t.cn/R1dGfA5

摘要

本次演講主要分享了在Kubernetes領域的實踐和經驗,分別介紹了將原應用遷移到Kubernetes的前期準備以及遷移過程中使用的規範。

現有平臺面臨的挑戰

不同企業開始往容器方向發展的初衷是不一樣的,有些企業是因為沒有運維工程師或運維團隊,而想要藉助某個平臺實現運維自動化。

有些企業可能是由於計算資源的利用率比較低。雖然一些大型的網際網路公司都是動輒擁有成千上萬臺伺服器,但實際上以我個人的經歷來看計算資源的利用率都不高,這裡有很多歷史的原因,其中之一就是為了獲得更好的隔離性,而實現隔離最好的辦法就是採用從物理機到基於虛擬的私有云技術。

對於有著比較長曆史的公司,應用部署往往會和本地的執行環境強相關,使得遷移變得非常困難,這時也需要有一個好的解決方案來解耦。另外業務總量的繁多,也會帶來管理的複雜度的提高。

為什麼選擇Kubernetes

上面提到的這些問題在我們的生產實踐中都有不同程度的遇到,雖然有很多的解決方案,但是我們最終還是選擇了Kubernetes。

Kubernetes首要解決了計算資源利用率低下的問題,得益於此我們的伺服器數量減少了一半。容器化解決了計算資源利用率問題。

業務容器映象一次構建,就能夠執行在多種環境上,這種方式減少了對執行環境的以來,給運維平臺帶來了足夠的靈活性,解決了服務商鎖定的問題,我們當時考慮的是如果某個IDC服務商不滿足服務要求如何做到快速遷移,一般來說大批量的服務遷移代價非常高,需要很長時間,容器化之後業務遷移時間只需要30分鐘左右。

通過Kubernetes的架構設計思想我們還可以規範網站系統的架構設計。最後還有一點就是它實現了運維自動化。

向容器雲平臺遷移前的準備工作

要想向容器雲遷移,企業內部需要一定的運維能力,如果企業的規模還不夠大,也可以考慮一些國內的容器雲服務提供商。下面來說下我們自己所做的一些準備工作。

首先自然是搭建Kubernetes叢集,私有Docker映象倉庫構建採用的是harbor,然後是獨立出來的叢集監控,CI/CD基礎設定使用的是Jenkins和helm,分散式儲存解決方案用的是Glusterfs。

業務遷移中使用的規範

從2015年底1.0版到之後的1.2、1.3版Kubernetes中的問題還是比較多的,企業要使用它是需要一定勇氣的。但現在基本上趨於成熟,對於大部分應用不用太多的改造也可以跑的很好。

即使是這樣,也不是所有的應用都可以遷移到容器雲中,如果應用能夠很好的符合雲原生的設計原則當然可以遷移進來,但是大部分的應用並不是按照這樣的設計原則設計的。這個時候最好的辦法是先將業務遷移進來,然後再逐步演進成微服務架構。

在這個過程中我們剛開始其實也沒有任何規範,之後才陸續制定了相關規範,下面來具體看下遷移規範。

容器映象封裝的基本原則

早期很多系統架構師都將Docker當做輕量級的虛擬機器在使用,但這並不是最佳實踐,要想正確的使用Docker需要符合以下基本原則:

- 儘可能設計成無狀態服務,它帶來的好處就是能夠非常容易的做水平擴充套件

- 儘可能消除不必要的執行環境依賴,如果容器內業務依賴太多水平擴充套件就會變的非常困難,在傳統的部署形式下,無論是虛擬機器部署還是物理機部署都經常會產生各種各樣沒必要的依賴,對於有一定歷史的企業這個問題就會非常嚴重

- 需要持久化的資料寫入到分散式儲存卷

- 儘可能保證業務單一性,這樣能夠讓分散式應用很容易擴充套件,同樣它也是微服務架構中的設計原則

- 控制輸出到stdout和stderr的日誌寫入量

- 配置與容器映象內容分離

- 容器中使用K8S內部dns代替ip地址配置形式

- 日誌採用集中化處理方案(EFk)

- 採用獨立的容器處理定時任務

NameSpace的使用

由於考慮到測試環境和staging等執行環境的資源利用率並不高,所以就想在一個叢集內部同時執行開發、測試、staging、生產環境。通過NameSpace實現不同執行環境的隔離,同時應用軟體在不同的執行環境之間也不會產生命名衝突。

Service的命名規範

在v1.5版之前Service的命名不能超過24個字元,v1.5版之後最多63個字元。另外還需要滿足正則regex[a-z]([-a-z0-9]*[a-z0-9])?的要求,這意味著首字母必須是a-z的字母,末字母不能是-,其他部分可以是字母數字和-符號。一般來說命名方式都是使用“業務名-應用伺服器型別-其他標識”的形式,如book-tomcat-n1、book-mysql-m1等。

應用健康檢查規範

應用健康檢查規範是實現自動化運維的重要組成部分,也是系統故障自動發現和自我恢復的重要手段。目前有兩種健康檢查方式,分別是程式級和業務級。

程式級健康檢查是Kubernetes本身具備的,它用來檢驗容器程式是否存活,是預設開啟的。

業務級的健康檢查由我們自己實現,它有三點要求,一是必須要檢查自身核心業務是否正常,二是健康檢查程式執行時間要小於健康檢查週期,三是健康檢查程式消耗資源要合理控制,避免出現服務抖動。

健康檢查程式在不同環境下有著不同的實現:

web服務下采用HTTPGET方式進行健康檢查,需要實現一個“/healthz”URL,這個URL對應的程式需要檢查所有核心服務是否正常,健康檢查程式還應該在異常情況下輸出每一個檢查項的狀態明細。

其他網路服務下可以採用探查容器指定埠狀態來判斷容器健康狀態。

非網路服務下需要在容器內部執行特定命令,根據退出碼判斷容器健康狀態。

Yaml中Image tag配置規範

部署容器映象時應該避免使用latest tag形式,否則一旦出現問題就難以跟蹤到當前執行的Image版本,也難以進行回滾操作。所以建議每個容器Image的tag應該用版本號來標識。

使用ConfigMap實現應用平滑遷移

早期的1.0版本配置資訊都是寫在配置檔案中的,要做遷移就需要改很多東西,當時就只有幾種方法可以傳遞配置資訊,其中一種是通過環境變數傳遞,然後內部還要有一個對應機制進行轉化,這其實是非常麻煩的過程。但是現在有了ConfigMap之後,就只需要將原先的配置檔案匯入到ConfigMap中就行了。

遷移中遇到的其他問題

關於CI/CD

我們在做遷移的時候採用的是Jenkins來實現CI/CD的,然後通過Helm來實現軟體包管理,Helm是Kubernetes的官方子專案,作為企業內部的應用管理是非常方便的,它使得開發者不用再去關注Kubernetes本身而只需要專注於應用開發就夠了。

時區的配置問題

從官方下載的映象都會有預設時區,一般我們使用的時候都需要更改時區,更改時區的方式有多種,這裡簡單說兩種。一是將容器映象的/etc/loacltime根據需要設定為對應的時區,二是採用配置檔案中的volume掛載宿主機對應的localtime檔案的方式。推薦採用第二種方式。

外部網路訪問Service

在沒有Ingress的時候我們是使用內建Nginx容器來轉發叢集內部服務,現在則是通過Ingress轉發叢集內部服務,Ingress通過NodePort方式暴露給外網。

最佳組合

Kubernetes容器雲的網際網路企業實踐

上圖展示的是Kubernetes的最佳組合,它以DevOps作為基礎,上層是k8s加上Containers,頂層構築的是微服務應用。這樣的組合帶來的不僅是一個容器雲,更多的是改變了研發流程和組織結構,這主要是受微服務的架構思想影響。

過去完成一個應用的版本釋出可能要多人協同,一旦有緊急釋出的時候就會發現這其實是非常笨重的。但是如果是基於微服務架構做的應用,往往一到兩個人就可以維護一個微服務,他們自己就可以決定這個微服務是否獨立部署上線。

關於微服務和Kubernetes還有一個優勢必須要強調,配合CI/CD開發人員終於可以不再考慮部署環境的細節了。


相關文章