kubernetes(k8s)以及涉及組件簡單介紹

來源:http://blog.csdn.net/qq_35254726/article/details/54233781

什麼是kubernetes?

        Kubernetes是一個全新的基於容器技術的分佈式架構領先方案。是Google內部集羣管理系統Borg的一個開源版本。直到2015年4月,隨着論文發佈,才被衆人熟知。Kubernetes是一個開放的開發平臺。不侷限於任何一種語言,沒有限定任何編程接口。是一個完備的分佈式系統支撐平臺。它構建在docker之上,提供應用部署、維護、擴展機制等功能,利用Kubernetes能方便地管理跨機器運行容器化的應用。Kubernetes在大概兩三週前,正式發佈1.5版本。

主要功能體現在如下:

使用Docker對應用程序包裝、實例化 以集羣的方式運行、管理跨機器的容器 解決Docker跨機器容器之間的通訊問題 Kubernetes的自我修復機制使得容器集羣總是運行在用戶期望的狀態

基本概念:

        Kubernetes中的大部分概念Node、Pod、Replication Controller、Service等都可以看作一種“資源對象”,幾乎所有的資源對象都可以通過kubectl工具(API調用)執行增、刪、改、查等操作並將其保存在etcd中持久化存儲。從這個角度來看,kubernetes其實是一個高度自動化的資源控制系統,通過跟蹤對比etcd庫裏保存的“資源期望狀態”與當前環境中的“實際資源狀態”的差異來實現自動控制和自動糾錯的高級功能。
Master:集羣控制管理節點,所有的命令都經由master處理。

Node:是kubernetes集羣的工作負載節點。Master爲其分配工作,當某個Node宕機時,Master會將其工作負載自動轉移到其他節點。

        Node節點可動態增加到kubernetes集羣中,前提是這個節點已經正確安裝、配置和啓動了上述的關鍵進程,默認情況下,kubelet會向Master註冊自己,這也kubernetes推薦的Node管理方式。一旦Node被納入集羣管理範圍,kubelet會定時向Master彙報自身的情況,以及之前有哪些Pod在運行等,這樣Master可以獲知每個Node的資源使用情況,並實現高效均衡的資源調度策略。如果Node沒有按時上報信息,則會被Master判斷爲失聯,Node狀態會被標記爲Not Ready,隨後Master會觸發工作負載轉移流程。
Pod:是kubernetes最重要也是最基本的概念。每個Pod都會包含一個 “根容器”,還會包含一個或者多個緊密相連的業務容器。                                 
        Kubernetes爲每個Pod都分配了唯一的IP地址,稱之爲PodIP,一個Pod裏的多個容器共享PodIP地址。要求底層網絡支持集羣內任意兩個Pod之間的直接通信,通常採用虛擬二層網絡技術來實現(Flannel)。
Label:是一個key=value的鍵值對,其中key與value由用戶自己指定。可以附加到各種資源對象上,一個資源對象可以定義任意數量的Label。可以通過LabelSelector(標籤選擇器)查詢和篩選資源對象。                                           

                  
RC:Replication Controller聲明某個Pod的副本數在任意時刻都符合某個預期值。定義包含如下:

   (1)Pod期待的副本數(replicas)

   (2)用於篩選目標Pod的Label Selector

   (3)當Pod副本數小於期望時,用於新的創建Pod的模板template

  (4)通過改變RC裏的Pod副本數量,可以實現Pod的擴容或縮容功能

  (5)通過改變RCPod模板中的鏡像版本,可以實現Pod的滾動升級功能


                       

思考:如果Node2上的pod死掉怎麼辦?

Service:“微服務”,kubernetes中的核心。通過分析、識別並建模系統中的所有服務爲微服務,最終系統有多個提供不同業務能力而又彼此獨立的微服務單元所組成,服務之間通過TCP/IP進行通信。每個Pod都會被分配一個單獨的IP地址,而且每個Pod都提供了一個獨立的Endpoint以被客戶端訪問。 思考:客戶端如何訪問?         部署負載均衡器,爲Pod開啓對外服務端口,將Pod的Endpoint列表加入轉發列表中,客戶端通過負載均衡器的對外IP+Port來訪問此服務。每個Service都有一個全局唯一的虛擬ClusterIP,這樣每個服務就變成了具備唯一IP地址的“通信節點”,服務調用就變成了最基礎的TCP網絡通信問題。
Volume:是Pod中能夠被多個容器訪問的共享目錄。定義在Pod之上,被一個Pod裏的多個容器掛載到具體的文件目錄之下;與Pod生命週期相同。 可以讓一個Pod裏的多個容器共享文件、讓容器的數據寫到宿主機的磁盤上或者寫文件到 網絡存儲中,具體如下圖所示:                                                      
        在kubernetes1.2的時候,RC就由Replication Controller升級成Replica Set,“下一代RC”。命令兼容適用,Replica Set主要被Deployment這個更高層的資源對象所使用,從而形成一套Pod創建、刪除、更新的編排機制。當我們使用Deployment時,無需關心它是如何創建和維護ReplicaSet的,這一切是自動發生的。

