Kubernetes 支持多個(gè)容器運(yùn)行環(huán)境:Docker障般、 containerd、CRI-O 以及任何實(shí)現(xiàn) Kubernetes CRI (容器運(yùn)行環(huán)境接口)
Kubernetes 官方發(fā)布公告盛杰,宣布自 v1.20 起放棄對(duì) Docker的支持挽荡。目前,Kubelet 中的 Docker支持功能現(xiàn)已棄用即供,并將在之后的版本中被刪除定拟。逐漸轉(zhuǎn)移到containerd。不過本文仍以docker為基礎(chǔ)到kubernetes的進(jìn)階~
一募狂、Docker
Docker Engine
Docker Engine 是一種開源容器化技術(shù)办素,用于構(gòu)建和容器化您的應(yīng)用程序。是一個(gè)C/S架構(gòu)的應(yīng)用程序祸穷,主要包含以下幾個(gè)組件:
①常駐后臺(tái)進(jìn)程dockerd
②一個(gè)用來和守護(hù)進(jìn)程dockerd交互的REST API Server
③命令行界面 (CLI) 客戶端(我們常使用的docker命令)
Docker架構(gòu)
Docker 使用客戶端-服務(wù)器架構(gòu)性穿。Docker客戶端與 Docker守護(hù)進(jìn)程對(duì)話,后者負(fù)責(zé)構(gòu)建雷滚、運(yùn)行和分發(fā) Docker 容器的繁重工作需曾。Docker 客戶端和守護(hù)程序可以 運(yùn)行在同一系統(tǒng)上,或者您可以將 Docker 客戶端連接到遠(yuǎn)程 Docker 守護(hù)程序祈远。Docker 客戶端和守護(hù)進(jìn)程使用 REST API呆万、UNIX 套接字或網(wǎng)絡(luò)接口進(jìn)行通信。另一個(gè) Docker 客戶端是 Docker Compose车份,它允許您使用由一組容器組成的應(yīng)用程序谋减。
安裝
Install Docker Engine on Ubuntu
二、Kubernetes
簡(jiǎn)介
kubernetes是Google基于borg開源的容器編排系統(tǒng)扫沼,它的目標(biāo)是管理跨多個(gè)主機(jī)的容器出爹,用于自動(dòng)部署、擴(kuò)展和管理容器化的應(yīng)用程序缎除,主要實(shí)現(xiàn)語言為go語言严就。
集群
當(dāng)你部署完Kubernetes,即擁有了一個(gè)完整的集群器罐。一個(gè)Kubernetes集群由一組被稱作為節(jié)點(diǎn)的機(jī)器組成:
- master負(fù)責(zé)管理集群梢为,協(xié)調(diào)集群中的所有活動(dòng),例如調(diào)度應(yīng)用程序、維護(hù)應(yīng)用程序所需的狀態(tài)铸董、擴(kuò)展應(yīng)用程序和滾動(dòng)更新
- 節(jié)點(diǎn)是Kubernetes集群中的工作機(jī)器祟印,可以是物理機(jī)或虛擬機(jī)。每個(gè)工作節(jié)點(diǎn)都有一個(gè)kubelet袒炉,它是管理節(jié)點(diǎn)并與k8s master節(jié)點(diǎn)進(jìn)行通信的代理旁理。在這些節(jié)點(diǎn)上運(yùn)行Kubernetes所管理的容器化應(yīng)用程序。
-
集群至少擁有一個(gè)工作節(jié)點(diǎn)我磁。
k8s cluster.png
Pod
Pod是可以在kubernetes中創(chuàng)建和管理的孽文、最小的可部署的計(jì)算單元。
Pod是一組緊密關(guān)聯(lián)的容器集合夺艰,它們共享存儲(chǔ)芋哭、網(wǎng)絡(luò)、以及怎樣運(yùn)行這些容器的聲明郁副。通常你不需要直接創(chuàng)建Pod减牺,甚至單實(shí)例Pod。相反存谎,你會(huì)使用Deployment 或Job這類工作負(fù)載資源來創(chuàng)建Pod拔疚。如果Pod需要跟蹤狀態(tài),可以考慮statefulSet資源既荚。
Label
Label 是識(shí)別 Kubernetes 對(duì)象的標(biāo)簽稚失,以 key/value 的方式附加到對(duì)象上。Label 不提供唯一性恰聘,并且實(shí)際上經(jīng)常是很多對(duì)象(如Pods)都使用相同的 label 來標(biāo)志具體的應(yīng)用句各。 Label 定義好后其他對(duì)象可以使用 Label Selector 來選擇一組相同 label 的對(duì)象(比如Service 用 label 來選擇一組 Pod)。Label Selector支持以下幾種方式:
- 等式晴叨,如app=nginx和env!=production
- 集合凿宾,如env in (production, qa)
- 多個(gè)label(它們之間是AND關(guān)系),如app=nginx,env=test
Namespace
Kubernetes 支持多個(gè)虛擬集群兼蕊,它們底層依賴于同一個(gè)物理集群初厚。 這些虛擬集群被稱為名字空間。Namespace 是對(duì)一組資源和對(duì)象的抽象集合孙技。
名字空間資源本身产禾、底層資源(節(jié)點(diǎn)Node和持久化卷PV)不屬于任何名字空間。
Deployment
一個(gè)Deployment為Pods和ReplicatSets提供聲明式的更新能力绪杏。Deployment 確保任意時(shí)間都有指定數(shù)量的 Pod“副本”在運(yùn)行。Deployment 還支持回滾和滾動(dòng)升級(jí)纽绍。
當(dāng)創(chuàng)建 Deployment 時(shí)蕾久,需要指定兩個(gè)東西:
- Pod模板:用來創(chuàng)建 Pod 副本的模板
- Label標(biāo)簽:Deployment 需要監(jiān)控的 Pod 的標(biāo)簽。
現(xiàn)在已經(jīng)創(chuàng)建了 Pod 的一些副本拌夏,那么在這些副本上如何均衡負(fù)載呢僧著?我們需要的是 Service履因。
Service
Service 是應(yīng)用服務(wù)的抽象,通過 labels 為應(yīng)用提供負(fù)載均衡和服務(wù)發(fā)現(xiàn)盹愚。匹配 labels 的Pod IP 和端口列表組成 endpoints栅迄,由 kube-proxy 負(fù)責(zé)將服務(wù) IP 負(fù)載均衡到這些endpoints 上。
每個(gè) Service 都會(huì)自動(dòng)分配一個(gè) cluster IP(僅在集群內(nèi)部可訪問的虛擬地址)和 DNS 名皆怕,其他容器可以通過該地址或 DNS 來訪問服務(wù)毅舆,而不需要了解后端容器的運(yùn)行。
安裝kubernetes
可參考K8S安裝部署
三愈腾、Harbor
簡(jiǎn)介
Harbor 是一個(gè)CNCF基金會(huì)托管的開源的可信的云原生docker registry項(xiàng)目憋活,可以用于存儲(chǔ)、簽名虱黄、掃描鏡像內(nèi)容悦即,Harbor 通過添加一些常用的功能如安全性、身份權(quán)限管理等來擴(kuò)展 docker registry 項(xiàng)目橱乱,此外還支持在 registry 之間復(fù)制鏡像辜梳,還提供更加高級(jí)的安全功能,如用戶管理泳叠、訪問控制和活動(dòng)審計(jì)等作瞄,在新版本中還添加了Helm倉(cāng)庫(kù)托管的支持。
Harbor最核心的功能就是給 docker registry 添加上一層權(quán)限保護(hù)的功能析二,docker registry v2 就已經(jīng)為我們提供了支持粉洼,v2 集成了一個(gè)安全認(rèn)證的功能,將安全認(rèn)證暴露給外部服務(wù)叶摄,讓外部服務(wù)去實(shí)現(xiàn)属韧。
安裝Harbor
四、Jenkins
簡(jiǎn)介
Jenkins是一款開源 CI&CD 軟件蛤吓,用于自動(dòng)化各種任務(wù)宵喂,包括構(gòu)建、測(cè)試和部署軟件会傲。
Pipeline
Jenkins 流水線是一套插件锅棕,它支持實(shí)現(xiàn)和集成 continuous delivery pipelines 到Jenkins。對(duì)Jenkins 流水線的定義被寫在一個(gè)文本文件中 (成為 Jenkinsfile)淌山,該文件可以被提交到項(xiàng)目的源代碼的控制倉(cāng)庫(kù)裸燎。 這是"流水線即代碼"的基礎(chǔ); 將CD 流水線作為應(yīng)用程序的一部分,像其他代碼一樣進(jìn)行版本化和審查泼疑。
流水線是用戶定義的一個(gè)CD流水線模型 德绿。流水線的代碼定義了整個(gè)的構(gòu)建過程, 他通常包括構(gòu)建, 測(cè)試和交付應(yīng)用程序的階段 。
安裝Jenkins
五、CI/CD
以下列實(shí)踐過的流程來講述整個(gè)CI/CD 過程
- 開發(fā)人員提交代碼到 Gitlab 代碼倉(cāng)庫(kù)
- 通過 Jenkins 的輪詢SCM觸發(fā) Pipeline 自動(dòng)構(gòu)建
- Jenkins 觸發(fā)構(gòu)建構(gòu)建任務(wù)移稳,根據(jù) Pipeline 腳本定義分步驟構(gòu)建
- 先進(jìn)行代碼靜態(tài)分析蕴纳,單元測(cè)試(本文跳過)
- 根據(jù)構(gòu)建結(jié)果構(gòu)建 Docker 鏡像
- 推送 Docker 鏡像到 Harbor 倉(cāng)庫(kù)
- 觸發(fā)更新服務(wù)階段
- 查看服務(wù)是否更新成功
部署流程可參考Jenkins pipeline部署k8s應(yīng)用