Docker產(chǎn)生的原因
研發(fā)本地開發(fā)的代碼,交付運維部署到生產(chǎn)環(huán)境時,會由于環(huán)境、配置等各種非代碼因素的原因無法順利發(fā)布,每次發(fā)版時需要浪費人力物力去排查問題。
Docker的簡介
Docker屬于容器,而容器就是將軟件打包成標準化單元,以用于開發(fā)、交付和部署。以前是代碼即應用,現(xiàn)在是運行環(huán)境、代碼,才是應用,不會出現(xiàn)本地可以運行,但是生產(chǎn)卻無法運行。一次構建處處運行,減少人工運行成本。


虛擬機和Docker區(qū)別
虛擬機模擬的是整套環(huán)境,包括硬件、環(huán)境。虛擬機的啟動時長是分鐘級,而docker可以做到秒級。虛擬機資源占用多、冗余步驟多、啟動慢。
虛擬機時在一個操作系統(tǒng)里運行另外一種操作系統(tǒng),比如在Windows系統(tǒng)里面運行Linux,應用程序無感知。因為虛擬機看上去和真實系統(tǒng)一模一樣,而對于底層系統(tǒng)來說,虛擬機就是一個普通文件,不需要了就刪除,對其他部分毫無影響。

容器和虛擬機區(qū)別,容器不再是整套環(huán)境的模擬,而是需要的庫資源和設置,和應用代碼綁定在一個環(huán)境中。
傳統(tǒng)虛擬機技術是虛擬出一套硬件后,在其上運行一個完整操作系統(tǒng),在該系統(tǒng)上再運行所需應用進程;而容器內的應用進程直接運行于宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統(tǒng)虛擬機更為輕便。


鏡像簡介
Docker包括三個基本概念:鏡像、容器、倉庫。
鏡像(Image)——一個特殊的文件系統(tǒng),即可直接在OS上運行的代碼和環(huán)境
容器(Container)——鏡像運行時的實體,正在對外提供服務的實體
倉庫(Repository)——集中存放鏡像文件的地方
容器鏡像是輕量的、可執(zhí)行的獨立軟件包 ,包含軟件運行所需的所有內容:代碼、運行時環(huán)境、系統(tǒng)工具、系統(tǒng)庫和設置。鏡像解決的問題是,彈性擴容數(shù)十臺集群的機器,不可能通過人手工去維護,而是通過鏡像去復制粘貼到不同服務器上去。
Docker - Build, Ship, and Run Any App, Anywhere
Build(構建鏡像):鏡像就像是集裝箱包括文件以及運行環(huán)境等等資源。
Ship(運輸鏡像):主機和鏡像倉庫間運輸,這里的倉庫就像是超級碼頭一樣。
Run (運行鏡像):運行的鏡像就是一個容器,容器就是運行程序的地方。
Docker運行過程也就是去倉庫把鏡像拉到本地,然后用一條命令把鏡像運行起來變成容器。所以,我們也常常將Docker稱為碼頭工人或碼頭裝卸工,這和Docker的中文翻譯搬運工人如出一轍。
容器服務K8S
Kubernetes是Google在2014年開源的一個容器集群管理系統(tǒng),Kubernetes簡稱K8S。K8S用于容器化應用程序的部署,擴展和管理。K8S提供了容器編排,資源調度,彈性伸縮,部署管理,服務發(fā)現(xiàn)等一系列功能。
容器解決了研發(fā)環(huán)境和生產(chǎn)環(huán)境一致性的問題。而Kubernetes目標是讓批量部署容器化應用簡單高效。
容器K8S特點
【1】自我修復:在節(jié)點故障時重新啟動失敗的容器,替換和重新部署,保證預期的副本數(shù)量;殺死健康檢查失敗的容器,并且在未準備好之前不會處理客戶端請求,確保線上服務不中斷。
【2】彈性伸縮:使用命令、UI或者基于CPU使用情況自動快速擴容和縮容應用程序實例,保證應用業(yè)務高峰并發(fā)時的高可用性;業(yè)務低峰時回收資源,以最小成本運行服務。
【3】自動部署和回滾:K8S采用滾動更新策略更新應用,一次更新一個Pod,而不是同時刪除所有Pod,如果更新過程中出現(xiàn)問題,將回滾更改,確保升級不受影響業(yè)務。
【4】服務發(fā)現(xiàn)和負載均衡:K8S為多個容器提供一個統(tǒng)一訪問入口(內部IP地址和一個DNS名稱),并且負載均衡關聯(lián)的所有容器,使得用戶無需考慮容器IP問題。
【5】機密和配置管理管理機密數(shù)據(jù)和應用程序配置,而不需要把敏感數(shù)據(jù)暴露在鏡像里,提高敏感數(shù)據(jù)安全性。并可以將一些常用的配置存儲在K8S中,方便應用程序使用。
【6】存儲編排:掛載外部存儲系統(tǒng),無論是來自本地存儲,公有云(如AWS),還是網(wǎng)絡存儲(如NFS、GlusterFS、Ceph)都作為集群資源的一部分使用,極大提高存儲使用靈活性。
【7】批處理:提供一次性任務,定時任務;滿足批量數(shù)據(jù)處理和分析的場景。

