閱讀本文前請先參考【系統三智能運維實踐】系列文章前兩篇
前文已經介紹過目前系統三團隊的7e底層微服務是跑在一堆docker上的,但是是跑得裸docker,沒有用任何集群編排與管理工具,使用裸docker會有下面幾個問題:
容器的啟動、停止、銷毀都必須手動執行docker run/stop/rm命令,擴展一個相同容器也必須這樣操作,非常繁瑣
同一個微服務的兩個容器都映射了本地的目錄,做代碼更新的時候需要更新兩個宿主機節點,而實際卻經常只更新一個忘了另一個,造成版本不同步
不用集群管理的話,裸docker的網路管理,特別是不同宿主機之間的docker之間網路互通是個大問題,目前只能通過映射宿主機埠這種簡陋方式,不利於擴展,也不安全,相當於每個服務都對外暴露了埠
具有相互依賴關係的一組容器,啟停管理等都需要一定的順序,目前只能使用docker-compose這種簡陋方式操作
經過調研分析,我們在Kubernetes、Mesos、Swarm之間選擇了Kubernetes作為我們的容器集群管理工具。
什麼是Kubernetes
Kubernetes(k8s)是是由谷歌開源的自動化容器編排工具與容器管理平台,包括容器部署、調度和節點集群間擴展。使用Kubernetes可以為系統三的微服務與容器管理帶來如下好處:
容器的自動化部署和複製,定義好資源後直接上傳Yaml文件就可完成部署
隨時擴展或收縮容器規模,只需修改deployment裡面的replica參數即可,縮擴容後,負載均衡自動更新,無需人工干預。通過k8s的api將其和監控對接,可實現業務的變化關聯容器動態伸縮等智能場景
將容器組織成組,通過將具有緊密相關性的一組容器放在一個Pod可以整體管理、遷移、擴展
很容易的升級應用程序容器的新版本,或者回退到指定版本
通過網路插件可輕鬆實現容器間的網路通信,通過ClusterIP、NodePort等方式實現集群內部、外部的網路訪問
Kubernetes的Volumn可以通過對接NFS或者Ceph/GlusterFS實現容器之間的共享存儲,解決多地部署代碼的問題
……
Kubernetes集群架構
Kubernetes集群主要包括三部分:Etcd節點、Master節點、Node節點,如下圖所示:
kube-apiserver:作為kubernetes系統的入口進程,封裝了核心對象的增刪改查操作,以Restful介面方式提供給外部系統和內部組件調用,它維護的對象持久化到etcd里
kube-scheduler:負責集群的資源調度,為新建的pod分配機器,該部分可以替換成其它的調度器
kube-controller-manager:負責執行各種控制器,目前有兩類:endpoint-controller,定期關聯service和pod,保證service到pod的映射總是最新的;replication-controller,保證replicationController定義的副本數量與實際的pod數量一致
Node節點(也叫Minions)運行三個關鍵組件進程
Kubernetes相關的其它組件對象,如下圖:
kubectl是Kubernetes的命令行客戶端,它和apiserver通信,用於各類資源的增刪改查
Pod是kubernetes里最重要也是最基本的概念,Pod里運行一個或者一組容器(一般情況下具有緊密相關性的一組容器可以放在一個Pod,比如一個web+一個app+一個db)。每個Pod里有一個特殊的被稱為「根容器」的Pause容器,它的鏡像叫做gcr.io/google_containers/pause-amd64(當然這個鏡像在私有部署時需要放在我們的私有鏡像倉庫里)。同一個Pod里的容器共享同一個網路命名空間,它們之間互相訪問通過localhost+port。Pod是短暫的,不是持續性實體,Pod里的容器需要通過volumn進行持久化
Kubernetes集群部署規劃
系統三在部署k8s集群時採用3節點Master+3節點Etcd+多節點Node的架構,其中Etcd和Master公用節點。Kubernetes需要使用網路插件進行網路配置,本集群選擇flannel,因此Master和Node上還需要部署flannel和haproxy。
下圖是部署好整個集群以後,kubernetes-dashboard展示的Node信息:
下面給出一個簡單的微服務部署方法。編寫deployment.yaml文件(一個deployment是指一個應用部署資源定義),這是一個Python實現的人臉識別微服務:
使用kubectl或者kubernetes-dashboard創建該deployment,如:
下面編寫service.yaml文件(一個service是對一個deployment的負載均衡訪問)
使用kubectl或者kubernetes-dashboard創建該service,如:
創建完成後service會在pod所在Node上啟一個高位埠(如37260),外部系統通過NodeIP+NodePort即可訪問該微服務。現在修改我們的微服務網關KONG,將對應的微服務endpoint改成微服務新的NodeIP和NodePort,即可完成替換。
下圖是目前我們在kubernetes上部署的所有deployment,目前有24個微服務,已經將所有微服務從原來的裸docker遷移到kubernetes了。通過Kubernetes的replicationController可以控制當其中有宿主機Node掛了以後,自動將其上運行的Pod遷移到其它Node。或者某個Pod掛了以後,自動在另外的Node上重啟一個Pod,以補齊deployment中定義的replia數目。
使用了kubernetes以後,提升了系統三微服務的擴展、故障處理、日常變更、版本更新等運維管理能力,節約了大量人力,提升了不少效率。
喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!
本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧! 請您繼續閱讀更多來自 x86weekly 的精彩文章:
TAG:x86weekly |