深入淺出Docker(六):像谷歌一樣部署你的應用

f663x 9年前發布 | 46K 次閱讀 Docker

1.概述

谷歌發起的開源項目從來都是廣受技術圈的關注和討論,本文將介紹的就是最新的容器編排管理系統 Kubernetes。 Kubernetes開源項目版本更新頻繁,對于初次使用者來說其定義大量的技術術語并且隨時會有新術語出現。在這種不穩定的技術框架之下,對使用者來說 確實帶來了一定的技術門檻。為了掌握Kubernetes的核心技術概念,本文嘗試通過深入閱讀官方文檔資料并整理出核心的使用實踐思路,以飧國內 Kubernetes技術愛好者參考研究。

1.1 Kubernetes是什么

深入淺出Docker(六):像谷歌一樣部署你的應用

Kubernetes是一個容器集群的編排管理系統。這里對于“編排”的理解應該基于如何在跨Docker主機的場景之下統一管理容器集群的方法。 當前的Docker技術主要提供單機版的容器管理實踐,很多第三方廠商通過自己以往的網絡經驗推出自己的容器編排工具,Google推出的 Kubernetes技術是在這個背景下創立的開源項目。這個項目嘗試要解決的問題就是簡化開發和運維容器集群的工作,讓開發和運維能把這個系統當一臺電 腦看待。這個思想在沒有Docker容器技術之前,早已在分布式系統中得到大量應用,類如Hadoop、Mesos、Yarn。由于虛擬化技術的限制,對 于更大實例規模仍然有很大的局限性。Docker技術出現后,本來已經很復雜的分布式系統開始嘗試向更大規模的集群規模實現,這個實現標準的誘惑力讓更多 的廠商參與進來并嘗試在原有Mesos、Yarn類集群調度系統中開始應用Docker技術。那么Kubernetes和Mesos類相比較,它的優勢是 沒有資源調度算法,只關注容器的管理。而Mesos、Yarn之類調度系統本身有完善的調度系統經驗,如何把Docker編排的架構加入到原有系統中,需 要一些標準設計參考實現,這個時候Kubernetes的出現正好彌補了這個需要。

1.2 Kubernetes技術術語概覽

第一,在Kubernetes的集群環境里Pods是最小的可部署單元,它表示同屬于一個應用的容器群的邏輯集合。

第二,Master節點提供了集群統一視圖的中心控制點。我們可以用一個Master節點來控制多個Minion節點。

第三,Minion是一個工作節點,它將運行Master節點交付的任務。Minions能運行一個或多個Pods。它提供了在容器環境下一個應用級別的虛擬機。

通過以下概念圖,我們可以更加清晰的看到Kubernetes的技術全貌。

深入淺出Docker(六):像谷歌一樣部署你的應用

讓我們再深入一點,講一講Kubernetes是如何做到這些特性的。

  • Replication Controller 是Master上的資源控制器,確保創建、銷毀Pods的請求能隨時被Minions節點運行。這樣可以保證集群中的Pod可以永遠提供服務,而當Pod運行失敗后可以立即開啟新Pod實例,保證Pod實例服務的可用性可以保證。
  • Service 提供統一的名稱和地址,提供針對一組Pods的負載均衡。這個Service其實就是微服務的實現,它在我們創建的Pods的基礎之上提供一層抽象。比如 我們的Service是一個Job服務,前端應用可以直接發布任務到指定的Servcie IP就可以了,用戶對于這個Job服務有多少個實例提供服務不需要關心。
  • Label 是一個強制的鍵值對,保存在分布式存儲服務etcd上,讓Replication Controller能用它去實現服務發現。
  • Kubelet 是在每個Minion上管理容器的守護進程,它是實際管理Docker主機來啟動容器的管理程序。
  • Master API Server 提供RESTful K8s API接口來校驗和配置Pod、Service和Replication Controller,它是統一管理集群系統的入口。

1.3 與Docker工具鏈的關系

Docker近期推出的三大套件:Compose、Swarm、Machine都提供了一些Kubernetes的功能,我們需要了解他們之間的區別,讓我們能更好的利用Kubernetes做好基礎。

  • Docker Machine是比較底層的入口,比Kubernetes的實現更底層一些。Machine提供了基礎設施IaaS的能力,方便管理混合云狀況下的Docker主機。類似Google Compute Engine。
  • Docker Swarm完全基于Docker API之上定義的Cluster API。方向上是Docker API提供單機范圍內的API,由Swarm提供Cluster級別的API。Google的Kubernetes團隊在早期Swarm實現討論上提供了自己的意見
  • Docker Compose還是單機版的開發套件,對于開發者來說,可以使用它把當前的代碼構建出指定的Docker Image,然后運行在單機上。Kubernetes就是為了解決部署到容器集群的難度而定義的標準實現。當前Compose正在實現基于Swarm和 Machine實現集群編排的能力,這種能力就是Kubernetes的直接競爭對手。

2.使用實戰

我們可以參照官方提供的各類平臺安裝腳本來部署Kubernetes集群系統,本文采用Ubuntu系統作為基礎系統用來安裝Kubernetes集群。官方提供的腳本按照以下幾步安裝即可安裝成功:

首先,把Kubernetes的源碼下載到每一臺集群機器上,自行構建最新版的套件。

$ cd cluster/ubuntu-cluster
$ sudo ./build.sh
$ sudo cp ./binaries/* /opt/bin   #復制到/opt/bin目錄,主要是為了方便部署腳本調用。

然后,配置Kubernetes集群組件,假設我們的機器清單如下:

 

IP Address

Role

192.168.100.30

master

192.168.100.31

minion

192.168.100.32

minion

只需要到cluster/ubuntu-cluster目錄下執行一遍configue.sh就可以完成配置。

比如在master節點(192.168.100.30)上:

$ sudo ./configure.sh
Welcome to use this script to configure k8s setup

Please enter all your cluster node ips, MASTER node comes first
And separated with blank space like "  ":  192.168.100.30 192.168.100.31 192.168.100.32

This machine acts as
  both MASTER and MINION:   1
  only MASTER:              2
  only MINION:              3
Please choose a role > 2

IP address of this machine >  192.168.100.30

Configure Success

當你看到信息“Configure Success” 時代表這臺機器的配置算完成了。

當然,在官方的Ubuntu例子中,它使用Flannel創建了一套覆蓋網絡(Overlay Network),通過這個網絡實現了跨主機的容器互聯互通。大家可以通過圖1flannel網絡截圖知道flannel0和docker0被分在同一網 段,Docker內部容器ip和docker0網關之間是有NAT的,通過flannel+etcd提供自定義的udp數據包,實現跨主機的容器之間的互 聯,通過這個例子可以幫我們深入的理解跨主機容器互聯SDN的主要實現思路。

圖1 flannel網絡截圖

深入淺出Docker(六):像谷歌一樣部署你的應用

在部署完Kubernetes系統后我們可以通過內置的命令來驗證服務是否正常。比如運行

$ kubectl get minions
NAME                LABELS              STATUS
192.168.100.30                  NotReady
192.168.100.31                  Ready
192.168.100.32                  Ready

好了,系統成功了。我在部署的過程中發現,并不是每次都能順利完成安裝。比如端口被占用,關鍵服務沒起來等情況。那么我把這些情況總結一下,方便大家排除故障:

  • master節點,主要的服務是kube-apiserver、kube-controller-manager、kube-scheduler,如下截圖顯示需要保證能運行:

    深入淺出Docker(六):像谷歌一樣部署你的應用

    如果沒有看到運行的進程,應該去看一下運行日志,在Ubuntu的安裝實例中,日志統一放在/var/log/upstart/目錄下。

  • slave節點,主要的服務是kube-proxy、kubelet兩個服務,如下截圖顯示需要保證能運行:

    深入淺出Docker(六):像谷歌一樣部署你的應用

  • 網絡相關的組件,主要是etcd服務,還有SDN的組件服務類如Flannel。這一塊出問題的情況很少,我遇到大多數問題都是集中在網絡拓撲上,通過學習理解這種網絡就可以基本解決問題。
  • Kubernetes項目還不是生產級別的工程,沒有在實際的場景中經過生產級別的驗證。我們正好通過官方提供的example目錄中的例子理解我們的場景中到底需要什么功能,然后反饋到社區,讓Kubernetes越來越成熟。

3.總結

Kubernetes在2014年9月發布第一個版本之后,版本迭代都是按周實施的。官方還不建議用戶在生產環境中使用這套系統。但是它的設計思想 以及簡潔的架構設計足以讓我們借鑒到很多工程上的寶貴經驗。在借鑒的成功案例中,紅帽的Openshift最新版本V3中就成功應用了 Kubernetes實現技術。所以,Kubernetes項目是一個值得大家借鑒學習的優秀開源項目,通過理解它的設計思想,可以很快應用到本地的容器 編排集群系統實現中。

4. 作者簡介

肖德時,數人科技(www.dataman.io)CTO,致力于構建基于Mesos/Docker的容器云計算平臺。推ter/微博賬號:xds2000,郵箱:xiaods@gmail.com

原文  http://www.infoq.com/cn/articles/deploy-your-application-like-google

 本文由用戶 f663x 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!