開篇
最近整理筆記,不知不覺發現關於kubernetes相關的筆記已經達99篇了,索性一起總結了。算是對這兩年做容器雲平台的一個總結,本文是開篇,先介紹下所有用到的組件。首先來看下架構圖(實在畫的太丑,求推薦工具)
如圖,容器平台主要涉及的組件有:
- Docker
- Kubernetes
- Etcd
- Flannel
- Ceph
- Harbor
- Drone
- Promethues
- EFK
- GIT/SVN
- Ingress-nginx
- Dashboard(Lens)
正所謂開局一張圖,后面全靠編,哈哈,開干。。。
首先,介紹Docker,廢話不多說,先上圖
docker是什么?
根據官網的介紹,容器是把代碼及其所有依賴打包的一個標准單元,你可以把這個程序從一個環境快速可靠的轉移到另外一個環境。Docker鏡像是一個輕量級的,獨立的,可執行的軟件包,其中就包含了運行程序所需要的一切。
說白了就是把應用程序及其依賴打包到一個文件里,運行這個文件,就會生成一個虛擬容器。程序在里面運行就跟在物理機或者虛擬機上一樣。~~~真拗口
docker的用途
- 簡化配置
- 代碼流水線管理
- 提高開發效率
- 隔離應用
- 整合服務器
- 快速部署
- 提供一致性環境
- 提供彈性服務
docker的缺點以及為什么用kubernetes
docker容器的輕量化,意味着在等量資源的基礎上能創建出更多的容器實例。但是在面對分布在多台主機上且擁有數量很多容器(成百上千)的大規模應用程序時,傳統的單機容器管理解決方案就會變得力不從心。另外,由於微服務越來越完善的原生支持,在一個容器集群中的容器粒度越來越小,數量越來越多。在這種情況下,都需要借助容器管理平台,從而實現調度,負載均衡以及任務分配等。
容器集群管理工具能在一組服務器上管理多容器組合成的應用,每個應用集群在容器編排工具看來是一個部署或管理實體,容器集群管理工具全方位為應用集群實現自動化,包括應用實例部署、應用更新、健康檢查、彈性伸縮、自動容錯等等。哈哈,好巧不巧,Kubernetes就提供了這些功能,這就是為什么我們要用Kubernetes的原因。
Kubernetes是什么?
Kubernetes:Google 開源的容器管理系統,起源於Borg 系統。用於自動部署,擴展和管理容器化應用程序的開源系統。它將組成應用程序的容器組合成邏輯單元,以便於管理和服務發現。
Kubernetes架構圖
Kubernetes的用途
- 服務發現與負載均衡
- 自我修復
- 自動化上線和回滾
- 配置管理
- 存儲編排
- 批量執行
- Service拓撲
- 斷點切片
- 自動裝箱
- 水平擴縮
- 雙協議棧
Kubernetes的挑戰
作為整個平台的核心,Kubernetes的功能強大,但是就其本身架構而言,學習成本不低。
- kubernetes概念太多,可能一個月也無法入門,甚至連集群都搭建不出來。
- 學習kubernetes對運維的技術能力要求比較高,和傳統的運維有一定差異,需要有修改代碼的能力。
- kubernetes的誕生,把運維從傳統轉向devops,需要面臨的新技術很多。
- 但是當你掌握到了k8s的核心使用,就會受益匪淺。
鏡像倉庫docker-registry & harbor
倉庫,顧名思義,就是存放東西的地方,docker-registry,理所當然,就是存放docker鏡像(image)的地方了。docker的倉庫有公有倉庫和私有倉庫。共有倉庫比如hub.docker.com,gcr.io,k8s.gcr.io等,一般下載速度比較慢,尤其k8s相關的鏡像,得魔法上網。私有倉庫一般是公司內部自行搭建,用於存放內部構建的docker鏡像,部署服務時從私有倉庫下載,速度很快。
harbor就是一個用於存儲docker鏡像的企業級Registry服務。相比較於原生的Regisrty來說,它具有很多的優勢。
- 提供分層傳輸機制,優化網絡傳輸
- 提供WEB界面,優化用戶體驗
- 支持水平擴展集群
- 良好的安全機制
- Harbor提供了基於角色的訪問控制機制,並通過項目來對鏡像進行組織和訪問權限的控制
harbor架構圖
ceph介紹
在能對kubernetes提供存儲服務的眾多服務當中,ceph的優勢在於提供了多樣化的存儲方式,包括對象存儲,塊存儲,文件系統三種。ceph作為一個統一的分布式存儲系統,提供了高性能,高可用性,搞擴展性。對於kubernetes來說,作為基礎服務,這些特性是必不可少的。
ceph架構圖
下面就來了解下ceph的幾大特性:
- 高性能
采用CRUSH算法,數據分布均衡,並行度高。
容災域的隔離,能夠實現各類負載的副本放置規則,例如跨機房、機架感知等。
能夠支持上千個存儲節點的規模,支持TB到PB級的數據。 - 高可用性
副本數可以靈活控制。
支持故障域分隔,數據強一致性。
多種故障場景自動進行修復自愈。
沒有單點故障,自動管理。 - 高可擴展性
去中心化。
擴展靈活。
隨着節點增加而線性增長。 - 支持三種存儲接口:塊存儲、文件存儲、對象存儲
- 支持自定義接口,支持多種語言驅動
當然了,ceph作為獨立的系統,可以部署到裸機上,也可以部署到kubernetes集群。
PS:如果用的公有雲部署kubernetes,可以直接使用公有雲提供的存儲服務,簡單省事。
ceph介紹完,再來介紹另一個存儲etcd
ETCD介紹
Etcd作為kubernetes的存儲核心,作為保存 Kubernetes 所有集群數據的后台數據庫。etcd 是兼具一致性和高可用性的鍵值數據庫。
etcd架構圖
etcd有以下的特點:
- 簡單:安裝配置簡單,而且提供了HTTP API進行交互,使用也很簡單
- 安全:支持SSL證書驗證
- 快速:根據官方提供的benchmark數據,單實例支持每秒2k+讀操作
- 可靠:采用raft算法,實現分布式系統數據的可用性和一致性
為了保證數據的高可用,一般情況下都使用奇數節點的集群。
接下來,介紹kubernetes集群的網絡插件
Flannel介紹
Flannel: CoreOS 開源的網絡方案,為 kubernetes 設計,功能是讓集群中的不同節點主機創建的Docker容器都具有全集群唯一的虛擬IP地址。Flannel的底層通信協議的可選余地有很多,比如UDP、VXlan、AWS VPC等等,不同協議實現下的網絡通信效率相差較多,默認為使用UDP協議,部署和管理簡單。
Flannel的后台數據也存儲於ETCD中。
Flannel架構圖
如過只是搭建kubernetes集群環境,以上組件就足夠了,下面繼續介紹的組件,主要是基於kubernetes之上的應用,主要用於構建流水線,監控集群,日志分析。
drone介紹
開始之前,先介紹兩個概念:CI和CD
什么是CI/CD
持續集成(Continous Intergration,CI)是一種軟件開發實踐,即團隊開發成員經常集成它們的工作,通常每個成員每天至少集成一次,也就意味着每天可能會發生多次集成。每次集成都需要通過自動化的編譯、發布、自動化回歸測試來驗證,從而盡快地發現集成錯誤。而這些自動化的操作則由CI軟件進行執行。
持續部署(Continous Delivery,CD)在持續集成的基礎上,將集成后的代碼部署到真實運行環境中(本文指部署到kubernetes集群)。交付團隊 ->版本控制 ->構建和單元測試 ->自動驗收測試 -> 發布
什么是Drone
Drone 是一個基於Docker容器技術的可擴展的持續集成引擎,用於自動化測試、構建、發布。每個構建都在一個臨時的Docker容器中執行,使開發人員能夠完全控制其構建環境並保證隔離。開發者只需在項目中包含 .drone.yml文件,將代碼推送到 git 倉庫,Drone就能夠自動化的進行編譯、測試、發布。
流程如圖
prometheus-operator
Prometheus:一個非常優秀的監控工具或者說是監控方案。它提供了數據搜集、存儲、處理、可視化和告警一套完整的解決方案。作為kubernetes官方推薦的監控系統,用Prometheus來監控kubernetes集群的狀況和運行在集群上的應用運行狀況。
Prometheus架構圖
那Prometheus Operator是做什么的呢?
Operator是由CoreOS公司開發的,用來擴展 Kubernetes API,特定的應用程序控制器,它用來創建、配置和管理復雜的有狀態應用,如數據庫、緩存和監控系統。
可以理解為,Prometheus Operator就是用於管理部署Prometheus到kubernetes的工具,其目的是簡化和自動化對Prometheus組件的維護。
Prometheus Operator架構
EFK介紹
EFK,全稱Elasticsearch Fluentd Kibana ,是kubernetes中比較常用的日志收集方案,也是官方比較推薦的方案。
通過EFK,可以把集群的所有日志收集到Elasticsearch中,然后可以對日志做分析。一般用於故障排查,數據分析等。。。
數據流程圖
Dashboard介紹
kubernetes的Dashboard有很多,官方Dashboard,rancher, kuboard, octant, Lens等等,這里只簡單介紹Lens
Lens 一個開源的管理 Kubernetes 集群的IDE,支持 MacOS, Windows 和 Linux。通過 Lens,我們可以很方便地管理多個 Kubernetes 集群。
直接上圖,自己體驗,效果更佳。
最后GIT/SVN和Ingress-nginx先不介紹,后續實戰再說
總結
至此,容器雲平台的所有組件都基本做了個介紹,現在從使用者的角度,簡單梳理流程:
- 開發人員向git(gitlab/github/gogs)提交代碼,代碼中必須包含Dockerfile和.drone.yml文件
- 將代碼commit到遠程倉庫
- 發布應用時需要填寫服務類型、服務名稱、資源數量、實例個數等信息,確定后觸發drone自動構建
- Drone的CI流水線自動編譯代碼並打包成docker鏡像推送到Harbor鏡像倉庫
- Drone的CI流水線中包括了自定義腳本,根據准備好的kubernetes的YAML模板,將其中的變量替換成用戶輸入的選項
- 生成應用的kubernetes YAML配置文件
- 更新Ingress的配置,根據新部署的應用的名稱,在ingress的配置文件中增加一條路由信息
- 更新DNS,向其中插入一條DNS記錄,IP地址是ingress節點的IP地址。
- Drone的CI流水線中包括了自定義腳本調用kubernetes的API,部署應用。
PS:整理+排版花了好幾天,我真是太難了%#¥@@~¥!……#……太難了~~~~
下一篇,發實戰水文&……%¥#@!
Tips: 更多好文章,請關注首發微信公眾號“菜鳥運維雜談”!!!