【高級部署】-Kubernetes K8S理論篇

前言:2019年已通過去了,在2019年阿里號稱雙11全面上雲,爲何要上雲?這你得問馬雲,開個玩笑...node

由於k8s的加持,讓雲發揮了更大價值,k8s的提供的彈性伸縮,使得雲資源獲得充分利用,目前全球三大雲所有都支持k8s,加上k8s自己就是谷歌的親兒子,在這樣的背景下,k8s愈來愈流行,做爲一名開發,學習k8s迫在眉睫,因此我開始上路了,你呢?docker


1.什麼是k8s?api

瞭解k8s是什麼以前,須要先了解docker,docker我就很少說了,沒基礎的本身惡補。若是說是微服務讓docker火了,那麼docker則讓k8s火了一把,k8s是由谷歌開源的一款容器集羣管理系統,能夠實現容器的自動化部署,自動擴容,縮容,維護,監控等功能。瀏覽器

在大型的系統中,背後可能有成千上萬個實例在運行,假設這些實例都是運行在docker容器中,實際上也幾乎都是,這麼多容器勢必會有一些容器在某些時間段是空閒的,也有些是掛掉的,若是依靠人肉運維去監控和管理這些容器,枯燥又燒錢。在像雙11這樣的場景下,因爲臨時增長了不少實例來支撐超大流量,但雙11事後這些實例資源就空置了,形成大量資源浪費,還有一些秒殺場景,可能在極短期內涌入大量流量,對服務器形成衝擊,有沒有辦法能在大流量的時候自動增長一些實例,在流量減小後自動下掉一些實例,固然有,它就是k8s,它的出現讓阿里雲更具備價值了,阿里雲有豐富的服務器資源,支撐着衆多企業的服務,在大部分場景下,不可能全部企業都在同一時刻流量洪峯,k8s可讓這些企業來共享這服務器資源,以彈性的方式伸縮,實現雙贏,能夠類比醫療保險。服務器

2.k8s能作什麼?網絡

經過k8s你能夠:快速部署服務,快速擴展應用,無縫對接新應用,負載均衡,監控,自動伸縮,節省資源,優化硬件資源使用...總之應有盡有。架構

3.k8s架構負載均衡

引用一張k8s官方的圖,雖然比較不清晰,也比較難看懂,不過不要緊,能夠繼續先往下看,看完組件再來看這張圖就比較清晰了運維

 

4.k8s組件微服務

k8s是基於主從架構的,其組件主要分爲兩大類,一類是Master組件,一類是Node節點組件,其他組件單獨介紹,由於很是重要!

Master組件包括:kube-apiserver,ETCD,kube-controller-manager,cloud-controller-manager,kube-scheduler,addons,DNS,用戶界面,容器資源監測,Cluster-level Logging.

Node組件包括: kubelet,kube-proxy,docker,RKT,supervisord,fluentd

組件有點多,雖然多k8s而言,以上組件幾乎都是重要組件,但對開發同窗而言,僅須要重點掌握其中幾個組件,其它組件簡單瞭解便可,下面我將核心組件重點解釋,而且加粗,非核心組件,簡單瞭解,一筆帶過~

 

Master組件:

 

kube-apiserver: 用於暴露k8s API,任何資源的請求/調用操做都是經過kube-apiserver提供的接口進行的.

ETCD:etcd是k8s默認的存儲系統,存儲全部集羣數據,使用時須要爲etcd數據提供備份計劃.

kube-controller-manager:運行管理控制器,是集羣中用來處理常規任務的後臺線程.

cloud-controller-manager:雲控制器是負責與底層雲提供商的平臺交互.

kube-scheduler:k8s的調度器,監視新建立但沒有分配到Node的pod,爲pod選擇一個Node.

addons:插件,是實現集羣pod和service功能的.

DNS:雖然不嚴格要求使用插件,但k8s集羣都應該具備集羣DNS,集羣DNS是一個DNS服務器,可以爲k8s service提供DNS記錄.

用戶界面:kube-ui,提供集羣基礎信息查看,是常常要被開發同窗用到的.

容器資源監測:提供瀏覽器UI監控數據,也是常常要被用到的.

cluster-level logging:負責保存容器日誌,查看/搜索容器日誌.

 

Node組件:

 

kubelet:是主要的節點代理,它會監視已分配給節點的pod

kube-proxy:經過主機上維護網絡規則並執行鏈接轉發來實現k8s服務抽象.

docker:用於運行容器

RKT:做爲docker工具的替代方案

supervisord:輕量級的監控系統,保障kubelet和docker運行

fluentd:是一個守護進程,提供cluster-level logging

 

5.核心概念

pod:pod是k8s中建立或部署的最小基本單位,一個Pod表明集羣中正在運行的一個進程,一個pod能夠由一個或多個容器組成,這些容器共同部署在一個節點上成爲一個單元,一個Pod具備一個Ip,該ip在容器之間共享.

node:node節點是部署Pod的物理機(或虛擬機)

NameSpace:能夠將物理上的cluster邏輯上劃分紅多個cluster,每一個cluster就是一個Namespace,不一樣namespa裏的資源是徹底隔離的.

Label:標籤,能夠爲pod打上Label標籤,Label是以key-value形式存儲的,打上標籤以後,就能夠經過命令快速篩選出同類pod

Annotation:與Label相似,也是以key-value形式存儲的,主要用來記錄一些信息,如發佈的版本號,負責人之類的.

service:邏輯上的一組pod,service是對訪問Pod策略的抽象層,能夠把相同的pod劃分進同一個service中,對外提供服務.由於Pod具備伸縮性,pod重啓Ip發生改變後服務如何找到對應pod? 答案就是service,它經過label找到pod組,對調用方是無感知的,由於service的ip是固定的,service會在幾個Pod中作負載均衡.

controller:k8s經過controller來管理Pod,controller裏定義裏Pod的部署特性,k8s提供了多種controller,包括deployment,replicaset,daemonset,job...來知足多種業務場景.

deployment:最經常使用的controller,能夠管理Pod的多個副本,並確保pod按照指望的狀態運行.

 

至此,k8s的基本概念就梳理完了,有了這些理論,再回頭看3中的架構圖,就比較容易懂了,看懂架構圖以後,也就能夠進入實戰篇了,我會持續更新,實戰k8s以及將k8s和rancher結合,屆時會把連接附在這裏.

因爲本人水平有限,文中如有不正之處望留言指正.

參考文獻:https://www.kubernetes.org.cn/doc-30 (k8s中文社區)