史上最全Kubernetes資料集萃!菜鳥變高手這一篇就夠了
一、Kubernetes 介紹
Kubernetes是一個全新的基于容器技術的分布式架構領先方案, 它是Google在2014年6月開源的一個容器集群管理系統,使用Go語言開發,Kubernetes也叫K8S。K8S是Google內部一個叫Borg的容器集群管理系統衍生出來的,Borg已經在Google大規模生產運行十年之久。K8S主要用于自動化部署、擴展和管理容器應用,提供了資源調度、部署管理、服務發現、擴容縮容、監控等一整套功能。2015年7月,Kubernetes v1.0正式發布,截止到2020年5月27日最新穩定版本是v1.18。Kubernetes目標是讓部署容器化應用簡單高效。
Kubernetes最初源于谷歌內部的Borg,提供了面向應用的容器集群部署和管理系統。Kubernetes 的目標旨在消除編排物理/虛擬計算,網絡和存儲基礎設施的負擔,并使應用程序運營商和開發人員完全將重點放在以容器為中心的原語上進行自助運營。Kubernetes 也提供穩定、兼容的基礎(平臺),用于構建定制化的workflows 和更高級的自動化任務。
Kubernetes 具備完善的集群管理能力,包括多層次的安全防護和準入機制、多租戶應用支撐能力、透明的服務注冊和服務發現機制、內建負載均衡器、故障發現和自我修復能力、服務滾動升級和在線擴容、可擴展的資源自動調度機制、多粒度的資源配額管理能力。Kubernetes 還提供完善的管理工具,涵蓋開發、部署測試、運維監控等各個環節。
二、Kubernetes主要功能
Kubernetes是docker容器用來編排和管理的工具,它是基于Docker構建一個容器的調度服務,提供資源調度、均衡容災、服務注冊、動態擴縮容等功能套件。Kubernetes提供應用部署、維護、 擴展機制等功能,利用Kubernetes能方便地管理跨機器運行容器化的應用,其主要功能如下:
數據卷:?Pod中容器之間共享數據,可以使用數據卷。
應用程序健康檢查:?容器內服務可能進程堵塞無法處理請求,可以設置監控檢查策略保證應用健壯性。
復制應用程序實例:?控制器維護著Pod副本數量,保證一個Pod或一組同類的Pod數量始終可用。
彈性伸縮:?根據設定的指標(CPU利用率)自動縮放Pod副本數。
服務發現:?使用環境變量或DNS服務插件保證容器中程序發現Pod入口訪問地址。
負載均衡:?一組Pod副本分配一個私有的集群IP地址,負載均衡轉發請求到后端容器。在集群內部其他Pod可通過這個ClusterIP訪問應用。
滾動更新:?更新服務不中斷,一次更新一個Pod,而不是同時刪除整個服務。
服務編排:?通過文件描述部署服務,使得應用程序部署變得更高效。
資源監控:?Node節點組件集成cAdvisor資源收集工具,可通過Heapster匯總整個集群節點資源數據,然后存儲到InfluxDB時序數據庫,再由Grafana展示。
提供認證和授權: 支持屬性訪問控制(ABAC)、角色訪問控制(RBAC)認證授權策略。
除此之外, Kubernetes主要功能還體現在:
-?使用Docker對應用程序包裝(package)、實例化(instantiate)、運行(run)。
-?將多臺Docker主機抽象為一個資源,以集群的方式運行、管理跨機器的容器,包括任務調度、資源管理、彈性伸縮、滾動升級等功能。
-?使用編排系統(YAML File)快速構建容器集群,提供負載均衡,解決容器直接關聯及通信問題-?解決Docker跨機器容器之間的通訊問題。
-?自動管理和修復容器,簡單說,比如創建一個集群,里面有十個容器,如果某個容器異常關閉,那么,會嘗試重啟或重新分配容器,始終保證會有十個容器在運行,反而殺死多余的。Kubernetes的自我修復機制使得容器集群總是運行在用戶期望的狀態. 當前Kubernetes支持GCE、vShpere、CoreOS、OpenShift。
kubernetes的集群至少有兩個主機組成:master + node ,即為master/node架構。master為集群的控制面板,master主機需要做冗余,一般建議為3臺;而node主機不需要做冗余,因為node的主要作用是運行pod,貢獻計算能力和存儲能力,而pod控制器會自動管控pod資源,如果資源少,pod控制器會自動創建pod,即pod控制器會嚴格按照用戶指定的副本來管理pod的數量。客戶端的請求下發給master,即把創建和啟動容器的請求發給master,master中的調度器分析各node現有的資源狀態,把請求調用到對應的node啟動容器。
可以理解為kubernetes把容器抽象為pod來管理1到多個彼此間有非常緊密聯系的容器,但是LAMP的容器主機A,M,P只是有關聯,不能說是非常緊密聯系,因此A,M,P都要運行在三個不同的pod上。在kubernetes中,要運行幾個pod,是需要定義一個配置文件,在這個配置文件里定義用哪個控制器啟動和控制幾個pod,在每個pod里要定義那幾臺容器,kubernetes通過這個配置文件,去創建一個控制器,由此控制器來管控這些pod,如果這些pod的某幾個down掉后,控制器會通過健康監控功能,隨時監控pod,發現pod異常后,根據定義的策略進行操作,即可以進行自愈。
kubernetes內部需要5套證書,手動創建或者自動生成,分別為:
1.?etcd內部通信需要一套ca和對應證書。
2.?etcd與外部通信也要有一套ca和對應證書。
3.?APIserver間通信需要一套證書。
4.?apiserver與node間通信需要一套證書。
5.?node和pod間通信需要一套ca證書。
目前來說還不能實現把所有的業務都遷到kubernetes上,如存儲,因為這個是有狀態應用,出現錯誤排查很麻煩,所以目前kubernetes主要是運行無狀態應用。
所以一般而言,負載均衡器運行在kubernetes之外,nginx或者tomcat這種無狀態的應用運行于kubernetes集群內部,而數據庫如mysql,zabbix,zoopkeeper等有狀態的,一般運行于kubernetes外部,通過網絡連接,實現kubernetes集群的pod調用這些外部的有狀態應用。
三、Kubernetes架構和組件
kubernetes主要由以下幾個核心組件組成:
etcd:?集群的主數據庫,保存了整個集群的狀態; etcd負責節點間的服務發現和配置共享。etcd分布式鍵值存儲系統, 用于保持集群狀態,比如Pod、Service等對象信息。
kube-apiserver:?提供了資源操作的唯一入口,并提供認證、授權、訪問控制、API注冊和發現等機制;這是kubernetes API,作為集群的統一入口,各組件協調者,以HTTPAPI提供接口服務,所有對象資源的增刪改查和監聽操作都交給APIServer處理后再提交給Etcd存儲。
kube-controller-manager: 負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等;它用來執行整個系統中的后臺任務,包括節點狀態狀況、Pod個數、Pods和Service的關聯等, 一個資源對應一個控制器,而ControllerManager就是負責管理這些控制器的。
kube-scheduler:?資源調度,按照預定的調度策略將Pod調度到相應的機器上;它負責節點資源管理,接受來自kube-apiserver創建Pods任務,并分配到某個節點。它會根據調度算法為新創建的Pod選擇一個Node節點。
kubectl:?客戶端命令行工具,將接受的命令格式化后發送給kube-apiserver,作為整個系統的操作入口。
kubelet:?負責維護容器的生命周期,負責管理pods和它們上面的容器,images鏡像、volumes、etc。同時也負責Volume(CVI)和網絡(CNI)的管理;kubelet運行在每個計算節點上,作為agent,接受分配該節點的Pods任務及管理容器,周期性獲取容器狀態,反饋給kube-apiserver; kubelet是Master在Node節點上的Agent,管理本機運行容器的生命周期,比如創建容器、Pod掛載數據卷、下載secret、獲取容器和節點狀態等工作。kubelet將每個Pod轉換成一組容器。
container runtime:?負責鏡像管理以及Pod和容器的真正運行(CRI);
kube-proxy: 負責為Service提供cluster內部的服務發現和負載均衡;它運行在每個計算節點上,負責Pod網絡代理。定時從etcd獲取到service信息來做相應的策略。它在Node節點上實現Pod網絡代理,維護網絡規則和四層負載均衡工作。
docker或rocket(rkt): 運行容器。
除了上面的幾個核心組件, 還有一些常用插件(Add-ons):kube-dns: 負責為整個集群提供DNS服務;Ingress Controller: 為服務提供外網入口;Heapster: 提供資源監控;Dashboard: 提供GUI;Federation: 提供跨可用區的集群;Fluentd-elasticsearch: 提供集群日志采集、存儲與查詢;
其中:
master組件包括:?kube-apiserver, kube-controller-manager, kube-scheduler;
Node組件包括:?kubelet, kube-proxy, docker或rocket(rkt);
第三方服務:etcd
因為篇幅有限,想要更多的內容可以直接私聊客服偶!
聲明:文章轉載于網絡,版權歸原作者所有!