中國建設(shè)銀行手機(jī)銀行網(wǎng)站ui設(shè)計
K8s 的全稱為Kubernetes,是一種開源的容器編排平臺,用于自動化部署以及擴(kuò)展和管理容器化的應(yīng)用程序,它提供了一種容器編排和管理的方式,可以幫助開發(fā)人員更輕松的管理容器化的應(yīng)用程序,并且提供了一種跨多個主機(jī)的自動化部署和管理機(jī)制
作用:
? ? ? ? 用于自動部署、擴(kuò)展和管理“容器化(containerized)應(yīng)用程序”的開源系統(tǒng)。
可以理解成 K8S 是負(fù)責(zé)自動化運(yùn)維管理多個容器化程序(比如 Docker)的集群,是一個生態(tài)極其豐富的容器編排框架工具。
?官網(wǎng):https://kubernetes.iogithub:https://github.com/kubernetes/kubernets?
為什么要用K8s
? ? ? ? 傳統(tǒng)的后端部署辦法:把程序包(包括可執(zhí)行二進(jìn)制文件、配置文件等)放到服務(wù)器上,接著運(yùn)行啟動腳本把程序跑起來,同時啟動守護(hù)腳本定期檢查程序運(yùn)行狀態(tài)、必要的話重新拉起程序。
? ? ? ? 如果服務(wù)的請求量上來,已部署的服務(wù)響應(yīng)不過來怎么辦?傳統(tǒng)的做法往往是,如果請求量、內(nèi)存、CPU超過閾值做了告警,運(yùn)維人員馬上再加幾臺服務(wù)器,部署好服務(wù)之后,接入負(fù)載均衡來分擔(dān)已有服務(wù)的壓力
? ? ? ? 這樣問題就出現(xiàn)了:從監(jiān)控告警到部署服務(wù),中間需要人力介入!那么,有沒有辦法自動完成服務(wù)的部署、更新、卸載和擴(kuò)容、縮容呢?
? ? ? ? 而這就是 K8S 要做的事情:自動化運(yùn)維管理容器化(Docker)程序。
K8s 的目標(biāo)是讓部署容器化應(yīng)用簡單高效。
K8s 解決了裸跑Docker 的若干痛點(diǎn):
-
單機(jī)使用,無法有效集群
-
隨著容器數(shù)量的上升,管理成本夢升
-
沒有有效的容災(zāi)、白愈機(jī)制
-
沒有預(yù)設(shè)編排模板,無法實(shí)現(xiàn)快速、大規(guī)模容器調(diào)度
-
沒有統(tǒng)一的配置管理中心工具
-
沒有容器生命周期的管理工具
-
沒有圖形化運(yùn)維管理工具
?
K8s特性
-
彈性伸縮
保證應(yīng)用業(yè)務(wù)高峰并發(fā)時的高可用性,業(yè)務(wù)低峰時回收資源,最小成本運(yùn)行服務(wù)
-
自我修復(fù)
節(jié)點(diǎn)故障時重新啟動失敗的容器,替換和重新部署,殺死健康檢查失敗的容器,未準(zhǔn)備好之前不會處理客戶端請求,保證線上服務(wù)不中斷
-
服務(wù)發(fā)現(xiàn)和負(fù)載均衡
k8s為多個容器提供一個統(tǒng)一訪問入口【內(nèi)部IP地址和一個DNS名稱】,負(fù)載均衡關(guān)聯(lián)所有的容器,使得用戶無需考慮容器ip問題
-
自動發(fā)布(默認(rèn)滾動發(fā)布模式)和回滾
一次更新一個或部分 pod ,如果更新過程中出現(xiàn)問題,將回滾更改,確保升級不影響業(yè)務(wù)
-
集中化配置管理和密鑰管理
管理機(jī)密數(shù)據(jù)和應(yīng)用程序配置,而不需要把敏感數(shù)據(jù)暴露在鏡像里,包括用戶密碼、私鑰、公鑰
-
存儲編排,支持外掛存儲并對外掛存儲資源進(jìn)行編排
掛載外部存儲系統(tǒng),無論是來自本地存儲,公有云(如AWS),還是網(wǎng)絡(luò)存儲(如 NFS、Glusterfs、Ceph)都作為集群資源的一部分使用,極大提高存儲使用靈活性
-
任務(wù)批量處理運(yùn)行
提供一次性任務(wù),定時任務(wù),滿足批量數(shù)據(jù)處理和分析的場景
?
K8s集群架構(gòu)和組件
K8s是屬于主從設(shè)備模型【Master 和 Slave 架構(gòu)】
-
Master節(jié)點(diǎn)負(fù)責(zé)集群的調(diào)度、管理和運(yùn)維,
-
slave節(jié)點(diǎn)是集群中的運(yùn)算工作負(fù)載節(jié)點(diǎn)。在K8s 中,主節(jié)點(diǎn)一般被稱為Master節(jié)點(diǎn),而從節(jié)點(diǎn)則被稱為worker Node節(jié)點(diǎn),每個Node 都會被Master分配一些工作負(fù)載
Master 組件
- kube-apiserver??
所有訪問的統(tǒng)一入口,資源請求或調(diào)用操作都是通過kube-apiserver提供的接口進(jìn)行,所有對象資源的增刪改查和監(jiān)聽操作都交給API Server處理后再提交給Etcd 存儲。
- kube-controller-manager(控制器)
? 負(fù)責(zé)根據(jù)預(yù)設(shè)模板創(chuàng)建pod,維持pod等資源副本期望數(shù)目【創(chuàng)建刪除維護(hù)pod】
- kube-scheduler(調(diào)度器)
? ?負(fù)責(zé)調(diào)度 pod 通過預(yù)選、優(yōu)選策略,選擇合適的 node節(jié)點(diǎn)分配 pod? ??【調(diào)度算法:62種】
- etcd:配置存儲中心
? ? ?分布式鍵值對數(shù)據(jù)庫,負(fù)責(zé)存儲 k8s 集群的重要信息(持久化)
? ? ?go語言開發(fā)的 使用raft 一致性的算法 ?集群需要三臺或以上奇數(shù)臺組成
? ? ?【端口】
? ? ?2379:對外為客戶端提供通訊
? ? ?2380:服務(wù)器之間內(nèi)部通訊
Node組件
- kubelet:
? 在K8s集群中,在每個Node (又稱 Worker Node)上都會啟動一個kubelet 服務(wù)進(jìn)程。每個kubelet進(jìn)程都會在 API server 中注冊信息,定期向 master 匯報節(jié)點(diǎn)資源的使用情況
- kube-proxy:?
? 在node 節(jié)點(diǎn)上實(shí)現(xiàn) pod 的網(wǎng)絡(luò)代理,維護(hù)網(wǎng)絡(luò)規(guī)則和四層負(fù)載均衡器工作,負(fù)責(zé)寫入規(guī)則到 iptables 或 ipvs 實(shí)現(xiàn)服務(wù)映射訪問
- docker 或 rocket:
? 容器引擎,運(yùn)行容器,負(fù)責(zé)本機(jī)的容器創(chuàng)建和管理工作
?
Pod
Pod是 Kubernetes 創(chuàng)建或部署的最小/最簡單的基本單位,一個 Pod 代表集群上正在運(yùn)行的一個進(jìn)程。
可以把 Pod 理解成豌豆莢,而同一 Pod 內(nèi)的每個容器是一顆顆豌豆。
一個 Pod 由一個或多個容器組成,Pod 中容器共享網(wǎng)絡(luò)、存儲和計算資源,在同一臺 Docker 主機(jī)上運(yùn)行。
一個 Pod 里可以運(yùn)行多個容器,又叫邊車模式(SideCar)。而在生產(chǎn)環(huán)境中一般都是單個容器或者具有強(qiáng)關(guān)聯(lián)互補(bǔ)的多個容器組成一個 Pod。
同一個 Pod 之間的容器可以通過 localhost 互相訪問,并且可以掛載 Pod 內(nèi)所有的數(shù)據(jù)卷;但是不同的 Pod 之間的容器不能用 localhost 訪問,也不能掛載其他 Pod 的數(shù)據(jù)卷。
Pod 控制器
Pod 啟動的一種模版,用來保證在K8S里啟動的 Pod 應(yīng)始終按照用戶的預(yù)期運(yùn)行(副本數(shù)、生命周期、健康狀態(tài)檢查等)。
K8S 內(nèi)提供了眾多的 Pod 控制器,常用的有以下幾種:
- Deployment:無狀態(tài)應(yīng)用部署
- Statefulset:有狀態(tài)應(yīng)用部署
- ReplicaSet:確保預(yù)期的 Pod 副本數(shù)量,用于管理和控制Pod,受控于 Deployment
- DaemonSet:確保所有節(jié)點(diǎn)運(yùn)行同一類 Pod,保證每個節(jié)點(diǎn)上都有一個此類 pod 運(yùn)行?
- Job:一次性任務(wù)
- Cronjob:周期性計劃性任務(wù)
控制器有五大類:
標(biāo)簽選擇器:
-
標(biāo)簽選擇器可以用來選擇一組具有相同的標(biāo)簽的 Pod,service,RC,deployment 和 RS,使用標(biāo)簽選擇器可以輕松的管理部署應(yīng)用程序和其他資源
service:
-
service 是通過標(biāo)簽選擇器關(guān)聯(lián)具有對應(yīng) Label(標(biāo)簽)的Pod,再把相關(guān) Pod的 IP 加入到自己的 endpoints 當(dāng)中,service再根據(jù) endpoints 里的IP 進(jìn)行轉(zhuǎn)發(fā)
ingress:
-
ingress是一種 API對象,用于管理 K8s集群中入口流量,它為我們提供了一種統(tǒng)一的方式來管理不同服務(wù)方式的路由規(guī)則和負(fù)載均衡
name:
-
通常是指資源對象的名稱
namespace:
-
K8s中的 namespace 是一種虛擬化的技術(shù),它將一個物理的 K8s 集群劃分成多個虛擬集群,每個虛擬機(jī)群都有自己的資源和對象,不同的虛擬機(jī)群之間相互隔離
CFSSL用來為etcd提供TLS 證書,它支持簽三種類型的證書:
-
client.證書,服務(wù)端連接客戶端時攜帶的證書,用于客戶端驗(yàn)證服務(wù)端身份,如l kube-apiserver訪問 etcd;?
-
server 證書,客戶端連接服務(wù)端時攜帶的證書,用于服務(wù)端驗(yàn)證客戶端身份,如 etcd對外提供服務(wù);
-
peer 證書,相互之間連接時使用的證書,如 etcd節(jié)點(diǎn)之間進(jìn)行驗(yàn)證和通信。
? ? ? ? ? 這里全部都使用同一套證書認(rèn)證。
cfssl:證書簽發(fā)的工具命令
cfssljson:將cfssl生成的證書(json格式)變?yōu)槲募休d式證書
cfssl-certinfo:驗(yàn)證證書的信息
cfssl-certinfo -cert <證書名稱> #查看證書的信息