容器Docker和Kubernetes

本文爲轉載內容,轉載地址:http://www.cnblogs.com/stonehat/p/5148455.html
Docker和Kubernetes的關係就如Xen與OpenStack。
Docker是一種容器技術,和Hypervisor(KVM/Xen這類)不同的是,Docker不會提供一整個操作系統,他能提供隔離的程序運行環境。對一個應用來說這已經夠了。
Kubernetes是Google的一個開源容器管理項目,他能利用Docker/其他技術部署/管理容器集羣。



  Docker
        
 
項目地址:https://www.docker.com/
 
 

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上,與KVM這類超級底層虛擬化方案相比,Docker是一種輕量級虛擬化方案,他不需要對內核進行改變,他主要利用linux內核特性實現虛擬化,所有容器運行在同一個內核中。另外,docker還可以部署在KVM/XEN這類虛擬機中!  容器與虛擬機對比如下圖。

 
clipboard 

Docker的架構

Docker使用客戶端-服務器(client-server)架構模式。Docker客戶端會與Docker守護進程進行通信。Docker守護 進程會處理複雜繁重的任務,例如建立、運行、發佈你的Docker容器。Docker客戶端和守護進程可以運行在同一個系統上,當然你也可以使用 Docker客戶端去連接一個遠程的Docker守護進程。Docker客戶端和守護進程之間通過socket或者RESTful API進行通信。

 
clipboard[1]
 

Docker重要概念

 
鏡像(Image)
 

Docker鏡像是一個只讀的模板。舉個例子,一個鏡像可以包含一個運行在Apache上的Web應用和其使用的Ubuntu操作系統。鏡像是用來創建容器的。Docker提供了簡單的,你也可以下載別人已經創建好的鏡像。

 
 
倉庫(Image)
 

Docker倉庫用來保存鏡像。其相當於一個代碼倉庫,同樣的,Docker倉庫也有公有和私有的概念。公有的Docker倉庫名字是Docker Hub。也可以自己創建倉庫。

 
 
容器(Container) 
 

一個Docker容器包含了某個應用運行所有的所需要的環境。每一個Docker容器都是從Docker鏡像創建 的。Docker容器可以運行、開始、停止、移動和刪除、保存爲鏡像。每一個Docker容器都是獨立和安全的應用平臺。

 

Docker內部採用Linux的命名空間機制實現隔離性,採用cgroup實現資源的劃分(例如給容器劃分2G內存、0.5個cpu)。

 

 

隔離-命名空間介紹

 

 

命名空間是爲操作系統層面的虛擬化機制提供支撐,目前實現的有六種不同的命名空間,分別爲mount命名空間、UTS命名空間、IPC命名空間、用戶命名空間、PID命名空間、網絡命名空間。命名空間簡單來說提供的是對全局資源的一種抽象,將資源放到不同的容器中(不同的命名空間),各容器彼此隔離。命名空間有的還有層次關係,如PID命名空間,圖 爲命名空間的層次關係圖。可以簡單理解爲像C++,java那樣的命名空間。

 
clipboard[2]
 
 

資源劃分-cgroup介紹

    

 cgroup就是controller group,最初由google的工程師提出,後來被整合進Linux內核中,它爲Linux內核提供了一種任務聚集和劃分的機制,通過一組參數集合將一些任務組織成一個或多個子系統。 cgroup能限制某個或者某些進程的分配資源。也就是能完成一組容器的概念,在這個容器中,有分配好的特定比例的cpu時間,IO時間,可用內存大小等。Cgroups是實現IaaS虛擬化(kvm、lxc等),PaaS容器沙箱(Docker等)的資源管理控制部分的底層基礎。

子系統是根據cgroup對任務的劃分功能將任務按照一種指定的屬性劃分成的一個組,主要用來實現資源的控制。在cgroup中,劃分成的任務組以層次結構的形式組織,多個子系統形成一個數據結構中類似多根樹的結構。cgroup包含了多個孤立的子系統,每一個子系統代表單一的資源。

 

 

Docker示例

 

在安裝docker之後,運行其守護進程,然後就可以使用docker創建運行容器。安裝docker可以百度一下。
運行docker命令,顯示信息就表示安裝成功。最好內核是3.8以後的。
 
clipboard[3]
 

1. 採用docker pull命令從公共庫中拉取(下載)一個鏡像到我的電腦上。

 
clipboard[4]

