容器雲平台No.1~基於Docker及Kubernetes構建的容器雲平台


開篇

最近整理筆記,不知不覺發現關於kubernetes相關的筆記已經達99篇了,索性一起總結了。算是對這兩年做容器雲平台的一個總結,本文是開篇,先介紹下所有用到的組件。首先來看下架構圖(實在畫的太丑,求推薦工具)

如圖,容器平台主要涉及的組件有:

正所謂開局一張圖,后面全靠編,哈哈,開干。。。

首先,介紹Docker,廢話不多說,先上圖

docker是什么?

根據官網的介紹,容器是把代碼及其所有依賴打包的一個標准單元,你可以把這個程序從一個環境快速可靠的轉移到另外一個環境。Docker鏡像是一個輕量級的,獨立的,可執行的軟件包,其中就包含了運行程序所需要的一切。

說白了就是把應用程序及其依賴打包到一個文件里,運行這個文件,就會生成一個虛擬容器。程序在里面運行就跟在物理機或者虛擬機上一樣。~~~真拗口

docker的用途

  1. 簡化配置
  2. 代碼流水線管理
  3. 提高開發效率
  4. 隔離應用
  5. 整合服務器
  6. 快速部署
  7. 提供一致性環境
  8. 提供彈性服務

docker的缺點以及為什么用kubernetes

docker容器的輕量化,意味着在等量資源的基礎上能創建出更多的容器實例。但是在面對分布在多台主機上且擁有數量很多容器(成百上千)的大規模應用程序時,傳統的單機容器管理解決方案就會變得力不從心。另外,由於微服務越來越完善的原生支持,在一個容器集群中的容器粒度越來越小,數量越來越多。在這種情況下,都需要借助容器管理平台,從而實現調度,負載均衡以及任務分配等。

容器集群管理工具能在一組服務器上管理多容器組合成的應用,每個應用集群在容器編排工具看來是一個部署或管理實體,容器集群管理工具全方位為應用集群實現自動化,包括應用實例部署、應用更新、健康檢查、彈性伸縮、自動容錯等等。哈哈,好巧不巧,Kubernetes就提供了這些功能,這就是為什么我們要用Kubernetes的原因。


Kubernetes是什么?

Kubernetes:Google 開源的容器管理系統,起源於Borg 系統。用於自動部署,擴展和管理容器化應用程序的開源系統。它將組成應用程序的容器組合成邏輯單元,以便於管理和服務發現。

Kubernetes架構圖

Kubernetes的用途

  1. 服務發現與負載均衡
  2. 自我修復
  3. 自動化上線和回滾
  4. 配置管理
  5. 存儲編排
  6. 批量執行
  7. Service拓撲
  8. 斷點切片
  9. 自動裝箱
  10. 水平擴縮
  11. 雙協議棧

Kubernetes的挑戰

作為整個平台的核心,Kubernetes的功能強大,但是就其本身架構而言,學習成本不低。

  1. kubernetes概念太多,可能一個月也無法入門,甚至連集群都搭建不出來。
  2. 學習kubernetes對運維的技術能力要求比較高,和傳統的運維有一定差異,需要有修改代碼的能力。
  3. kubernetes的誕生,把運維從傳統轉向devops,需要面臨的新技術很多。
  4. 但是當你掌握到了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先不介紹,后續實戰再說


總結

至此,容器雲平台的所有組件都基本做了個介紹,現在從使用者的角度,簡單梳理流程:

  1. 開發人員向git(gitlab/github/gogs)提交代碼,代碼中必須包含Dockerfile和.drone.yml文件
  2. 將代碼commit到遠程倉庫
  3. 發布應用時需要填寫服務類型、服務名稱、資源數量、實例個數等信息,確定后觸發drone自動構建
  4. Drone的CI流水線自動編譯代碼並打包成docker鏡像推送到Harbor鏡像倉庫
  5. Drone的CI流水線中包括了自定義腳本,根據准備好的kubernetes的YAML模板,將其中的變量替換成用戶輸入的選項
  6. 生成應用的kubernetes YAML配置文件
  7. 更新Ingress的配置,根據新部署的應用的名稱,在ingress的配置文件中增加一條路由信息
  8. 更新DNS,向其中插入一條DNS記錄,IP地址是ingress節點的IP地址。
  9. Drone的CI流水線中包括了自定義腳本調用kubernetes的API,部署應用。

PS:整理+排版花了好幾天,我真是太難了%#¥@@~¥!……#……太難了~~~~
下一篇,發實戰水文&……%¥#@!

Tips: 更多好文章,請關注首發微信公眾號“菜鳥運維雜談”!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM