kubernetes是一個容器編排開源軟件,它能夠輕鬆高效管理由千上萬的主機組成的集羣,並提供容器部署運行的環境。node
kubernetes最初由Google開發和設計,前身是Borg系統,Google有成千上萬的容器運行在上面,主要幫忙Google實現簡化開發和管理,而且提供基礎設施的資源利用率。再內部穩定運行Borg數十年之久後,隨着容器化的大流行,2014年Google開源了kubernetes,一個基於Borg和其它內部系統的開源系統。2015年,Google將kubernetes項目捐贈給了CNCF(雲原生計算基金會)。nginx
1,kubernetes基於Google內部的Borg系統實現,有着長達數十年之久的穩定大規模運行實踐經驗。
2,Kubernetes提供的是一個平臺,不是解決方案,實現容器化應用程序的一次編寫並在各種型雲基礎設施上運行,它將公有云與私有云之間存在的複雜的基礎設施差別抽象化掉了。
3,社區活躍多極高,在全部競爭對手中遙遙領先docker
1,安裝部署比較麻煩
2,只能用於容器的編排管理後端
kubernetes能夠被認爲是一個集羣的操做系統,它提供了注入服務發現,擴容,負載均衡,自恢復,選舉等功能,使開發者不用關心基礎設施相關的服務而能夠把心思都集中再應用實現自己。服務器
kubernetes能夠將容器化的應用運行在集羣的任何主機上,並保證應用組之間的通訊和運行,而且可以自動實現根據主機資源使用狀況的自動調度,最大化資源利用率。網絡
做爲管理集羣狀態的Master節點,它主要負責接收客戶端的請求,安排容器的執行而且運行控制循環,將集羣的狀態向目標狀態進行遷移,Master 節點內部由三個組件構成:API Server,Controller控制器,Scheduler 調度器。架構
主要由kubelet和kube-proxy兩部分組成,它主要負責Node節點的全部管理操做。負載均衡
Pod是Kubernetes中最基本的概念,它也是Kubernetes對象模型中咱們能夠建立或者部署的最小而且最簡單的單元。框架
它將應用的容器、存儲資源以及獨立的網絡IP地址等資源打包到了一塊兒,表示一個最小的部署單元,可是每個pod中的運行的容器可能不止一個,這是由於pod最開始設計時就可以在多個進程之間進行協調,構建一個高內聚的服務單元,這些容器可以共享存儲和網絡,很是方便地進行通訊。運維
API Server負責處理來自用戶的請求,其主要做用就是對外提供 RESTful的接口,包括用於查看集羣狀態的讀請求以及改變集羣狀態的寫請求。它是Kubernetes的中心組建,其它組件都會與其交互,她使用etcd作存儲。
客戶端經過建立到API Server的HTTP鏈接來監聽變動,經過此鏈接,客戶端會接收到監聽對象的一系列變動通知。每當更新對象,服務器把新版本對象發送至全部監聽該對象的客戶端。
kubernetes Service服務是一種爲一組功能相同的pod提供單一不變的接入點的資源。當服務存在時,它的IP地址和端口不會改變,默認提供集羣內ip的訪問。 客戶端經過服務的IP地址和端口號創建鏈接,服務收到請求後從對應的Endpoint資源中查找後端pod地址和端口,而後將這些鏈接路由到提供該服務的任意一個pod上。經過這種方式,客戶端不須要知道每一個單獨的提供服務的pod的地址,這樣這些pod就能夠在集羣中隨時被建立或移除。
Service資源提供兩種方法使集羣外部客戶端訪問k8s內部服務:
1,將服務的類型設置成NodePort,這樣每一個集羣節點都會在節點上監聽一個端口,這個端口會將接收到的流量重定向到基礎服務。該基礎服務僅在內部集羣IP和端口上纔可訪問。
2,將服務的類型設置成LoadBalance(爲NodePort的變種)這使得服務能夠經過一個專用的負載均衡器來訪問。負載均衡器將流量重定向到集羣節點上監聽的端口,這個端口會將接收到的流量重定向到基礎服務。客戶端經過負載均衡器的IP鏈接到服務。
用於部署應用程序並以聲明的方式升級應用,爲pod和ReplicaSet控制器提供描述性的更新方式,當建立一個Deployment時, ReplicaSet資源也會隨之建立。使用Deployment能夠更容易地更新 應用程序,由於能夠直接定義單個Deployment資源所需達到的狀態,並讓Kubenetes處理中間的狀態。
Ingress資源提供集羣外部客戶端訪問k8s內部服務功能,它工做再7層,能實現Service資源不能實現的功能。當客戶端向Ingress發送HTTP請求時,能夠經過 Ingress 配置提供外部可訪問的 URL、負載均衡、SSL、基於名稱的虛擬主機等,相似於7層代理。
1,客戶端執行dns查找查找到Ingress控制器的ip。
2,客戶端像Ingress控制器發送http請求。
3,控制器從http請求的host中肯定訪問的具體Service資源,而後再查找到該資源的Endport對象,從而獲取pod地址和端口。
4,Ingress控制器把請求轉發給選定的pod。
Satefulset資源用於管理有狀態的應用,能使pod擁有穩定的網絡資源和獨立的存儲,還它可以保證這些 Pod 的順序性和惟一性等。
用於存放pod中應用的配置,本質是一個鍵值對映射,值能夠是短字符,也能夠是完整的配置文件。
kubelet是一個節點上的主要服務,它監聽API Server 接受新的或者修改的pod規範而且保證節點上的pod和其中容器的正常運行,還會保證節點會向目標狀態遷移,該節點仍然會向Master 節點發送宿主機的健康情況。其實,就是負責全部運行在工做節點上內容的組件。
運行在各個節點上的代理服務kube-proxy負責宿主機的子網管理,同時也能將服務暴露給外部,其原理就是在多個隔離的網絡中把請求轉發給正確的pod或者容器。
運行在kubernetes主節點,利用API Server的監聽機制等待新建立的pod,若是監聽到有新建立pod,則根據策略配置和節點資源使用狀況等等爲pod分配節點。
運行在kubernetes主節點,用於建立和管理pod 的實例,可以在集羣的層級提供複製、發佈以及健康檢查的功能。每一個控制器都鏈接到API Server進行監聽更新,每一個控制器之間不相互通訊。主要的控制器有以下:
ReplicationController控制器確保在任什麼時候候都有配置的數量的pod副本處於運行狀態,如今已經處於廢棄狀態,被ReplicaSet控制器所取代。
ReplicaSet控制器是下一代的Replication控制器,ReplicaSet和Replication的惟一區別是選擇器的支持。ReplicaSet支持新的基於集合的選擇器需求,功能更強大,而Replication控制器僅支持基於相等選擇器的需求。主要管理無狀態的應用。
DaemonSet控制器確保所有(或者某些)節點上只運行一個Pod的副本。當有節點加入集羣時,也會爲他們新增一個Pod。當有節點從集羣移除時,這些Pod也會被回收。刪除DaemonSet將會刪除它建立的全部 Pod。主要管理無狀態的應用。
若是須要在每一個節點上運行日誌收集程序和資源監控器則使用DaemonSet很是合適。
相似於crontab,它容許你運行一種pod,該pod在內部進程成功結束時,不重啓容器。一旦任務完成,pod就被認爲處於完成狀態。
Deployment控制器負責使deployment資源的實際狀態與對應Deployment API對象的指望狀態同步。Deployment經過建立ReplicaSet來按照定義的策略來管理pod。
用於管理運行有狀態的應用,例如分佈式應用每一個實例須要單獨固定的存儲,固定的ip等。
而爲了使用Ingress功能,就須要運行一個Ingress控制器,能夠用nginx提供Ingress控制器功能。若是Ingress控制器壓力太大,能夠擴容成多臺,而後經過給Ingress控制器前添加LB來作負載均衡,外部客戶端經過訪問負載均衡的VIP來訪問業務。
用於管理node資源,使節點對象列表於集羣中實際運行的機器列表保持同步,同事監控每一個節點的監控狀態,刪除不可達pod。
用於LoadBalancer類型的服務被建立或者刪除時,從基礎設施請求或者釋放負載均衡器。
主要用於維護Service管理的pod的ip和端口。Endpoint控制器按期根據匹配標籤選擇器的pod的ip,端口更新端點列表。
用於根據用戶請求,來建立或者刪除命名空間中的資源。
用於根據持久卷聲明來找到合適的持久捲進行綁定或者解綁。
Cloud Native Computing Foundation(雲原生計算基金會)主要有Docker,Google,CoreOS等重要的容器技術廠商發起成立,主要做用是推廣雲原生技術,造成社區,開源項目管理與推動生態系統健康發展。雲原生技術有利於各組織在公有云、私有云和混合雲等新型動態環境中,構建和運行可彈性擴展的應用。雲原生的表明技術包括容器、服務網格、微服務、不可變基礎設施和聲明式API。
Docker Compose是一個基於Docker Engine進行安裝的Python工具。 該工具使得用戶能夠在一個聲明式的配置文件中定義一個多容器的應 用,並經過一個簡單的命令完成部署。Compose文件能夠是YAML或JSON格式,其中定義了全部的容器、網絡、卷以及應用所需的密碼。docker-compose命令行工具會解析該文件,並調用Docker來執行部署。
Docker-Compose只能管理當前主機上的Docker,解決主機本地Docker容器編排問題。
Docker Swarm是一個基於Docker引擎之上的容器編排軟件。相似於kubernetes,它也能夠輕鬆高效管理大規模主機組成的集羣,並提供容器部署運行的環境。目前,和kubernetes的PK中處於下風。
Mesos是一個遵循Apache協議的開源項目,是一個集羣管理工具,能夠將整個數據中心的資源(包括CPU、內存、存儲、網絡等)進行抽象和調度,使得多個應用同時運行在集羣中分享資源,並沒有需關心資源的物理分佈狀況。
Mesos是以與Linux內核一樣的原則而建立的,不一樣點僅僅是在於抽象的層面。Mesos內核運行在每個機器上,同時經過 API 爲各類應用提供跨數據中心和雲的資源管理調度能力。這些應用包括Hadoop、Spark、Kafka、Elastic Search,Cassandra等。還可配合框架Marathon來管理大規模的Docker等容器化應用。目前,主要用於大數據相關場景。
https://www.redhat.com/zh/topics/containers/what-is-kubernetes
https://draveness.me/understanding-kubernetes/