2. 採用docker run命令,可以指定一個鏡像作爲基礎運行容器。 我這裏指定了ubuntu鏡像,因爲我電腦中沒有ubuntu鏡像,他會自動從公共倉庫下載ubuntu的鏡像。仔細瞧的話,可以看出我進入了該容器的bash程序。

clipboard[5]
 

3. 輸入docker images,可以查看主機上存儲的鏡像。

 
 clipboard[6]
 
Docker也提供了很多方便的命令對鏡像進行操作。
 

  kubernetes
         

項目主頁:http://kubernetes.io/
docker僅能在單機上部署容器,而kubernetes可以統一管理各類容器,形成集羣。Kubernetes作爲Docker生態圈中重要一員,是Google多年大規模容器管理技術的開源版本。Kubernetes支持GCE、vShpere、CoreOS、Azure等平臺,也可以直接運行在物理機上。 
Kubernetes非常適合做微服務的架構。

其主要功能如下:

1) 用戶不需要關心需要多少臺機器,只需要關心軟件(服務)運行所需的環境。以服務爲中心,你需要關心的是api,如何把大服務拆分成小服務,如何使用api去整合它們。

2) 以集羣的方式運行管理容器。

3) 解決Docker跨機器容器之間的通訊問題。

4) Kubernetes的Pods自我修復機制使得容器集羣總是運行在用戶指定的狀態。

Kubernetes有幾個重要的概念:


1. Pod

Kubernetes的容器管理的最小單位不是容器,貌似說的很彆扭。 就是容器並不是Kubernetes管理的最小單元,而是Pods,

一個Pod包含一個或者多個容器。例如一個小程序有數據庫和後臺程序,可以分別放到一個容器裏面,這兩個容器組成一個Pods。

Pod的YAML 描述方式:

運行如下命令就會創建Pod:
kubectl create -f ./hello-world.yaml
運行如下命令就會查看Pod狀態:
$ kubectl get pods

 

2. minion/node

 

minion和node的意思是一樣的,是一個主機節點的意思。例如一個虛擬機、一個物理主機。注意,一個Pod不會跨越node。就是即使一個Pod有多個容器,裏面的容器會同時存在在同一個Node中,不會分別在不同的Node中。 Kubernetes的調度器會根據Pod的資源需求定義來將Pod分配到不同的Node中(如今支持定義CPU需求、內存需求)。Kubernetes的master/slave程序運行在node裏面。


3. Replication Controller

 

Replication 是複製的意思,用來解決Pod的線性擴容縮容問題,Replication Controller可以創建一個pod的多個副本,並且可以保證集羣中該Pod的副本數量保持平衡。例如副本數量規定爲10,如果某個pod掛了,數量變爲9,那麼Replication Controller會自動創建一個Pod,恢復到10個副本的水平。 多個副本可以在不同的Node中。 

Replication Controller的YAML  描述方式:


 

replicas表示副本的數量 
template是對Pod的描述。ReplicationController根據template創建多個Pod(數量=replicas),標籤爲app: nginx。
運行如下命令就會創建Replication Controller:
kubectl create -f ./nginx-rc.yaml

 

4. Service

 

Service用來解決Pod的服務發現問題,因爲Pod的運行狀態可以動態變化(機器切換、宕機),所以訪問端最好不要直接去訪問某個Pod,而是通過service,service能夠將請求進行轉發。

服務的YAML描述如下:

該定義創建了一個服務,會將標籤爲app:nginx(selector選的)的Pod納入服務中,也就是說該服務接收到的請求會轉發給標籤爲app: nginx的Pod處理。注意:service是負載均衡的,會自動分配請求給不同的Pod。有沒有覺得很方便?把Serivce暴露給客戶端,客戶端只需要請求service,不需要知道後臺是個集羣。

運行如下命令就會創建Service:


kubectl create -f ./nginx-rc.yaml

 

5. Label

 

標籤,用來做邏輯上的標記。用來關聯service、replication controller和pod.

 

 

 

Kubernetes架構

 

下圖爲官方的架構圖。

 
architecture

 

 

從圖中看出,Kubernetes的架構是典型的master/Slave架構。

Master負責總體的協調控制,Slave負責具體的任務。Master/Slave的組件如下:

 

clipboard[10]

 

 

盜個圖,下圖能更清晰的展示Kubernates

 

clipboard[11]

 

 


發佈了94 篇原創文章 · 獲贊 184 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章