kubernetes理論之kubernetes組成

很多人剛接觸到kubernetes時可能並不是清楚kubernetes集羣的組成,而是首先根據一些集羣部署教程直接step one by one的嘗試部署一個集羣從實戰中去了解這項技術,希望能通過實戰加深對k8s的印象。但是由於版本變遷,環境不同等因素,可能別人在寫教程時還是能工作的步驟,到了你用的時候就是各種坑。雖然踩坑的過程也是一個學習的過程,但是到最後真正的理解了其中的原理,關係、邏輯,在滿足於成就感時,偶爾也會有一種一萬匹草泥馬澎湃於胸的感覺,感嘆自己居然在一些很low的問題上耗費了太多時間。本系列文章參考官方文檔,首先從k8s集羣的一些基本組成講起,確保讀者有對集羣,集羣各個組件之間的關係有一個基本瞭解。然後再講解k8s的手動,自動化部署。

本文結合kubernetes架構圖,簡要的的介紹了kubernetes的組件,以及各個組件之間的關係。

一. Kubernetes 概述

kubernetes是一個爲跨主機管理容器化應用而設計的系統,kubernetes提供了多節點資源管理、監控的功能,同時還提供了針對容器的部署,管理、擴容的功能。kubernetes是一個典型的Paas平臺。kubernetes主要針對的是容器化應用系統,雖然目前提到的容器主流是Docker,但是kubernetes對容器的支持不僅僅限於docker。kubernetes爲了能保證集羣中業務的正常運行,提供了針對被管理的容器的強大的自愈能力。如自動重啓,重新調度,容器遷移,基於活躍的controller複製容器等機制。

kubernetes設計首先針對的是多容器的應用,如彈性的、分佈式的微服務架構應用。同時它被設計用於促進一些非容器化的應用在遷移到kubernetes中來。這樣就既能包括對鬆耦合容器,又能包括對緊耦合容器的抽象,以提供相似的容器發現和通信機制。這個可能有點抽象,後面瞭解了kubernetes的pod,service等概念後,可能就能慢慢理解其中的一些門道了。

kubernetes還能自動收集、管理集羣資源,通過多種資源分配、管理機制提供對容器的資源隔離、限制等。kubernetes調度器能夠根據容器的資源設置自動選擇、並將容器調度到合適的節點上。當節點上發生資源競爭、資源過多使用時,kubernetes集羣也能根據該節點上運行的容器對資源設定的等級優先遷移一些低等級的容器來釋放資源優先滿足高等級容器的使用。

kubernetes爲了保證集羣的高可用性,還提供了多master的HA方式,保證在有master節點宕機是,還有standby的節點能夠自動頂上來繼續承擔master的職責,維護集羣功能正常。

下圖所示就是kubernetes集羣的架構圖:


二. Master 節點組成

如上面架構圖所示,master節點上主要有kube-Apiserver,kube-scheduler,kube-controller-manager。另外kubernetes集羣后端存儲使用高可用的鍵/值存儲系統etcd,etcd也可以是一個分佈式集羣,可以同master節點一同部署,也可以分別部署,在此同master節點一同介紹。

1)kube-apiserver

  API Server是Master Server上的一個最重要的服務。API Server是整個集羣的主管理節點,通過它用戶可以配置Kubernetes的負載和組織單元。它還負責確保etcd存儲和服務的細節同部署的容器保持一致。 
API Server實現了一套RESTfull的接口。一個kubecfg客戶端隨Server-side工具集打包,可以在local computer或連接到master server使用。 

2)kube-controller-manager

Controller Manager Service被用於處理Replication Tasks定義的Replication process。那些操作的細節都被寫到etcd中,Controller Manager監控etcd中的改動。當發現改動,Controller Manager讀取新的信息並實現滿足期望的Replication procedure。這可以實現應用程序的擴展和收縮。

3)kube-scheduler

