是不是和Mesos差不多,用戶說明每個container的資源需要,各種policy限制等,然後scheduler算一下?


先放一張Kubernetes的架構圖:

整體來看,是一個老大,多個幹活的這種結構,基本上所有的分散式系統都是這樣,但是裡面的組件名稱就紛繁複雜,下面將一一解析。

1、元數據存儲與集群維護

作為一個集群系統,總要有一個統一的地方維護整個集群以及任務的元數據。而且作為集群系統的控制節點,為了高可用性,往往存在多個Master,在多個Master中間,總要有一個Leader。

在Kubernetes裡面,統一的存儲使用etcd來保存,Leader的選舉也是通過etcd進行,因而有apiserver有參數--etcd-servers,controller和scheduler都有參數--master string指向apiserver,並且有參數--leader-elect選舉出Leader,也會有熟悉的--address ip。

2、API層與命令行

作為一個分散式系統,每一層都會有自己的API,但是對外往往需要一個統一的API介面層,一般除了酷酷的界面之外,為了自動化,往往會有一個命令行可以執行操作,其實命令裡面封裝的也是對API的調用。

對於Kubernetes,API層是一個單獨的進程apiserver提供,認證和鑒權也是在這一層實現的,所有對於kubernetes的管理平台的訪問都是通過apiserver這一層進行的。

對於命令行,kubernetes是kubectl,通過向apiserver調用執行操作,例如pod,service,deployment等。Kubernetes也有自己的類似package的管理,Kubernetes Helm,但是命令就變成了helm了。

3、調度

當運行一個容器的時候,放在哪台節點上,這個過程是調度。對於Kubernetes,調度是由一個單獨的進程scheduler負責的。

Kubernetes也支持通過對Node設置Label,從而將pod放在某些節點上。另外kubernetes還有NodeAffinity:

  • RequiredDuringSchedulingRequiredDuringExecution:在調度的時候必須部署到某些節點,運行期如果條件不滿足則重新調度
  • RequiredDuringSchedulingIgnoredDuringExecution :在調度的時候必須部署到某些節點,運行期就算了。
  • PreferredDuringSchedulingIgnoredDuringExecution :在調度的時候最好部署到某些節點,運行期就算了。

4、副本與彈性伸縮

容器如果部署無狀態服務,一個好處就是可以多副本,並且可以彈性伸縮。

在Kubernetes裡面,副本數目是以pod為單位的,由controller進程式控制制,可以通過創建一個Deployment來控制副本數。

Kubernetes也可以實現autoscaling。有一個組件Horizontal Pod Autoscaling,可以通過監控CPU的使用情況動態調整Pod的數量。

5、編排

為了能夠通過編排文件一鍵創建整個應用,需要有編排功能。Kubernetes的編排是基於yml文件。

6、服務發現與DNS

容器平台的一個重要的功能是服務發現,也即當容器的地址改變的時候,可以自動進行服務之間的關聯。

一般的服務發現首先要通過DNS將服務名和應用關聯起來,可以基於DNS對一個服務的多個應用進行內部負載均衡,也有直接加一個內部負載均衡器來做這件事情。

Kubernetes的DNS組件是通過skyDNS實現的,負載均衡是通過將DNS轉化為VIP,有個內置的負載均衡器kube-proxy來完成這件事情。

7、容器

Kubernetes支持Docker、RKT等多種容器格式。

8、網路

容器的網路配置有Docker Libnetwork Container Network Model(CNM)和Container Network Interface(CNI)兩個陣營。Docker Libnetwork的優勢就是原生,而且和Docker容器生命周期結合緊密;缺點也可以理解為是原生,被Docker「綁架」。Kubernetes屬於CNI陣營,CNI的優勢是兼容其他容器技術(e.g. rkt)及上層編排系統(Kuberneres Mesos),而且社區活躍勢頭迅猛,缺點是非Docker原生。

9、存儲

Kubernetes可以創建Persistent Volumes,支持GCE,AWS,NFS,GlusterFS,Ceph等。

10、監控

容器的監控中Prometheus +cadvisor是主流的方案,而cadvisor來自Kubernetes的一個組件。

11、大數據與包管理

在kubernetes裡面部署大數據可以參考https://github.com/kubernetes/examples

12、負載均衡

這裡的負載均衡指的是外部負載均衡。在kubernetes中,外部負載均衡器是通過一個ingress controller根據請求進行創建,如果在雲平台例如GCE,可創建雲平台的負載均衡器,雲平台的負載均衡器可通過NodePort連接到後端的Service。

13、節點

kubernetes的Node上跑的是kubelet。

14、升級與回滾

