大型網站技術學習-3. 容器Docker與kubernetes


大型網站技術基石篇-容器Docker與kubernetes

 

 

 

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 描述方式:

clipboard[7]
運行如下命令就會創建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  描述方式:


 

clipboard[8]
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描述如下:

clipboard[9]

該定義創建了一個服務,會將標簽為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]

 

 

持續更新~~~

轉載請注明出處:http://www.cnblogs.com/stonehat/p/5148455.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM