【編者按】Docker是PaaS供應(yīng)商dotCloud開源的一個基于LXC 的高級容器引擎,源代碼托管在 GitHub 上, 基于Go語言開發(fā)并遵從Apache 2.0協(xié)議開源。Docker提供了一種在安全、可重復的環(huán)境中自動部署軟件的方式,它的出現(xiàn)拉開了基于云計算平臺發(fā)布產(chǎn)品方式的變革序幕。為了更好的促進Docker在國內(nèi)的發(fā)展以及傳播,我們決定開設(shè)《深入淺出Docker》專欄,邀請Docker相關(guān)的布道師、開發(fā)人員、技術(shù)專家來講述Docker的各方面內(nèi)容,讓讀者對Docker有更深入的了解,并且能夠積極投入到新技術(shù)的討論和實踐中。另外,歡迎加入InfoQ Docker技術(shù)交流群交流Docker的最佳實踐,QQ群號:124378115。 1.概述谷歌發(fā)起的開源項目從來都是廣受技術(shù)圈的關(guān)注和討論,本文將介紹的就是最新的容器編排管理系統(tǒng) Kubernetes。Kubernetes開源項目版本更新頻繁,對于初次使用者來說其定義大量的技術(shù)術(shù)語并且隨時會有新術(shù)語出現(xiàn)。在這種不穩(wěn)定的技術(shù)框架之下,對使用者來說確實帶來了一定的技術(shù)門檻。為了掌握Kubernetes的核心技術(shù)概念,本文嘗試通過深入閱讀官方文檔資料并整理出核心的使用實踐思路,以飧國內(nèi)Kubernetes技術(shù)愛好者參考研究。 1.1 Kubernetes是什么Kubernetes是一個容器集群的編排管理系統(tǒng)。這里對于“編排”的理解應(yīng)該基于如何在跨Docker主機的場景之下統(tǒng)一管理容器集群的方法。當前的Docker技術(shù)主要提供單機版的容器管理實踐,很多第三方廠商通過自己以往的網(wǎng)絡(luò)經(jīng)驗推出自己的容器編排工具,Google推出的Kubernetes技術(shù)是在這個背景下創(chuàng)立的開源項目。這個項目嘗試要解決的問題就是簡化開發(fā)和運維容器集群的工作,讓開發(fā)和運維能把這個系統(tǒng)當一臺電腦看待。這個思想在沒有Docker容器技術(shù)之前,早已在分布式系統(tǒng)中得到大量應(yīng)用,類如Hadoop、Mesos、Yarn。由于虛擬化技術(shù)的限制,對于更大實例規(guī)模仍然有很大的局限性。Docker技術(shù)出現(xiàn)后,本來已經(jīng)很復雜的分布式系統(tǒng)開始嘗試向更大規(guī)模的集群規(guī)模實現(xiàn),這個實現(xiàn)標準的誘惑力讓更多的廠商參與進來并嘗試在原有Mesos、Yarn類集群調(diào)度系統(tǒng)中開始應(yīng)用Docker技術(shù)。那么Kubernetes和Mesos類相比較,它的優(yōu)勢是沒有資源調(diào)度算法,只關(guān)注容器的管理。而Mesos、Yarn之類調(diào)度系統(tǒng)本身有完善的調(diào)度系統(tǒng)經(jīng)驗,如何把Docker編排的架構(gòu)加入到原有系統(tǒng)中,需要一些標準設(shè)計參考實現(xiàn),這個時候Kubernetes的出現(xiàn)正好彌補了這個需要。 1.2 Kubernetes技術(shù)術(shù)語概覽第一,在Kubernetes的集群環(huán)境里Pods是最小的可部署單元,它表示同屬于一個應(yīng)用的容器群的邏輯集合。 第二,Master節(jié)點提供了集群統(tǒng)一視圖的中心控制點。我們可以用一個Master節(jié)點來控制多個Minion節(jié)點。 第三,Minion是一個工作節(jié)點,它將運行Master節(jié)點交付的任務(wù)。Minions能運行一個或多個Pods。它提供了在容器環(huán)境下一個應(yīng)用級別的虛擬機。 通過以下概念圖,我們可以更加清晰的看到Kubernetes的技術(shù)全貌。 讓我們再深入一點,講一講Kubernetes是如何做到這些特性的。
1.3 與Docker工具鏈的關(guān)系Docker近期推出的三大套件:Compose、Swarm、Machine都提供了一些Kubernetes的功能,我們需要了解他們之間的區(qū)別,讓我們能更好的利用Kubernetes做好基礎(chǔ)。
2.使用實戰(zhàn)我們可以參照官方提供的各類平臺安裝腳本來部署Kubernetes集群系統(tǒng),本文采用Ubuntu系統(tǒng)作為基礎(chǔ)系統(tǒng)用來安裝Kubernetes集群。官方提供的腳本按照以下幾步安裝即可安裝成功: 首先,把Kubernetes的源碼下載到每一臺集群機器上,自行構(gòu)建最新版的套件。 $ cd cluster/ubuntu-cluster $ sudo ./build.sh $ sudo cp ./binaries/* /opt/bin #復制到/opt/bin目錄,主要是為了方便部署腳本調(diào)用。 然后,配置Kubernetes集群組件,假設(shè)我們的機器清單如下:
只需要到cluster/ubuntu-cluster目錄下執(zhí)行一遍configue.sh就可以完成配置。 比如在master節(jié)點(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 " 當你看到信息“Configure Success” 時代表這臺機器的配置算完成了。 當然,在官方的Ubuntu例子中,它使用Flannel創(chuàng)建了一套覆蓋網(wǎng)絡(luò)(Overlay Network),通過這個網(wǎng)絡(luò)實現(xiàn)了跨主機的容器互聯(lián)互通。大家可以通過圖1flannel網(wǎng)絡(luò)截圖知道flannel0和docker0被分在同一網(wǎng)段,Docker內(nèi)部容器ip和docker0網(wǎng)關(guān)之間是有NAT的,通過flannel+etcd提供自定義的udp數(shù)據(jù)包,實現(xiàn)跨主機的容器之間的互聯(lián),通過這個例子可以幫我們深入的理解跨主機容器互聯(lián)SDN的主要實現(xiàn)思路。 圖1 flannel網(wǎng)絡(luò)截圖 在部署完Kubernetes系統(tǒng)后我們可以通過內(nèi)置的命令來驗證服務(wù)是否正常。比如運行 $ kubectl get minions NAME LABELS STATUS 192.168.100.30 好了,系統(tǒng)成功了。我在部署的過程中發(fā)現(xiàn),并不是每次都能順利完成安裝。比如端口被占用,關(guān)鍵服務(wù)沒起來等情況。那么我把這些情況總結(jié)一下,方便大家排除故障:
3.總結(jié)Kubernetes在2014年9月發(fā)布第一個版本之后,版本迭代都是按周實施的。官方還不建議用戶在生產(chǎn)環(huán)境中使用這套系統(tǒng)。但是它的設(shè)計思想以及簡潔的架構(gòu)設(shè)計足以讓我們借鑒到很多工程上的寶貴經(jīng)驗。在借鑒的成功案例中,紅帽的Openshift最新版本V3中就成功應(yīng)用了Kubernetes實現(xiàn)技術(shù)。所以,Kubernetes項目是一個值得大家借鑒學習的優(yōu)秀開源項目,通過理解它的設(shè)計思想,可以很快應(yīng)用到本地的容器編排集群系統(tǒng)實現(xiàn)中 |
|