Kubernetes 系列 1 一 容器是什麼?
在系統的對容器技術進行學習前,當我面對 “容器是什麼?” 這個問題的時候,腦海裏蹦出的只有以下零散的詞彙(或許正在讀文章的你也是一樣😅):
容器、Docker、鏡像、Kubernetes、容器編排、雲原生 ......
自己又嘗試把以上這些詞彙串起來回答這個問題:
“我們開發人員編寫好的服務(程序),使用 Dockerfile 構建成鏡像,然後運行在 Docker 上,而 Kubernetes 是用來對運行在 Docker 中的多個服務進行容器編排的,以上統稱爲雲原生技術。”
實際上,很多的業務開發人員瞭解到的也就是到這一步。這個回答也不算錯,但是又感覺沒有正面回答問題。原因還是由於業務開發人員認爲到部署應該交付給 SRE 來處理,所以有關容器的原理這一塊就很自然的不會作爲工作的重心從而就沒有關注了。
可能在空閒的時間,你還是想去對 Docker 一探究竟。但是去 Google 搜索 Kubernetes 的使用手冊,發現中文版本的只是生硬的翻譯,讀起來很費勁。英文的讀起來別說了,直接放棄。🤪
或許有些程序員有大量的摸魚時間,還是硬着頭皮繼續學習手冊了。好的,按照文檔到了部署環節。第一步環境問題,我 Goole、百度... “終於 tmd 解決了”🤕。第二步,鏡像源問題,我 Goole、百度... “真難搞,不行,要搞死我了,我放棄...”😤
就這樣在手冊裏有着無數個絆腳石,也對應着無數個放棄點。
而我接下來的一系列文章是我在經過這麼多絆腳石,摔過不知道多少次後對 Kubernetes 的理解。同時感謝張磊老師在極客時間的課程對我的幫助,(https://time.geekbang.org/column/article/14252)。希望我能夠用通俗易懂(說人話🙈)的方式向您解答以下問題來真正回到什麼是容器:
-
鏡像是什麼?
-
容器的底層原理是怎樣的?
-
容器編排是做哪些事情?
-
Kubernetes 是如何進行容器編排工作的?
只有回答了上述問題,我們才能正面回答 “什麼是容器?”,同時真正的瞭解雲原生技術,而不是讓我們 “雲” 裏霧裏的。
容器技術相較於物理機或者虛擬機提供的運維環境,是對網絡、存儲、OS 等各個方向的一次變革。所以對容器技術的理解也需要有這些方面知識的儲備,這也導致學習容器技術的路程比較艱辛。
我們首先通過一張圖(這張圖大家應該在學習容器時可能)來對比看下通過基於虛擬機和容器提供運維環境的不同。
可以看到在虛擬機時代,我們的應用是運行在虛擬出來的一個 OS 中,這個環境包括應用程序需要的動態庫等運行環境。各個應用之前被不同的 Guest OS 隔離開來。
而在容器時代,應用程序是共享 Docker “環境” 的。在瞭解了 Docker 是如何做到應用之間隔離後,再來看右邊這張圖,你會覺得描述得不是那麼準確,自己會有一幅更準確的圖像來描述 Docker,我們在後面的文章中會逐步講解到。
在後續真正的講解 Docker、Kubernetes 之前,本節將會給大家介紹有關容器技術的背景。
爲什麼需要容器?
在沒有容器概念之前,開發者發佈應用的步驟如下:
-
編譯應用程序(可運行二進制文件)
-
準備啓動該程序的運行腳本(shell 腳步)並同編譯的應用程序打包
-
將打好的包上傳至服務器
-
通過執行腳步運行程序
以上正是 PaaS 平臺來提供運維能力的步驟。而我們通過上述文章中左邊這張圖可以看的,程序運行會依賴一些 lib 庫或者其他依賴環境。這就帶來了一件研發人員很頭痛的事情打包。
很多時候在本地運行是沒問題的,但是上傳到服務器後就是運行不起來。或者新增加了一臺服務器,當部署應用的時候,需要安裝的系統依賴特別多,而且完成這些環境驗證通常沒有什麼捷徑可走,只有不停的試錯。
而容器的運行只依賴於鏡像,鏡像中包括了應用依賴的環境。而容器之所以可以很快的發展起來,正是因爲鏡像這個偉大的發明,釋放了開發者在打包這一步的勞動力。
打包只是其中的一部分,容器還提供了許多將便捷留給用戶(開發者),將複雜留給自己這些對用戶友好的使用規範,從而使容器技術取代早期的 PaaS 平臺。我們將在後續的文章中一一解讀。
容器 ≠ Docker
前面我們講到 Docker、容器,不免將這兩個概念搞混淆了。這裏我們要知道 Docker 和容器絕不是相等的。
容器只是一個理念。這個理念的實現,讓應用的運維管理從 PaaS 時代走向了容器時代。而一個以鯨魚爲商標的創業公司 dotCloud (後期直接將公司名稱改名爲了 Docker)所發佈的的產品 Docker 是衆多實現了容器概念的其中一個產品而已。
到今天基於容器概念實現的產品,估計大家知道的只有 Docker。而 Docker 是如何在衆多的容器產品中(其中還包括像 goole 等巨頭)廝殺出來,存活至今的,後續也會爲大家詳細介紹。
Kubernetes?容器編排?
那有了 Docker 之後,還需要 Kubernetes 做什麼呢?
Docker 提供的 Docker 鏡像技術解放了用戶的應用打包過程。但是僅僅只是打包,這當然是無法打敗現有成熟的 PaaS 平臺的。我們真正需要的是應用提供服務,而打包僅僅只是一個支線任務而已。這個時候 Kubernetes 提供了容器的調度、調用關係、運行守護等能力,使容器能夠提供服務,同時還保證了應用的持續服務能力。
以上對容器的調度、調用關係處理、保障正是容器編排。但是容器編排不僅僅只限於以上功能。同時期的容器編排工具同樣也有很多,而 Kubernetes 是如何殺出一條生路的,後面的文章我也會像大家詳細介紹。
今天的文章只是在糾正大家對容器、Docker 的理解,只是一個開胃小菜。後續會給大家上來一桌硬菜,敬請期待。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/Uv8mzP44XU6Ld2PzOiV49w