Kubernetes是一個用於容器集羣的自動化部署、擴容以及運維的開源平臺。程序員
節點是Kubernetes中最小的計算硬件單元。它是集羣中單個機器的表示。在大多數生產系統中,節點極可能是數據中心中的物理機器,或者是託管在像谷歌雲平臺這樣的雲供應商上的虛擬機。不過,不要讓慣例限制了你的想象力,從理論上講,你能夠把任何東西作成一個結點。編程
把機器看做一個「節點」,可讓咱們插入一個抽象層。如今,咱們沒必要擔憂任何單個機器的獨特特性,而是能夠簡單地將每臺機器看做一組可使用的CPU和RAM資源。這樣,任何機器均可以替代Kubernetes集羣中的任何其餘機器。緩存
雖然使用單個節點是有用的,但它與Kubernetes理念不一樣。通常來講,你應該將集羣看做一個總體,而無需擔憂單個節點的狀態。網絡
在Kubernetes中,節點匯聚資源,造成更強大的機器。當你將程序部署到集羣中時,它將智能地處理將工做分配給你的各個節點。若是添加或刪除了任何節點,集羣將根據須要在工做中進行轉換。這對程序或程序員來講都不重要,由於機器其實是在運行代碼。負載均衡
由於在集羣上運行的程序不能保證在特定的節點上運行,因此沒法將數據保存到文件系統中的任意位置。若是一個程序試圖將數據保存到一個文件中,但隨後又被轉移到一個新的節點上,那麼該文件將再也不是程序指望的位置。因爲這個緣由,與每一個節點相關的傳統本地存儲被看成臨時緩存來保存程序,但本地保存的任何數據都不能持久。運維
爲了永久存儲數據,Kubernetes使用持久卷(PersistentVolumes)。雖然全部節點的CPU和RAM資源都被集羣有效地聚集和管理,但持久的文件存儲卻不是。相反,本地或雲驅動器能夠做爲持久卷附加到集羣上。這能夠看做是將外部硬盤插入到集羣中。持久卷提供了能夠掛載到集羣的文件系統,而不與任何特定節點相關聯。3d
在Kubernetes上運行的程序被打包成Linux容器。容器是一個被普遍接受的標準,所以已經有許多預先構建的映像能夠部署在Kubernetes上。cdn
容器化容許你建立自足式的Linux執行環境。任何程序和它的全部依賴項均可以打包成一個文件,而後在網絡上共享。任何人均可如下載該容器並在其基礎設施上部署它,所需的設置很是少。建立一個容器能夠經過編程方式完成,從而造成強大的CI和CD管道。blog
能夠將多個程序添加到單個容器中,可是若是可能的話,你應該將本身限制爲每一個容器的一個進程。擁有不少小容器比一個大容器好。若是每一個容器都有一個緊密的焦點,那麼更新更容易部署,而且問題更容易診斷。教程
與你過去使用的其餘系統不一樣,Kubernetes不直接運行容器;相反,它將一個或多個容器封裝到一個稱爲Pod的高級結構中。相同Pod中的任何容器都將共享相同的名稱空間和本地網絡。容器能夠很容易地與其餘容器在相同的容器中進行通訊,就像它們在同一臺機器上同時保持必定程度的隔離。
Pod被用做Kubernetes的複製單元。若是你的應用程序太受歡迎,單個的Pod實例沒法承載負載,那麼能夠配置Kubernetes以在必要時將你的Pod的新副本部署到集羣。即便在沒有重載的狀況下,在生產系統中任什麼時候候都要有多個副本,以保證負載均衡和故障抵抗。
Pod能夠容納多個容器,但在可能的狀況下應該限制本身。由於Pod做爲一個單位被放大和縮小時,全部在一個Pod裏的容器都必須在一塊兒縮放,無論它們是否須要。這將致使資源的浪費和成本增長。爲了解決這個問題,Pod應該保持儘量小的大小,一般只保留一個主進程和緊密耦合的輔助容器(這些輔助容器一般被稱爲「側三輪摩托車」)。
雖然Pod是Kubernetes的基本計算單元,但它們一般不是直接在集羣上啓動的。相反,Pod一般由一個抽象層來管理:部署。
部署的主要目的是聲明一個Pod應該同時運行多少個副本。當將部署添加到集羣中時,它將自動地旋轉加速所需的Pod數量,而後監視它們。若是一個Pod消失,部署將自動從新建立它。
使用部署,你沒必要手動處理Pod。你只需聲明系統的指望狀態,它將自動爲你管理。
使用上面描述的概念,你能夠建立一個節點集羣,並將Pod部署到集羣上。不過,還有一個問題須要解決:容許外部通訊流進入你的應用程序。
默認狀況下,Kubernetes提供隔離艙和外部世界。若是你想要與運行在Pod中的服務通訊,你必須打開一個通訊通道。稱做入口(ingress)。
有多種方法能夠將入口添加到集羣中。最多見的方法是添加入口控制器或負載均衡器。這兩個選項之間的精確權衡超出了本文的範圍,可是你必須知道,在你能夠與Kubernetes進行實驗以前,你須要處理的是入口。