##開篇
最近整理筆記,不知不覺發現關於kubernetes相關的筆記已經達99篇了,索性一塊兒總結了。算是對這兩年作容器雲平臺的一個總結,本文是開篇,先介紹下全部用到的組件。首先來看下架構圖(實在畫的太醜,求推薦工具)
nginx
如圖,容器平臺主要涉及的組件有:git
- Docker
- Kubernetes
- Etcd
- Flannel
- Ceph
- Harbor
- Drone
- Promethues
- EFK
- GIT/SVN
- Ingress-nginx
- Dashboard(Lens)
##正所謂開局一張圖,後面全靠編,哈哈,開幹。。。github
首先,介紹Docker,廢話很少說,先上圖
###docker是什麼?
根據官網的介紹,容器是把代碼及其全部依賴打包的一個標準單元,你能夠把這個程序從一個環境快速可靠的轉移到另一個環境。Docker鏡像是一個輕量級的,獨立的,可執行的軟件包,其中就包含了運行程序所須要的一切。
算法
說白了就是把應用程序及其依賴打包到一個文件裏,運行這個文件,就會生成一個虛擬容器。程序在裏面運行就跟在物理機或者虛擬機上同樣。~~~真拗口docker
###docker的用途數據庫
- 簡化配置
- 代碼流水線管理
- 提升開發效率
- 隔離應用
- 整合服務器
- 快速部署
- 提供一致性環境
- 提供彈性服務
###docker的缺點以及爲何用kubernetes
docker容器的輕量化,意味着在等量資源的基礎上能建立出更多的容器實例。可是在面對分佈在多臺主機上且擁有數量不少容器(成百上千)的大規模應用程序時,傳統的單機容器管理解決方案就會變得力不從心。另外,因爲微服務愈來愈完善的原生支持,在一個容器集羣中的容器粒度愈來愈小,數量愈來愈多。在這種狀況下,都須要藉助容器管理平臺,從而實現調度,負載均衡以及任務分配等。
apache
容器集羣管理工具能在一組服務器上管理多容器組合成的應用,每一個應用集羣在容器編排工具看來是一個部署或管理實體,容器集羣管理工具全方位爲應用集羣實現自動化,包括應用實例部署、應用更新、健康檢查、彈性伸縮、自動容錯等等。哈哈,好巧不巧,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: 更多好文章,首發公X衆X號「菜鳥運維雜談」!!!