Masternode:統(tǒng)一入口由Master節(jié)點的APIServer實現(xiàn)。
scheduler:是負責調度策略
Controller Manager:作為集群內部的管理控制中心,負責集群內的Node、Pod副本、服務端點(Endpoint)、命名空間(Namespace)、服務賬號(ServiceAccount)、資源定額(ResourceQuota)的管理,當某個Node意外宕機時,Controller Manager會及時發(fā)現(xiàn)并執(zhí)行自動化修復流程,確保集群始終處于預期的工作狀態(tài)。
Worknode就是對應的部署了同樣業(yè)務代碼的節(jié)點。
Kube_proxy提供網(wǎng)絡代理等負載均衡功能。
pod是worknode節(jié)點上運行的多個實例,實現(xiàn)高可用、彈性擴展。因為是無狀態(tài)服務,如果實例異常無法使用,實例漂移之后,可以不依賴任何數(shù)據(jù)。有狀態(tài)服務則是依賴網(wǎng)絡IP,存儲的數(shù)據(jù)。

Controller Manager中的Replication Controller,稱為副本控制器。副本控制器的作用即保證集群中一個RC所關聯(lián)的Pod副本數(shù)始終保持預設值。
Controller Manager中的Endpoints表示了一個Service對應的所有Pod副本的訪問地址,而Endpoints Controller負責生成和維護所有Endpoints對象的控制器。它負責監(jiān)聽Service和對應的Pod副本的變化。

Pod是kubernetes中你可以創(chuàng)建和部署的最小也是最簡單位。一個Pod代表著集群中運行的一個進程,可能由一個或者多個容器組合在一起共享資源。
為什么k8s使用Pod在容器之上再封裝一層呢?
一個很重要的原因是Docker容器之間的通信受到網(wǎng)絡機制的限制。在Docker的世界中,一個容器需要通過link方式才能訪問另一個容器提供的服務(端口)。大量容器之間的link將是一個非常繁重的工作。通過Pod的概念將多個容器組合在一個虛擬的“主機”內,可以實現(xiàn)容器之間僅需通過Localhost就能相互通信了。
Ingress是用戶訪問域名之后,解析成IP,分發(fā)給對應Service。而Service則是容器對外統(tǒng)一暴露的接口,隱藏容器內部的實現(xiàn)邏輯。由于容器是無狀態(tài)服務,當pod服務異常重啟新的pod替代時,會產(chǎn)生新的IP地址。
node則是pod所運行的主機,可能是物理機,也可能是虛擬機。