標籤:

【技術總結】一起聊聊Kubernetes

上次talk show我們介紹了Docker,它具有輕量級,易操作,易部署等優點。

Why Kubernetes?

下圖是一個真實的Docker腳本。

這個腳本用於構建一個鏡像,腳本要提前運行生成鏡像。一般的shell腳本是處理一個任務。下圖是在開發環境里運用Docker的示意圖。

軟體工程師用Docker file來構建Docker環境。Source code在Image外面。Image掛載在Container上面,App運行在這個環境中。因為Source code和運行環境沒有關係,所以可以用任何IDE運行。運行結果將和任何人運行的都一樣。Source code不能放在Docker里,否則一旦關閉Docker,source code也會消失。

舉例來說,Mac里有個shell命令叫Date,可以返回當前日期。但這個命令在Linux里用法不同。如果程序里包含Date這個命令,就會出錯。Docker能避免這個問題。

下圖是真實環境下的Docker的架構分類

其中HTTP server接到請求給Web Server處理。這幾部分面臨Deployment,Management和Maintenance方面的問題。Kubernetes能夠解決這些問題。

What is Kubernetes?

Kubernetes是Google開源的容器集群管理系統,其提供應用部署、維護、 擴展機制等功能,利用Kubernetes能方便地管理跨機器運行容器化的應用,不只限於Docker,其主要特點如下:

1)Support multi-cloud platfform: AWS, Azure, Digital Ocean, GCE

當前Kubernetes支持GCE、vShpere、CoreOS、OpenShift、Azure等平台,除此之外,也可以直接運行在物理機上。

2)Scale across hosts

以集群的方式運行、管理跨機器的容器。

3)Auto-scale/Manual Scale

可自動擴展。

4) Self-healing

Kubernetes的自我修復機制使得容器集群總是運行在用戶期望的狀態。

(reference from:Kubernetes系統架構簡介)

可以說它的本質是一個Scheduler。它有兩層實現,在Kubernetes里實現自動的增加減少,在後台AWS也可以自動增減。

下面舉個例子。

最開始我們只有一個image。運行一個單一的Docker單元。

多個image協同工作,比如下圖三個。在Kubernetes里資源的最小單位是Pod。它裡面可以有多個image單元,但至少有一個image。

在集群里有多個Pod。Pod是在機器上。Node里可以有多個Pod。

外界用戶發送request,由Kubernetes里的Service去找到對應的服務。比如下圖中Pod1和Pod3都是針對FrontEnd的服務。當用戶需要FrontEnd的回應時,Service自動找到Pod1和Pod3。同時Service還有load balance的作用。我們的服務需要是無狀態的。Service在master結點上。

Replication controller可以用來創建image。比如我們想創建兩個BackEnd的Pod,可以由Replication controller進行,並且不用關心這下Pod所在的具體機器。如果一個Pod有問題,Replication controller會自動重新創建。Service是針對用戶角度的一種抽象,Replication controller是針對資源的一種機制。

Master結點裡包括Replication controller。還有Etcd,Rest API,Scheduler,Controller Manager。

Etcd是Key/value存儲狀態的一個系統,和zookeeper功能類似,存儲所有的node的狀態信息。

Rest API靠一個工作單元Kubelet來負責和各個node之間進行通信。

當Pod2壞了,Scheduler會重新開啟一個BackEnd的Pod。負責調度Pod的啟動時間,順序。

Controller Manager和Replication controller同時工作,並管理它。

Kubernetes一個問題是如果master失敗,則整個系統失敗,沒有backup。

以上是從用戶的角度來分析。從軟體工程師的角度來看,運用Kubectl進行操作,與集群對話。Kubectl就是一個命令行工具,類似AWS里的命令行。

下圖顯示的是Scheduler Reschedule的過程。如圖有三台機器,兩個Pod。第一列表示正常情況。第二列表示Pod2出現問題。第三四列是兩種可能的情況,一種是在Node3上重新開啟一個Pod,另一種是在Node1上重新開啟一個Pod。

相同的例子。當Pod不夠用時,要Scale Pod。下圖第二三列是可能的情況。

下面是具體的例子。代碼在下圖的github連接里。

首先運行Kubernetes一個包里的腳本。設置一個環境變數Kubernetes=AWS,在AWS上部署服務。把配置文件放在AWS上。

下圖是運行成功時的界面。

具體代碼詳見github。

下圖是一個典型datapipe的架構。Nginx和WebServer是數據的入口,存到Kafka里。此外需要一些輔助服務,比如MySQL等。數據處理完後存到Kafka里。用Hive或者Drill分析數據。Zookeeper負責監控。這種典型的大公司架構非常複雜。雖然性能很好,但是非常耗費人力。對這個架構進行改善,如下圖。

藍色方框用Kubernetes實現,綠色方框用第三方的雲服務實現。同時增加很多服務,比如Graphite等等。架構使用者主要負責監控。

下圖是CICD的實現

圖中有兩個github,一個存Kubernetes的配置文件,另一個存application。開發人員將源代碼pull到本地進行開發。使用Docker的運行環境。開發完後將改動push到github。Jenkins負責監控。它會觸發Build腳本。下面是Test,最後Push回Docker-hub,部署到Kubernetes。同時集群更新image。

註:本文系2月24日晚太閣技術秀一起聊聊Kubernetes的技術總結,作者為Shaoke Xu

更多精彩內容, 請掃描下面二維碼,關注微信公眾賬號「論碼農的自我修養」


推薦閱讀:

如何快速建立生物信息分析環境
Docker 容器與鏡像的儲存
【DockerCon2017最新技術解讀】Docker最新特性介紹
Egg.js+Antd 擼個簡易版阿里雲CS控制台?
Docker Remote API 如何使用?

TAG:Docker |