所有的容器平台對於容器多副本的升級全部都是要滾動升級,在Kubernetes裡面,同樣有對rolling update的支持。

利益相關:網易雲從2015下半年開始向Kubernetes社區投入,是國內最早的Kubernetes實踐者和貢獻者,也是Kubernetes技術的積極佈道者。網易雲基於Kubernetes的容器服務為用戶提供了無伺服器容器,讓企業能夠快速部署業務,輕鬆運維服務。容器服務支持彈性伸縮、垂直擴容、灰度升級、服務發現、服務編排、錯誤恢復及性能監測等功能。點擊可免費試用


個人看法:

抽象程度不一樣,Mesos整體只有framework抽象,在executor端只有Task抽象。而k8s抽象出pod、service、namespace、label、proxy等內容,為構建整體應用棧提供了合理的抽象。

Apache的Mesos和Google的Kubernetes 有什麼區別?

來源http://dockerone.io當被問到區別的時候,我會這樣回答:
  1. 如果你是一個集群世界的新手,那Kubernetes是一個很棒的開始。它可以用最快的、最簡單的、最輕量級的方式來解決你的問題,並幫助你進行面向集群的開發。它提供了一個高水平的可移植方案,因為很多廠商已經開始支持Kubernetes,例如微軟、IBM、Red Hat、CoreOS、MesoSphere、VMWare等。
  2. 如果你擁有已經存在的工作任務(Hadoop、Spark、Kafka等),那Mesos可以給你提供了一個將不同工作任務相互交錯的框架,然後還可以加入一些新的東西,比如Kubernetes應用。
  3. 如果你想使用的功能Kuberntes還沒實現,那Mesos是一個不錯的替代品,畢竟它已經成熟。


Kubernetes(通常縮寫為K8S)是容器編排平台。

Kubernetes提供了支持複雜容器應用程序所需的一切。對於開發人員和運營人員來說,這是最便捷,最受歡迎的框架,幾乎所有組織的DevOps團隊都廣泛使用它。

Kubernetes對計算機集群而言,就像操作系統對計算機而言。

為了方便管理和服務發現,Kubernetes將組成一個應用程序的容器分組為邏輯單元。這對於微服務應用程序特別有用。

儘管Kubernetes在Linux上運行,但它與平台無關,可以在裸機,虛擬機,雲實例或OpenStack上運行。最新版本的Kubernetes已經支持在Windows上運行。

Kubernetes集群中的計算機或節點分為控制平面和工作負載平面。

Kubernetes 集群架構

Kubernetes集群由分為兩組的節點組成:

  • 一組master節點,它們承載著控制平面組件,它們是系統的大腦,因為它們控制著整個集群。
  • 一組構成工作負載平面的工作節點,工作負載(或應用程序)在此運行。

這兩個平面共同組成了Kubernetes集群。

Kubernetes Master 節點

這是Kubernetes控制面板或控制平面。這裡做出有關集群的決策,例如調度和檢測/響應集群事件。master伺服器的組件可以在集群中的任何節點上運行。以下是每個關鍵組件的細分:

  • API Server
  • 集群數據存儲 (etcd)
  • Controller Manager
  • Scheduler
  • Dashboard (可選)

讓我們逐一討論這些組件。

API Server

這是Kubernetes控制面板中唯一用戶可訪問的API的組件,並且是你將與之交互的唯一主組件。 API Server公開了一個restful的Kubernetes API,並使用了JSON清單文件。

Kubernetes API Server公開了RESTful Kubernetes API。使用集群和其他Kubernetes組件的工程師通過此API創建對象。

集群數據存儲

Kubernetes使用ETCD作為數據存儲。這是一個一致性且高可用的鍵值存儲,用於持久存儲所有API對象。

由於API Server本身是無狀態的,因此etcd分散式數據存儲將持久保存通過API創建的對象。API Server 是與etcd通信的唯一組件。

Controller Manager

kube-controller manager,它運行所有處理集群中任務的控制器。這些包括節點控制器,副本控制器,端點控制器以及服務帳戶和secret控制器。這些控制器中的每一個都單獨工作以維持所需狀態。

控制器使你通過API創建的對象按照想要的狀態運行。它們中的大多數僅創建其他對象,但是有些還與外部系統通信(例如,通過其API的雲提供商)。

Scheduler

調度程序監視新創建的Pod(一個或多個容器的組),並將其分配給節點。

調度程序決定每個應用程序實例應在哪個工作程序節點上運行。

master節點和工作節點的組件之間就是這樣進行交互的。

Kubernetes 工作節點

master節點處理和管理集群,而工作節點運行容器並提供Kubernetes運行時環境。

