一、K8S概述
1.什么是K8S
K8S全程為Kubernetes,由于K到S直接有8個字母簡稱為K8S。
版本:目前一般是1.18~1.2.0,后續(xù)可能會到1.24-1.26,1.24版本后丟棄了docker(如需要使用需要第三方插件配合),目前最新版本是1.27
官網(wǎng):https://kubernetes.io
GitHub:GitHub - kubernetes/kubernetes: Production-Grade Container
Scheduling and Management
2.為什么要用K8S
(1)試想下傳統(tǒng)的后端部署辦法:把程序包(包括可執(zhí)行二進制文件、配置文件等)放到服務(wù)器上,接著運行啟動腳本把程序跑起來,同時啟動守護腳本定期檢查程序運行狀態(tài)、必要的話重新拉起程序。
(2)設(shè)想一下,如果服務(wù)的請求量上來,已部署的服務(wù)響應(yīng)不過來怎么辦?傳統(tǒng)的做法往往是,如果請求量、內(nèi)存、CPu超過閾值做了告警,運維人員馬上再加幾臺服務(wù)器,部署好服務(wù)之后,接入負載均衡來分擔(dān)已有服務(wù)的壓力。
(3)這樣問題就出現(xiàn)了:從監(jiān)控告警到部署服務(wù),中間需要人力介入!那么,有沒有辦法自動完成服務(wù)的部署、更新、卸載和擴容、縮容呢,而這就是K8S要做的事情:自動化運維管理容器化(Docker) 程序。
(4)解決了docker的以下個問題:
- 單機使用,無法有效集群
- 隨著容器數(shù)量的上升,管理成本攀升
- 沒有有效的容災(zāi)、自愈機制
- 沒有預(yù)設(shè)編排模板,無法實現(xiàn)快速、大規(guī)模容器調(diào)度
- 沒有統(tǒng)一的配置管理中心工具
- 沒有容器生命周期的管理工具
- 沒有圖形化運維管理工具
3.作用及功能
(1)作用:用于自動部署、擴展、管理編排容器化應(yīng)用程序。
(2)功能:容器編排、資源調(diào)度、彈性伸縮、部署管理、服務(wù)發(fā)現(xiàn)等。
二、K8S的特性
1.彈性伸縮
使用命令、UI或者基于CPU使用情況自動快速擴容和縮容應(yīng)用程序?qū)嵗?,保證應(yīng)用高并發(fā)時的高可用和業(yè)務(wù)低峰時回收資源,以最小成本運行服務(wù)。
2.自我修復(fù)
在節(jié)點故障時重新啟動失敗的容器、替換和重新部署,保證預(yù)期的副本數(shù)量,殺死健康檢查失敗的容器,并在未準備好之前不會處理客戶端請求,確保線上服務(wù)不中斷。
3.服務(wù)發(fā)現(xiàn)和負載均衡
為多容器提供同一的訪問入口(內(nèi)部ip地址和一個dns名稱),并且負載均衡關(guān)聯(lián)所有容器,用戶無需考慮容器ip問題
4.自動發(fā)布和回滾
默認是滾動發(fā)布模式(其他二種發(fā)布模式,藍綠發(fā)布、灰度發(fā)布)。采用滾動更新策略更新應(yīng)用,一次更新一個Pod而不是同時刪除所有Pod如果更新過程中有問題可以回滾更改確保業(yè)務(wù)升級不受影響
5.集中化配置管理和秘鑰管理
管理機密數(shù)據(jù)和應(yīng)用程序配置,而不是把敏感數(shù)據(jù)暴露在鏡像中,提高敏感數(shù)據(jù)安全性、可以將一些常用的配置存儲在k8s中,方便應(yīng)用程序使用
6.存儲編排
支持外掛存儲并對外掛存儲進行編排,掛載外部存儲系統(tǒng),無論是來自本地存儲,公有云還是網(wǎng)絡(luò)存儲(NFS、ceph、GlusterFS)都作為集群資源的一部分使用,極大提高存儲使用靈活性
7.任務(wù)批量處理運行
提供一次性任務(wù),定時任務(wù);滿足批量數(shù)據(jù)處理和分析的場景
三、K8S的集群架構(gòu)
1.架構(gòu)
K8S是屬于主從設(shè)備模型(master-slave架構(gòu)),master負責(zé)集群的調(diào)度管理和運維,slave節(jié)點是集群中運算工作負載節(jié)點,企業(yè)中一般最少2臺master,多數(shù)為3臺作為負載。
2.模式
主節(jié)點成為master節(jié)點,從節(jié)點成為worker node節(jié)點。每個node都會被master分配任務(wù)
3.工作
master可以在任何集群中的計算機上運行,建議給master一臺獨立的服務(wù)器防止master出問題所有控制命令都將實現(xiàn),worker node節(jié)點宕機該機器上的任務(wù)會被自動轉(zhuǎn)移其他節(jié)點繼續(xù)運行
4.流程圖
四、K8S的核心組件
1.Master組件
(1)Kube-apiserver
統(tǒng)一請求入口服務(wù)組件,所有資源請求或者調(diào)用都通過Kube-apiserver入口提供的接口進行,以Http Restful API 提供接口服務(wù),所有對資源的增刪改查和監(jiān)聽都交給APIserver處理,然后再交給ETCD存儲(鍵值對存儲方式,相當(dāng)于分布式數(shù)據(jù)庫)。APIserver負責(zé)接受所有請求(uI和CLI),然后根據(jù)用戶具體請求通知其他組件干活,APIserver相當(dāng)于K8S的大腦
(2)Kube-controller-manager
運行管理控制器由各種控制器組成,處理常規(guī)任務(wù)的后臺線程,所有資源對象的自動化控制中心。在K8S中一個資源對應(yīng)一個控制器,controller-manager負責(zé)管理這些控制器,通過API server監(jiān)控整個集群的狀態(tài),確保集群處于預(yù)期的工作狀態(tài),當(dāng)某個node意外宕機,controlle-manager會及時發(fā)現(xiàn)并自動化修復(fù),確保集群處于預(yù)期的工作狀態(tài)。
控制器 | 控制名稱 | 控制器作用 |
---|---|---|
Node Controller | 節(jié)點控制器 | 負責(zé)在節(jié)點出現(xiàn)故障時發(fā)送和響應(yīng) |
Replication Controller | 副本控制器 | 負責(zé)保證集群中一個RC即資源對象所關(guān)聯(lián)的Pod副本數(shù)據(jù)始終保持預(yù)期值 |
Endpoints Controller | 端點控制器 | 填充端點對象(service和Pods),負責(zé)監(jiān)聽service和對應(yīng)的Pod副本的變化,服務(wù)暴露出來的訪問點,如果需要訪問一個服務(wù)必須知道他都Endpoints |
Service Account & Tocken Controller | 服務(wù)賬戶和令牌控制器 | 為新的命名空間創(chuàng)建默認賬戶和API訪問令牌 |
ResourceQuota Controller | 資源配額控制器 | 確保指定的資源對象在任何時候都不會超量占用系統(tǒng)物理資源 |
Namespace Controller | 命名空間控制器 | 管理namespace的生命周期 |
Service Controller | 服務(wù)器控制器 | 屬于K8S集群與外部云平臺之間的一個接口控制器 |
(3)Kube-scheduler
負責(zé)資源調(diào)度的進程,根據(jù)調(diào)度算法(62種算法)為新創(chuàng)建的Pod選擇一個合適的Node節(jié)點
可以理解成K8s所有Node節(jié)點的調(diào)度器,當(dāng)用戶要部署服務(wù)時,Scheduler會根據(jù)調(diào)度算法選擇最合適的Node節(jié)點來部署Pod。
預(yù)選策略(predicate):首選過濾掉資源不滿足的node
優(yōu)選策略(priorities):預(yù)選后的滿足的節(jié)點進行打分排名選擇最優(yōu)的node
2.配置存儲中心etcd
etcd:K8s的存儲服務(wù),是分布式鍵值存儲系統(tǒng),最少三臺最優(yōu)為8G內(nèi)存。存儲了K8S的關(guān)鍵配置和用戶配置并且持久化保存,K8s中僅有API server才具有讀寫權(quán)限,其他組件必須通過API server的接口才能讀寫數(shù)據(jù)。端口為2379和2380,2379用于對外客戶的提供通信,2380用于對集群服務(wù)器間內(nèi)部的通信
3.Node組件
(1)Kubelet
Node節(jié)點的監(jiān)視器,以及與Master節(jié)點的通訊器。Kubelet是Master節(jié)點安插在Node節(jié)點的眼線,會定時向API server匯報自己Node節(jié)點上運行服務(wù)的狀態(tài),并接受來自Master節(jié)點的指示采取調(diào)整措施(例如創(chuàng)建Pod)。
從Master節(jié)點獲取自己節(jié)點上Pod的期望狀態(tài)(例如運行什么容器、運行的副本數(shù)量、網(wǎng)絡(luò)等),直接與容器引擎交互實現(xiàn)容器的聲明周期管理,如果自己節(jié)點上的Pod狀態(tài)與期望狀態(tài)不一致調(diào)用對應(yīng)容器的接口達到預(yù)期狀態(tài)
管理鏡像和容器的清理工作,保證節(jié)點上鏡像不會占滿磁盤,退出的容器不會占用太多的資源
(2)Kube-Proxy
每個節(jié)點上實現(xiàn)Pod網(wǎng)絡(luò)代理,是K8S Service 資源的載體,負責(zé)維護網(wǎng)絡(luò)規(guī)則和四層負載均衡工作,負責(zé)寫入規(guī)則至iptables、ipvs等實現(xiàn)服務(wù)映射訪問的。
本身不是直接給Pod提供網(wǎng)絡(luò),Pod的網(wǎng)絡(luò)是由Kubelet提供的,實際上維護的是虛擬的Pod集群網(wǎng)絡(luò)
Kube-apiserver通過監(jiān)控Kube-Proxy 進行對Kubernetes Service的更新和端點的維護。
在K8S集群中微服務(wù)的負載均衡是由Kube-proxy實現(xiàn)的。Kube-proxy是K8S集群內(nèi)部的負載均衡器。它是一個分布式代理服務(wù)器,在K8S的每個節(jié)點上都會運行一個Kube-proxy 組件。
(3)docker或rocker
容器引擎,運行容器,負責(zé)本機的容器創(chuàng)建和管理工作
4.K8S三種負載均衡模式
(1)namespace
(2)iptables(默認使用 )
(3)ipvs(此模式更快,所有安裝是需要更改為此模式。內(nèi)核運行更快,性能更好。 )
5.K8S架構(gòu)工作流程
(1)運維人員操作Kubectl命令向API server發(fā)送任務(wù)請求,先到Auth進行鑒權(quán)認證,然后進到API Server中,API Server存儲操作到Etcd
(2)然后API Server根據(jù)Etcd中用戶執(zhí)行的操作調(diào)用 controller manager對應(yīng)的控制器進行操作,例如創(chuàng)建
(3)controller manager通過調(diào)用創(chuàng)建控制器到API Server創(chuàng)建replication副本,APIserver將操作存到Etcd中,API Server再調(diào)用Scheduler進行算法選擇為Pod選擇最合適的節(jié)點創(chuàng)建,Scheduler需要通過API Server在node節(jié)點上的Kubelet進行預(yù)選策略和優(yōu)選策略選擇最優(yōu)的node節(jié)點APIserver將動作保存到Etcd中
(4)Scheduler選擇完節(jié)點后通過APIserver的Kubelet在對應(yīng)的node節(jié)點上創(chuàng)建Pod,并通知對應(yīng)node節(jié)點的doker在Pod中創(chuàng)建容器
(5)容器需要對外提供服務(wù)時,通過node節(jié)點的Kube-Proxy代理對外映射端口信息,Kube-proxy進來后通過service負載均衡器分發(fā)到容器上,訪問容器是根據(jù)Label標簽訪問的。
五、K8S的核心概念
包含:Pod、Label、Service、Replication、Controller。等
1.Pod
(1)是K8s創(chuàng)建或者部署的最小/最簡單的基本單位,一個Pod代表集群上正在運行的一個進程,Pod里面可以放很多容器。一個Pod由一個或多個容器組成,Pod中的容器共享網(wǎng)絡(luò)、存儲和計算資源在同一臺Docker主機上運行,一個Pod可以運行多個容器,又稱為邊車模式(sidecar)。生產(chǎn)中一般一個Pod就一個容器或者是有多個強關(guān)聯(lián)性互補的容器
(2)同一個Pod直接的容器可以通過localhost互相訪問,并且可以掛載Pod內(nèi)所有數(shù)據(jù)卷。不同Pod之間的容器不能用localhost訪問,也不能掛載Pod內(nèi)所有數(shù)據(jù)卷。
(3)Pod控制器
Pod控制器是啟動Pod的一種模板,用來保證在K8S里啟動Pod應(yīng)始終按照用戶的預(yù)期運行
① Deployment:無狀態(tài)應(yīng)用部署即無論誰來訪問都是一樣的例如http網(wǎng)頁
② 有狀態(tài)協(xié)議:需要持久化
③ 無狀態(tài)協(xié)議:一次性的不需要持久化,每一次請求都是一條新的數(shù)據(jù)
④ Replicaset:受控于Deployment,確保預(yù)期的Pod副本數(shù)量,Replicaset的通就是管理和控制Pod管理他們好好工作,若發(fā)現(xiàn)某個Pod不行了就找個新的Pod來做替換。
⑤ Daemonset:確保所有節(jié)點運行同一類Pod,保證每個節(jié)點上都有一一個此類Pod運行,通常用于實現(xiàn)系統(tǒng)級后臺任務(wù)。
⑥ Statefulset:有狀態(tài)應(yīng)用部署
⑦ Job:一次性任務(wù)。根據(jù)用戶的設(shè)置,Job 管理的Pod把任務(wù)成功完成就自動退出了。
⑧ Cronjob:周期性計劃性任務(wù)
2.Label標簽
(1)標簽是K8s特色的管理方式便于分類管理資源對象
(2)label可以附加到各種資源對象上,例如:node、Pod、service、Rc等,用于關(guān)聯(lián)對象、查詢和篩選
(3)一個label是一個key-value的鍵值對,key-value都由用戶自定義
(4)一個資源對象可以定義任意數(shù)量的label,同一個label也可以被添加到任意數(shù)量的資源對象中,也可以在對象創(chuàng)建后動態(tài)添加或者刪除
(5)可以通過給指定的資源對象捆綁一個或多個不通的label,實現(xiàn)多維度的資源分組管理功能
3.Label選擇器(Label selector)
(1)給某個資源對象定義一個Label,就相當(dāng)于給他打開了一個標簽,隨后可以通過標簽選擇器(Labelselector)查詢和篩選擁有某些Label的資源對象。
(2)標簽選擇器目前有兩種:基于等值關(guān)系(等于、不等于)和基于集合關(guān)系(屬于、不屬于、存在。
4.Service
(1)K8S集群中每個Pod會被分配一個單獨的ip地址,但是由于Pod是有生命周期的(可以被創(chuàng)建而且銷毀后不會再重啟),隨時可能會因為業(yè)務(wù)ip的變更,導(dǎo)致這個ip地址會隨著Pod的銷毀而消失
(2)Service就是用來解決這個問題的核心概念:
(3)Service:通過標簽選擇器關(guān)聯(lián)具有對應(yīng)Lable的Pod,再把相關(guān)的Pod IP加入自己的Endpoints當(dāng)中,service根據(jù)Endpoints里的Ip進行轉(zhuǎn)發(fā),不是服務(wù)的含義,更像是一個網(wǎng)關(guān)層、流量均衡器、Service作用于那些Pod由標簽選擇器來定義。service可以看作一組提供相同服務(wù)的Pod的對外訪問接口,客戶端需要訪問的服務(wù)就是Service的對象,每個Service都有一個虛擬的ip,會自動向后端做轉(zhuǎn)發(fā)。
(4)負載均衡功能:自動把請求流量分配到后端所有的服務(wù)上,可以對客戶端透明的做水平擴展,實現(xiàn)此功能的關(guān)鍵是Kube-proxy,Kubeproxy運行在每個節(jié)點上監(jiān)聽APIserver中服務(wù)對象的變化,三種流量調(diào)度模式:userspace、iptables(利用的nat默認但不常用)、ipvs(推薦,性能最好),實現(xiàn)網(wǎng)絡(luò)的轉(zhuǎn)發(fā)
(5)Service是K8s服務(wù)的核心,屏蔽了服務(wù)細節(jié),統(tǒng)一了對外暴露服務(wù)接口,真正做到了微服務(wù)。用戶只需要關(guān)注一個Service入口即可,不需要關(guān)注具體請求那個Pod。用戶不會感知因為Pod上服務(wù)的意外崩潰K8S重新拉起Pod而導(dǎo)致的ip變更,也不會感知到因服務(wù)升級、服務(wù)變更等帶來的Pod替換而導(dǎo)致的IP變化。
5.Ingress
service負責(zé)K8s集群內(nèi)部的網(wǎng)絡(luò)拓撲(四層)、Ingress負責(zé)集群外部的網(wǎng)絡(luò)(七層),將客戶的請求轉(zhuǎn)發(fā)給對應(yīng)的service處理,然后service根據(jù)label負載均衡給Pod。
(1)Ingress的k8s集群中工作在OSI第七層的應(yīng)用,對外暴露的接口,典型的訪問方式是http/https。service只能進行四層的流量調(diào)度,表現(xiàn)形式是IP+port。Ingress則可調(diào)度不同業(yè)務(wù)域,不同URL訪問路徑的業(yè)務(wù)流量。
(2)name:出于 K8S 內(nèi)部,使用“資源”來定義每一種邏概念(功能),所以每種“資源”,都應(yīng)該有自己的“名稱”。"資源”有 api 版本 (apiversion)、類別 (kind) 、元數(shù)據(jù) (metadata) 、定義清單 (spec)狀態(tài) (status) 等配置信息"名稱”通常定義在“資源”的“元數(shù)據(jù)”信息里。在同一個 namespace 空間中必須是唯一的。文章來源:http://www.zghlxwxcb.cn/news/detail-686031.html
(3)Namespace:隨著項目增多、人員增加、集群規(guī)模的擴大,需要一種能夠邏輯上隔離 K8S 內(nèi)各種"資源”的方法,這就是 amespace。Namespace 是為了把一個 K8S 集群劃分為若干個資源不可共享的虛擬集群組而誕生的。不同 Namespace 內(nèi)的“資源”名稱可以相同,相同 Namespace 內(nèi)的同種"資源”,"名稱”不能相同。合理的使用 K8S 的 Namespace,可以使得集群管理員能夠更好的對交付到 K8S 里的服務(wù)進行分類管理和瀏覽。K8S 里默認存在的 Namespace 有: default、kube-system、kube-public 等。否詢 K8S 里特定“資源” 要帶上相應(yīng)的 Namespace。文章來源地址http://www.zghlxwxcb.cn/news/detail-686031.html
到了這里,關(guān)于K8S自動化運維容器化(Docker)集群程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!