一、簡介
1、什么是Kubernetes
簡稱K8s,用8代替8個字符“ubernerte”而成的速寫,K8s是一個開源的容器編排平台,它是一個跨主機集群的開源容器調度平台,用於管理雲平台中多個主機上的容器化的應用,它可以自動化應用容器的部署、擴展、的操作,k8s的目標是讓部署容器化的應用簡單並且高效,構建一個軟件和工具的生態系統,以減輕企業在公有雲或私有雲運行應用程序的負擔,;K8s提供了應用部署、規划,更新,維護的一種機制。
K8s項目由Google公司在2014年啟動,Kubernetes建立在google公司超過十余年阿運維經驗基礎之上,Google所有的應用都運行在容器上,再與社區中最好的想法和實踐相結合,也許它是現在最受歡迎的容器平台。
2、使用K8s可以快速高效響應客戶的需求:
快速、可預測地部署您的應用程序
擁有即使擴展應用程序的能力
不影響現有業務的情況下,無縫地發布新功能
優化了硬件資源,降低成本
3、K8s具有如下特點:
便捷性:無論公有雲、私有雲、混合雲還是多雲架構都全面支持
可擴展性:它是模塊化、可插拔、可掛載、可組合,支持各種形式的擴展
自修復:它可以自保持應用狀態、可自重啟、自復制、自縮放的,通過聲明式語法提供了強大的自修復能力
4、三個時代說明,K8s為什么如此有用
傳統部署時代:早期,組織都是再物理服務器上運行應用程序,無法位物理服務器中的應用定義資源邊界,着會導致資源分配問題。比如,如果再物理服務器上運行多個應用程序,可能會出現一個應用占用大部分資源,其他應用程序的性能就將下降,解決方案往往是在不同服務器上運行每個應用程序,但這並沒有隨着資源利用不足而擴展資源,並且維護諸多物理服務器成本也很高。
虛擬化部署時代:為了解決上面提到的資源分配問題,引入了虛擬化,它允許在單個物理服務器的CPU上允許多個虛擬機(VM)。虛擬化允許應用程序在VM之間隔離,並提供安全級別,因為一個應用程序的信息不能被另一個應用程序自由訪問。
虛擬化可以更好的利用物理服務器中資源,並可以實現更好的可伸縮性,因為可以輕松地添加或更新應用程序,降低硬件成本等等。借助虛擬化,您可以將一組物理資源呈現位一組一次性虛擬機。
每個VM是一台完整的計算機,在虛擬化硬件上運行所有組件,包括其自己的操作系統
容器部署時代:容器類似VM,但是他們具有輕松的隔離屬性,可以在應用程序之間共享操作系統。因此,容器被認為是輕量的,與VM相似,容器具有自己的文件系統,CPU,內存,進程空間等。由於他們與基礎架構分離,因此可以跨雲和OS分發進行移植
5、補充使用容器的好處
敏捷的應用程序創建和部署:與使用VM鏡像相比,容器鏡像創建的簡便性和效率更高。
持續的開發,集成和部署:通過快速簡單的回滾(鏡像不可更改),提供可靠且頻繁的容器鏡像構建和部署。
開發和運營的關注點分離:在構建/發布時,而不時在部署時創建應用程序容器鏡像,從而將應用程序與基礎架構分離。
可觀察性不僅可以顯示操作系統級別的信息和指標,還可以顯示應用程序的運行狀況和其他信號。
跨開發,測試和生成環境一致性:在便捷式計算機上與在雲中相同的運行。
雲和操作系統分發的可移植性:可在Ubuntu,RHEL,coreOS,本地,google kubernetes engine和其他任何地方運行。
松散耦合,分布式,彈性,解放的微服務:應用程序被分解成較小的獨立部分,並且可以動態部署和管理,而不時在一台大型單機上運行的整體堆棧。
資源隔離:可預測的應用程序性能。
資源利用:高效率和高密度。
6、K8s提供了哪些功能
服務發現和負載均衡
K8s可以使用DNS名稱或使用其自己的IP地址公開容器。如果到容器的流量很高,K8s可以負載均衡分配流量,使部署穩定
存儲編排
允許自動掛載選擇的存儲系統,例如本地存儲,公有雲提供商等。
自動部署和回滾
可以使用Kunbernetes描述已經部署容器的所需狀態,並可以以控制速率將實際狀態更改所需狀態。比如可以自動化Kubernetes來位您的部署創建新容器,刪除現有容器並將他們的所有資源用於新容器
自動包裝
一個Kubernetes集群,可以用於容器化任務,可以指定每個容器需要多少CPU和內存,使其充分利用資源。
自檢
Kubernetes可以重新啟動失敗的容器,替換容器,殺死對用戶定義的運行狀態檢查沒有響應的容器,並且在准備好服務之前不會將其通告給客戶端
加密管理
Kubernetes允許存儲和管理敏感信息,如密碼,auth令牌和ssh密鑰,可以部署和更新機密的應用程序配置,而無需重新構建容器鏡像,也無需在堆棧配置中公開。
7、kubernetes不是什么
不是一個傳統意義上包羅萬象的Paas系統,它保留用戶的自由選擇,比如:
不限制支持的應用程序類型,不限制應用程序框架,不限制支持的語言(java/python/ruby)支持多種多樣的工作負載,包括無狀態,有狀態和數據處理工作負載。
不提供內置服務的中間件(例如:消息中間件)、數據處理框架(例如:spark)、數據庫(例如:mysql)和分布式存儲(例如Ceph),這些應用可以允許在K8s上。
沒有提供點擊即部署的服務市場。
源代碼到鏡像都是開源的,它不部署源代碼且不構建您的應用程序。持續集成,交付和部署(CI/CD)工作流取決各公司組織的文化和偏好。
允許用戶選擇其他的日志記錄,監控和告警系統,(它也提供一些集成作為概念證明)。
不提供也不要求應用程序配置語言/系統,提供一個聲明性API,可以通過任意形式的聲明性規范。
不提供也不采用任何全面的機器配置,維護,管理或自動修復系統。
另外許多Paas系統運行在K8s上面,比如openshift,deis,eldarion,可以自定義自己的paas與自己選擇的CI系統集成,或與K8s一起使用,將容器鏡像部署到K8s上。
由於K8s在應用級別而不是僅僅在硬件級別運行,因此它提供Paas產品通用的一些功能,如:部署、擴展、負載均衡、日志記錄、監控等。但是K8s不是單一的,默認是可選和可插拔的。
K8s也不僅僅是一個編排系統,它消除了編排的需要,編排代表工作流的執行為從A到B,然后到C,相反,K8s是包括一套獨立、可組合的控制過程,通過聲明式語法使其連續地朝向期望狀態驅動當前狀態,不需要告訴它具體的從A到C的過程,只需要告訴到C的狀態即可,也不需要集中控制,這使得系統更易於使用,並且強大,更具有彈性和擴展性。
二、K8s架構
1、整體架構
三、常見組件
請見圖示1:分別包含1、2、3、4
1、master:
Kubernetes管理節點
2、apiserver:
提供接口服務,用戶通過apiserver來管理整個容器集群平台。API Server負責和Etcd交互(其他組件不會直接操作etcd,只有API Server這么做),整個Kubernetes集群的所有交互都是以API server為核心的。如:1、所有對集群進行的查詢和管理都要通過API來進行;2、所有模塊之間並不會互相調用,而是通過和API Server打交道來完成自己那部分的工作、API Server提供的驗證和授權保證了整個集群的安全
3、scheduler Kubernetes 調度服務:
4、Replication Controllers 復制:
保證pod的高可用
Replication Controller是Kubernetes系統中最有用的功能,實現復制多個Pod副本,往往一個應用需要多個Pod來支撐,並且可以保證其復制的副本數,即使副本所調度分配的宿主機出現異常,通過Replication Controller 可以保證在其它宿主機啟用同等數量的Pod。Replication Controller 可以通過repcon模板來創建多個Pod副本,同樣也可以直接復制已存在Pod,需要通過Label selector來關聯
請見圖示2:包含5、6、7、8
5、minion:
真正運行容器container的物理機。Kubernets中需要很多minion集群,來提供運算
6、container:
容器,可以運行服務和程序
7、Pod:
Kubernetes系統中,調度的最小顆粒不是單純的容器,而是抽象成一個Pod,Pod是一個可以被創建、銷毀、調度、管理的最小部署單元。pod中可以包括一個或一組容器。
pod:豆莢的意思,如下圖示理解pod及容器實例:
8、Kube_prox 代理:
做端口轉發,相當於LVS-NAT模式中的復制調度器
Proxy解決了同一宿主機,相同服務端口沖突的問題,還提供了對外服務的能力,Proxy后端使用了隨機、輪詢負載均衡算法。
9、etcd:
存儲Kubernetes的配置信息,可以理解為K8s數據庫,存儲這K8s容器平台所有節點、pods、網絡等信息
10、services:
services是Kunbernetes最外圍的單元,通過虛擬一個訪問IP及服務端口,可以訪問我們定義好的Pod資源。目前的版本是通過iptables的nat轉發來實現,鑽發的目標端口為Kube_proxy生成的隨機端口。
11、Lables標簽:
Lables是用於區分Pod、Service、Replication Controller的key/value鍵值對,僅使用在Pod、Service、Replication Controller之間的關系識別,但對這些單元本身進行操作時得使用name標簽。
12、Deployment部署
Kubernetes Deployment用於更新Pod和Replica Set(下一代的Replication Controller)的方法,可以在Deployment對象中只描述你所期望的理想專題(預期運行狀態),Deployment控制器會將現在的實際狀態轉換成期望的狀態。例如,將所有的webapp:v1.0.9升級成webapp:v1.1.0,只需要創建Deployment,Kubernetes會按照Deployment自動進行升級,通過Deployment可以用來創建新的資源
Deployment可以幫我們實現無人值守的上學,大大降低我們上線的復雜和風險
13、Kubelet命令
Kubelet和Kube-proxy都運行在minion節點上
Kube-proxy實現Kubernetes網絡相關內容
Kubelet命令管理pod、pod中容器機讓其的鏡像和卷等信息
14、總結:各組件之間的關系
1)、kubernetes由一個master和多個minion組成,master通過api提供服務接收kubectl的請求來調度管理集群,kubectl是k8s平台的一個管理命令
2)、Replication controller定義了多個pod或者容器需要運行,如果當前集群中運行的pod或容器達不到配置的數量,replication controller會調度容器在多個minion上運行,保證集群中的pod數量
3)、service則定義真實對外提供的服務,一個service會對應后端運行的多個container。
4)、Kubernetes是一個管理平台,minion上的kube-proxy擁有提供真實服務公網IP,客戶端訪問K8S中提供的服務,是直接訪問到kube-proxy上的。
5)、在kubernetes中pod是一個基本單元,一個pod可以是提供相同功能的多個container,這些容器會被部署在同一個minion上,minion是運行Kubelet中容器的物理機,minion介紹master的指令創建pod或者容器。
參考:互聯網內容
轉載請注明出處:https://www.cnblogs.com/zhangxingeng/p/11670786.html
部署:請見Kubernetes2-K8s的集群部署
kubectl:請見Kubernetes3-kubectl管理Kubernetes容器平台-1
kubectl:請見Kubernetes3-kubectl管理Kubernetes容器平台-2
Kubernetes Dashboard web界面:請見Kubernetes4-web管理界面
kubenetes 基於redis和docker的留言薄:請見Kubernetes5-集群上搭建基於redis和docker的留言薄