主要組件有:

  • Kubelet
  • Container runtime
  • Kube-proxy

讓我們逐一討論這些組件。

Kubelet

工作節點包含一個kubelet。這是主要的節點代理。它監視API伺服器以查找已分配給其節點的Pod。 Kubelet執行任務並維護向主節點報告pod狀態的反向通道。

Kubelet是與API Server進行對話並管理在其節點上運行的應用程序的代理。它通過API報告這些應用程序和節點的狀態。

Container Runtime

每個pod內都有容器,kubelet通過Docker運行這些容器(拉取鏡像,啟動和停止容器等)。它還定期執行任何請求的容器活動性探測。它支持Docker和CRI-O等。

容器運行時,可以是Docker或與Kubernetes兼容的任何其他運行時。它按照Kubelet的指令在容器中運行你的應用程序。

Kube-proxy

這是節點的網路大腦,負責維護主機上的網路規則並執行連接轉發。它還負責服務中所有Pod的負載平衡。

Kubernetes服務代理(Kube-proxy)對應用程序之間的網路流量進行負載平衡。

附加組件

大多數Kubernetes集群還包含其他幾個組件。這包括DNS伺服器,網路插件,日誌記錄代理等。

它們通常在工作節點上運行,但也可以配置為在master節點上運行。


作為一個開源項目,Kubernetes 的發展速度之快著實令人咋舌。發布至今,2 年時間,Kubernetes 在 GitHub 上的活躍度就已經超過了 99.99% 的項目。這短短的兩年間,到底發生了什麼?可預見的未來里,Kubernetes 又會扮演怎樣的角色?

如何學習、了解kubernetes? - 極客時間的回答 - 知乎

如何學習、了解kubernetes??

www.zhihu.com圖標

kubernetes源於Google的Borg系統,Borg是一個分散式容器集群管理平台,在Google內部使用10多年,承載海量的Google線上業務,架構、性能都在業內有廣泛聲譽。Kubernetes可以看作Borg用Go語言重寫,和Borg一脈相承,所以Kubernetes一經推出便廣受業界推崇,現在已經是容器集群管理系統的業界標杆。


這篇博客[1]里的那倆漫畫很精髓,這篇[2]也講的很好

簡單來說就是資料庫(etcd)增刪改查,用戶可以聲明各種高級工作對象(Deployment,Service,ReplicaSet,Job等等),然後寫到etcd里。一堆服務都盯著etcd的特定數據類型的變化呢(通過list watch機制,通過chunk get一個資源實現[3])。

比如,

1,用戶調Rest api 說起個ReplicaSet,然後api server響應請求,把結果寫到etcd里

2,controller manager一看,我去,etcd里這有個ReplicaSet,那我就得建N個Pod吧,寫etcd里。

3,Scheduler一看,我去,etcd里有新的沒Node的Pod,來活了,跑一下分配演算法,這幾個Pod就寫到XXX node去吧,寫etcd里

4,kubelet一看,我去,etcd里寫著我這個node上要起個Pod啊,來活了,起Pod起Pod,起完了把狀態寫etcd里

(以上寫etcd操作都是通過api server提供的介面實現的

[1] https://jvns.ca/blog/2017/06/04/learning-about-kubernetes/

[2] http://dockone.io/article/1538

[3]https://kubernetes.io/docs/reference/using-api/api-concepts/#efficient-detection-of-changes


重複回答不提了,如果你想要故障恢復快速啟動容器,那你用mesos和馬拉松,如果你想要更合理的任務編排和配合springcloud,那就用kubernetes,各有各的好。。。看哪個方便

一樓的網易雲的回答已經比較全面了,我這裡稍微做下補充

根據提主的問題,應該是對Mesos已經有了了解,沒錯,kubernetes和mesos都可以成為調度引擎,但是調度引擎只是它們中的一部分功能,更重要的在於其他的功能,比如kubernetes中的容器編排,網路引擎,存儲引擎,微服務間如何通訊等等。

這裡推薦一個大牛的關於容器技術的微信公眾號

http://weixin.qq.com/r/TxPp8cDE5Z2arYSS90Zd (二維碼自動識別)


1. 自動進行iptables設置2. 實現了一個RR的負載均衡演算法。從而實現多Replicas的部署。
其實也差不多,官方(Kubernetes by Google)說法是:

Kubernetes is an open source orchestration system for Docker containers. It handles scheduling onto nodes in a compute cluster and actively manages workloads to ensure that their state matches the users declared intentions. Using the concepts of "labels" and "pods", it groups the containers which make up an application into logical units for easy management and discovery.


推薦閱讀:
相关文章