Schedule Server負責分配工作負載到集羣中某個指定的節點。它讀取一個Service的操作需求,分析當前infrastructure環境,然後將work安排到一個合適的節點或多個節點。Scheduler還負責追蹤沒一個節點中的資源利用情況,並確保工作負載不會在超出可用資源的情況下被分配。Scheduler必須知道每個節點上的可用資源,以及每個節點上已經分配已經分配給已經存在的工作負載的資源。

4)etcd

Kubernetes需要提供的一個基本功能就是全局範圍內的配置存儲。etcd是由CoreOS開發的一個輕量級的,分佈式的鍵-值存儲系統,可以分步在不同的節點上。 
Kubernetes使用etcd存儲可以被集羣每一個節點使用的配置數據。etcd中存儲的數據可以被用於服務發現和存儲每個component可以應用來進行配置的集羣狀態表示。Etcd提供了一個簡單HTTP/JSON API可以用於設置和檢索。 
Kubernetes中etcd的實現比CoreOS中更加靈活,你可以選擇關閉除了Master上的所有etcd。因爲master server必須起來以保證Kubernetes的功能,分佈式存儲的值則不是必須的。

5)其他

另外如果需要在集羣中運行一些以容器運行的類似於插件的輔助功能的addons,如DNS,監控,日誌收集等還需要在master上運行一個kube-addons.sh的daemon創建namespace並定時檢查kubernetes目錄下addons目錄下是否有新的未被創建的addon resource。

如果需要把master節點也當做集羣的一個工作節點被調度執行容器,master上也需要安裝minion 節點需要安裝的組件。

使用不同的網絡方案,還需要安裝不同的網絡組件,如flanneld,openvswitch等

三. minion節點組成

minion節點的主要功能是調度容器,收集節點資源、以及管理容器資源使用情況,併爲容器提供代理功能等。節點上集羣相關的組件主要有kubelet,kube-proxy,另外要能運行容器,必不可少的還需要安裝容器 daemon,如docker。

1)Docker

Docker用於在一個相對隔離的,輕量級的環境中運行一個封裝應用的容器。

2)kubelet

集羣中,每個minion Server之間主要的contact point是kubelet Service。kubelet Service負責從master接收信息,同時也負責向master發送信息。另外還負責與etcd交互讀寫配置信息(實際爲通過Apiserver進行)。 
kubelet從master接收命令和工作。Work以’manifest’的形式接收,manifest定義了工作負載和操作參數。然後Kubelet承擔了在minion Server上維護工作狀態的職責。 

架構圖中所示,kubelet還與CAdvisor交互,CAdvisor是一個容器監控工具,能夠收集容器的CPU,memory等的使用情況,在比較新的k8s中,CAdvisor已經被集成到kubelet中。

3)kube-proxy

爲了應付單個主機的子網和可以對外提供服務,每一個minion Server上都運行了一個小的Proxy Server。Proxy負責轉發請求到正確的容器,能做基本的負載均衡,且通常負責確保網絡環境和可預測的,可訪問的,但又是隔離的。

kube-proxy會通過apiserver從etcd中獲取集羣信息,如果發現有新的service加入,或更新,則會獲取最新的信息。併爲service到容器建立相應的iptables規則,實現將請求直接轉發到相應的容器。kube-proxy提供兩種代理模式,一種是userspace模式,一種是iptables模式。1.2之前默認使用userspace模式,1.2之後默認使用iptables模式。iptables模式中,連接請求直接通過iptables規則轉發到容器,不在經過proxy代理,具有更高的效率。後續另開一文詳細分析k8s的網絡。

四. 小結

本文簡要介紹了kubernetes集羣的各個組件,以及各個組件的作用,讓讀者對kubernetes有一個簡單的概念。下一篇文章將介紹kubernetes集羣主要resource的概念,即作用。後續會進一步介紹kubernetes集羣的網絡方案,並結合網絡方案介紹集羣各個組件的詳細關係等。

五. 參考鏈接

kubernetes architecture:https://github.com/kubernetes/kubernetes/blob/master/docs/design/architecture.md

發佈了21 篇原創文章 · 獲贊 37 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章