docker

        既然k8s是基於容器的,那麼就不得不提到docker。2013年初,docker橫空出世,孕育着新思想的“容器”,Docker選擇容器作爲核心和基礎,以容器爲資源分割和調度的基本單位,封裝整個軟件運行時環境,爲開發者和系統管理員設計,用於構建、發佈和運行分佈式應用的平臺。是一個跨平臺、可移植並且簡單易用的容器解決方案。通過操作系統內核技術(namespaces、cgroups等)爲容器提供資源隔離與安全保障。                               
        上圖是一個image的簡單使用。我們可以通過一個dockerfile來build自己的image。可以把image上傳(push)到自己的私有鏡像倉庫,也可以從私有倉庫pull到本地進行使用。可以單獨使用命令行,直接run container,可以對container進行stop、start、restart操作。也可以對image進行save保存操作以及加載load操作,大傢俱體可以根據自己的使用,選擇不同的操作即可。

docker資源隔離技術

        2013年初,docker橫空出世,孕育着新思想的“容器”,Docker選擇容器作爲核心和基礎,以容器爲資源分割和調度的基本單位,封裝整個軟件運行時環境,爲開發者和系統管理員設計,用於構建、發佈和運行分佈式應用的平臺。是一個跨平臺、可移植並且簡單易用的容器解決方案。通過操作系統內核技術(namespaces、cgroups等)爲容器提供資源隔離與安全保障。(關於這兩種資源隔離技術,本人只能從功能上說明兩者相當於就是分組,隔離,但是具體的內部原理還不甚瞭解,所以此處只提下概念,如皋想要深入瞭解,可蒐集其他資料)

docker監控

        cAdvisor(Container Advisor)是Google開發的用於分析運行中容器的資源佔用和性能指標的開源工具。cAdvisor是一個運行時的守護進程,負責收集、聚合、處理和輸出運行中容器的信息。對於每個容器,cAdvisor都有資源隔離參數、資源使用歷史情況以及完整的歷史資源使用和網絡統計信息的柱狀圖。         cAdvisor不但可以爲用戶提供監控服務,還可以結合其他應用爲用戶提供良好的服務移植和定製。包括結合InfluxDB對數據進行存儲,以及結合Grafana提供web控制檯,自定義查詢指標,並進行展示。                    

etcd

     etcd是一個鍵值存儲倉庫,用於配置共享和服務發現。etcd受Zookeeper與doozer啓發而催生的項目。

etcd架構

                                     

etcd存儲

        etcd的存儲分爲內部存儲和持久化(硬盤)存儲兩部分。內存中的存儲除了順序化地記錄所有用戶對節點數據變更的記錄外,還會對用戶數據進行索引、建堆等方便查詢的操作。而持久化則使用WAL進行記錄存儲。在k8s中,所有數據的存儲以及操作記錄都在etcd中進行存儲,所以對於k8s集羣來說,etcd是相當重要的,一旦故障,可能導致整個集羣的癱瘓或者數據丟失。    在WAL體系中,所有的數據在提交之前都會進行日誌記錄。持久化存儲的目錄分爲兩個:snap和wal。snapshot相當於數據壓縮,默認會將10000條wal操作記錄merge成snapshot,節省存儲,又保證數據不會丟失。
   WAL:存儲所有事務的變化記錄    Snapshot:用於存放某一時刻etcd所有目錄的數據 思考:數據損壞或者機器故障怎麼辦???

etcd核心算法

etcd的核心算法是raft算法,強一致性算法。具體如下圖所示                  
                      
注意:由於etcd是負責存儲,所以不建議搭建單點集羣,如zookeeper一樣,由於存在選舉策略,所以一般推薦奇數個集羣,如3,5,7。只要集羣半數以上的結點存活,那麼集羣就可以正常運行,否則集羣可能無法正常使用。

k8s集羣部署方案

如下是我的集羣部署策略,1個master + 2個node(minion1.2之前的叫法)。我的存儲集羣etcd是單點集羣,不推薦此做法,你懂得,哈哈。網絡使用的是flannel虛擬二次網絡。                         

如何驗證?

搭建完成之後,命令行執行:kubectl  get  no    查看節點狀態是否ready。 其他的大家可以通過代碼來進行驗證,看是否可以成功訪問各個服務以及成功運行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章