Kubernetes 支持多個(gè)容器運(yùn)行環(huán)境:Docker、 containerd、CRI-O 以及任何實(shí)現(xiàn) Kubernetes CRI (容器運(yùn)行環(huán)境接口)
Kubernetes 官方發(fā)布公告,宣布自 v1.20 起放棄對 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è)組件:
①常駐后臺進(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)程對話,后者負(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
簡介
kubernetes是Google基于borg開源的容器編排系統(tǒng),它的目標(biāo)是管理跨多個(gè)主機(jī)的容器,用于自動部署、擴(kuò)展和管理容器化的應(yīng)用程序,主要實(shí)現(xiàn)語言為go語言。
集群
當(dāng)你部署完Kubernetes,即擁有了一個(gè)完整的集群。一個(gè)Kubernetes集群由一組被稱作為節(jié)點(diǎn)的機(jī)器組成:
- master負(fù)責(zé)管理集群,協(xié)調(diào)集群中的所有活動,例如調(diào)度應(yīng)用程序、維護(hù)應(yīng)用程序所需的狀態(tài)、擴(kuò)展應(yī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)的容器集合,它們共享存儲、網(wǎng)絡(luò)、以及怎樣運(yùn)行這些容器的聲明。通常你不需要直接創(chuàng)建Pod,甚至單實(shí)例Pod。相反,你會使用Deployment 或Job這類工作負(fù)載資源來創(chuàng)建Pod。如果Pod需要跟蹤狀態(tài),可以考慮statefulSet資源。

Label
Label 是識別 Kubernetes 對象的標(biāo)簽,以 key/value 的方式附加到對象上。Label 不提供唯一性,并且實(shí)際上經(jīng)常是很多對象(如Pods)都使用相同的 label 來標(biāo)志具體的應(yīng)用。 Label 定義好后其他對象可以使用 Label Selector 來選擇一組相同 label 的對象(比如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 是對一組資源和對象的抽象集合。
名字空間資源本身、底層資源(節(jié)點(diǎn)Node和持久化卷PV)不屬于任何名字空間。
Deployment
一個(gè)Deployment為Pods和ReplicatSets提供聲明式的更新能力。Deployment 確保任意時(shí)間都有指定數(shù)量的 Pod“副本”在運(yùn)行。Deployment 還支持回滾和滾動升級。
當(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 都會自動分配一個(gè) cluster IP(僅在集群內(nèi)部可訪問的虛擬地址)和 DNS 名,其他容器可以通過該地址或 DNS 來訪問服務(wù),而不需要了解后端容器的運(yùn)行。

安裝kubernetes
可參考K8S安裝部署
三、Harbor
簡介
Harbor 是一個(gè)CNCF基金會托管的開源的可信的云原生docker registry項(xiàng)目,可以用于存儲、簽名、掃描鏡像內(nèi)容,Harbor 通過添加一些常用的功能如安全性、身份權(quán)限管理等來擴(kuò)展 docker registry 項(xiàng)目,此外還支持在 registry 之間復(fù)制鏡像,還提供更加高級的安全功能,如用戶管理、訪問控制和活動審計(jì)等,在新版本中還添加了Helm倉庫托管的支持。
Harbor最核心的功能就是給 docker registry 添加上一層權(quán)限保護(hù)的功能,docker registry v2 就已經(jīng)為我們提供了支持,v2 集成了一個(gè)安全認(rèn)證的功能,將安全認(rèn)證暴露給外部服務(wù),讓外部服務(wù)去實(shí)現(xiàn)。

安裝Harbor
四、Jenkins
簡介
Jenkins是一款開源 CI&CD 軟件,用于自動化各種任務(wù),包括構(gòu)建、測試和部署軟件。
Pipeline
Jenkins 流水線是一套插件,它支持實(shí)現(xiàn)和集成 continuous delivery pipelines 到Jenkins。對Jenkins 流水線的定義被寫在一個(gè)文本文件中 (成為 Jenkinsfile),該文件可以被提交到項(xiàng)目的源代碼的控制倉庫。 這是"流水線即代碼"的基礎(chǔ); 將CD 流水線作為應(yīng)用程序的一部分,像其他代碼一樣進(jìn)行版本化和審查。
流水線是用戶定義的一個(gè)CD流水線模型 。流水線的代碼定義了整個(gè)的構(gòu)建過程, 他通常包括構(gòu)建, 測試和交付應(yīng)用程序的階段 。
安裝Jenkins
五、CI/CD
以下列實(shí)踐過的流程來講述整個(gè)CI/CD 過程
- 開發(fā)人員提交代碼到 Gitlab 代碼倉庫
- 通過 Jenkins 的輪詢SCM觸發(fā) Pipeline 自動構(gòu)建
- Jenkins 觸發(fā)構(gòu)建構(gòu)建任務(wù),根據(jù) Pipeline 腳本定義分步驟構(gòu)建
- 先進(jìn)行代碼靜態(tài)分析,單元測試(本文跳過)
- 根據(jù)構(gòu)建結(jié)果構(gòu)建 Docker 鏡像
- 推送 Docker 鏡像到 Harbor 倉庫
- 觸發(fā)更新服務(wù)階段
- 查看服務(wù)是否更新成功

部署流程可參考Jenkins pipeline部署k8s應(yīng)用
