中國聯(lián)通大數(shù)據(jù)能力開放平臺為支撐公司內(nèi)部數(shù)據(jù)運營和外部數(shù)據(jù)合作提供了豐富的框架資源、數(shù)據(jù)資源、多樣化的組件和工具以及應(yīng)用部署環(huán)境。
平臺為每個入駐租戶都提供了獨享和隔離的計算框架和數(shù)據(jù)庫服務(wù),包括關(guān)系型、離線分析型、流數(shù)據(jù)類、KV類型等;提供的數(shù)據(jù)服務(wù)包括抽取聯(lián)通脫敏后的用戶標簽數(shù)據(jù);提供的數(shù)據(jù)加工、分析類組件種類就更多了,包括元數(shù)據(jù)、數(shù)據(jù)質(zhì)量、地圖服務(wù)、分布式服務(wù)框架、分布式ETL、工作流引擎等二十多種。
隨著容器技術(shù)的普及,一些租戶也提出了希望開放平臺能夠提供一個友好的容器開發(fā)和運行環(huán)境,開放平臺團隊經(jīng)過三個月的選型和研發(fā),近期發(fā)布了自己的容器云平臺,利用容器資源隔離、分布式部署、水平動態(tài)擴展、負載均衡、高可用等核心技術(shù)為公共、專業(yè)、創(chuàng)新等各類應(yīng)用的快速部署提供快速支撐。
容器云實踐
聯(lián)通大數(shù)據(jù)能力開放平臺容器云,是基于Kubernetes和Docker生態(tài)圈相關(guān)技術(shù),結(jié)合聯(lián)通大數(shù)據(jù)能力開放的特定業(yè)務(wù)場景,自主研發(fā)的一套完整容器云集群部署和管理平臺,實現(xiàn)快速部署、秒級停啟各類應(yīng)用,支持多種服務(wù)的集群部署、負載均衡、災(zāi)難恢復(fù)和彈性伸縮。
關(guān)于Docker、Kubernetes的功能和技術(shù)特性,就不在本文做具體的介紹了,感興趣的可以很容易找到各種技術(shù)資料,本文重點介紹支撐數(shù)據(jù)中心能力開放具體業(yè)務(wù)應(yīng)用場景,有針對性的優(yōu)化和改進。
1. 服務(wù)發(fā)現(xiàn)和路由
傳統(tǒng)基于虛擬機、物理機部署應(yīng)用時,首先要確定該業(yè)務(wù)是通過互聯(lián)網(wǎng)訪問還是通過內(nèi)部生產(chǎn)網(wǎng)訪問,通常我們的運維人員都需要在互聯(lián)網(wǎng)訪問區(qū)或用戶訪問區(qū)的代理設(shè)備上人工配置Nginx或者Apache等代理網(wǎng)關(guān),才能保證服務(wù)被正確可控訪問。
這種人工配置的方式顯然不適合容器化部署的需要,更不適合多租戶場景下的自動運維需要。為此我們對Kubernetes的代理訪問功能進行優(yōu)化,自主研發(fā)了kubernetesNG組件,該組件一方面能夠快速發(fā)現(xiàn)和注冊服務(wù),實時監(jiān)控服務(wù)信息變化并自動完成代理訪問接入控制,另一方面對請求被跨節(jié)點轉(zhuǎn)發(fā)做了針對性的優(yōu)化,下面是對使用kubernetesNG和沒有使用kubernetesNG時的對比:

使用KubernetesNG前服務(wù)發(fā)現(xiàn)和路由
這是使用kubernetesNG前的服務(wù)訪問方式,集群內(nèi)部署了3個應(yīng)用A、B、C,每個應(yīng)用有2個docker實例,外部訪問請求由Kubernetes負責調(diào)度到隨機的一個Node節(jié)點上,一般情況下還要由這個node節(jié)點上的Kube-proxy再次轉(zhuǎn)發(fā)到真正有服務(wù)的node節(jié)點上,客觀上在物理節(jié)點間形成了轉(zhuǎn)發(fā)。
每次發(fā)布新的應(yīng)用都由Kubernetes分配一個對應(yīng)端口NodePort,通常管理員需要手動的把NodePort配置到互聯(lián)網(wǎng)區(qū)或者用戶訪問區(qū)內(nèi)的Nginx負載均衡器上。
下面再來看看使用了kubernetesNG后的情況。

使用kubernetesNG后的服務(wù)發(fā)現(xiàn)和路由
kubernetesNG與負載均衡器安裝在同一臺機器上,kubernetesNG會實時監(jiān)控服務(wù)的變化,包括服務(wù)暴露區(qū)域(公網(wǎng)訪問區(qū)或者內(nèi)網(wǎng)訪問區(qū)),并且根據(jù)變化更新負載均衡器配置,然后調(diào)用負載均衡器的重新加載配置命令,實時生效,從而完成服務(wù)對外發(fā)布動作。
由于kubernetesNG可以實時的發(fā)現(xiàn)應(yīng)用部署的真正節(jié)點位置,所以通過配置負載均衡器,直接把請求分發(fā)到應(yīng)用所在的機器上,比如訪問應(yīng)用A,就會直接把請求分發(fā)到機器1和2上的kube-proxy,由kube-proxy把請求直接發(fā)給本機的應(yīng)用上(開源的kube-proxy會分發(fā)到其它機器上的,這里需要修改源碼)。通過對比我們發(fā)現(xiàn),新服務(wù)發(fā)布不再需要管理員手動配置負載均衡器了;原來請求需要經(jīng)過兩次負載均衡才能到達應(yīng)用,現(xiàn)在實際上只需要一次負載均衡就可以到達應(yīng)用了(第二次轉(zhuǎn)發(fā)由于在同一節(jié)點內(nèi)部完成,效率大大提高可以忽略不計了)。
2. 服務(wù)可視化調(diào)試
在租戶自助進行應(yīng)用容器化的部署和調(diào)試過程中,我們發(fā)現(xiàn)用戶問的最多的是怎么調(diào)試,能不能ssh登陸上去,能不能替換容器內(nèi)的配置文件。一般在容器中修改和調(diào)試腳本首選需要將sshd進程啟動起來, 再ssh登錄上去,然后修改容器內(nèi)的文件,但如果這時容器重啟了,Kubernetes會從自動倉庫重新拉取原來的鏡像,用戶所做的修改全都丟失,如何解決這個問題?