Kubernetes是什麼:針對容器編排的一種分佈式架構,是自動化容器操做的開源平臺。node
服務發現、內建負載均衡、強大的故障發現和自我修復機制、服務滾動升級和在線擴容縮容、資源自動調度機制、多粒度的資源配額管理能力,包括開發、測試、部署、運維監控,一站式的完備的分佈式系統開發和支撐平臺.python
(1) Master 控制節點 apache
1.Api Server:爲集羣的核心組件,主要負責集羣各功能模塊之間的通訊,集羣內的功能模塊經過Api server將信息存入到分佈式文件系統etcd中與其餘節點進行信息交互。 2.Scheduler:負責集羣的資源調度,跟蹤集羣中全部Node的資源利用狀況,對新建立的pod,採起合適的調度策略,進行均衡的調度到合適的節點上。 3.Controller Manager:主要負責集羣的故障檢測和恢復的自動化,它內部的組件以下: a.endpointController:按期關聯service和pod,關聯信息由endpoint負責建立和更新。 b.ReplicationController:完成pod的複製或移除,以確保ReplicationController定義的複本數量與實際運行pod的數量一致性
(2) Node 節點api
集羣中的工做主機,Node能夠是物理主機,也能夠是虛擬機,包含如下組件: 1.kubelet:運行在每一個Node節點上,kubelet會經過api service 註冊節點自身信息,用於master發現節點,它會按期從etcd獲取分配到本機的pod,並根據pod信息啓動或中止相應的容器,並按期向master節點彙報節點資源的使用狀況,內部集成cadvise來監控容器和節點資源。 2.Kube Proxy:負責爲pod提供代理。它會按期從etcd獲取全部的service,並根據service信息建立代理。當某個客戶pod要訪問其餘pod時,訪問請求會通過本機proxy作轉發。
(1) pod概念tomcat
Pod是一個邏輯概念,它是Kubernetes資源調度的單元,通常會把一組功能強相關的容器邏輯上稱之爲一個pod,Pod就是所說的實例。做爲一個邏輯概念,pod自己沒有資源,pod中的容器具備資源,建立pod,能夠經過定義pod模塊。
[pod狀態]bash
Pending 容器還沒有啓動成功,它包括從pod被建立到調度、而後到拉鏡像開始部署這個過程 Running 容器啓動成功 Succeeded 容器退出,返回碼是0,而且容器不會再被從新啓動 Failed 容器異常退出 Unknown 狀態未知,獲取不到容器的狀態,當出現異常時會有這種狀態,例如pod所在的機器故障,或者pod所在的機器上
{ "kind": "Pod",(資源類型) "apiVersion": "v1", (資源版本) "metadata": { "name": "app-tomcat", (名字,惟一) "namespace": "default", (命名空間默認default) "labels": { "name": "app-tomcat" (label作爲標識,能夠跟RC,Service關聯對應) } }, "spec": { "containers": [ { "name": "app-tomcat", (自定義鏡像名稱) "image": "tomcat", (要拉取的鏡像) "command": [ (運行容器時,要運行的命令) "/bin/bash", "/opt/apache-tomcat-7.0.57/bin/catalina.sh", "run" ], "env": [ (環境變量K,V) { "name": "url_addr", "value": "http://192.168.54.66:8080/paas/jsp/index.jsp" } ], "resources": { (對容器資源限制) "limits": { "cpu": "1", "memory": "1073741824" }, "requests": { "cpu": "100m", "memory": "104857600" } }, "imagePullPolicy": "Always" (獲取鏡像策略Always,Never,IfNotPresent) } ], "restartPolicy": "Always", (pod重啓策略,Always,OnFailure,Never) "dnsPolicy": "ClusterFirst", "nodeSelector": { (選擇將該pod調度到包含這些label的Node上) "group": "node1" } } }
(2) ReplicationControllersession
ReplicationController(簡稱rc)是pod的複製抽象,用於解決pod的擴容縮容問題。一般,分佈式應用爲了性能或高可用性的考慮,須要複製多份資源,而且根據負載狀況動態伸縮。
經過replicationController,咱們能夠指定一個應用須要幾份複製,Kubernetes將爲每份複製建立一個pod,而且保證明際運行pod數量老是與該複製數量相等(例如,當前某個pod宕機時,自動建立新的pod來替換)。
RC中selector設置一個label,去關聯pod的label,selector的label與pod的label相同,那麼該pod就是該rc的一個實例;RC中Replicas設置副本數大小,系統根據該值維護pod的副本數
{ "kind": "ReplicationController", "apiVersion": "v1", "metadata": { "name": "app-tomcat", "namespace": "default", "labels": { "name": "app-tomcat" } }, "spec": { "replicas": 2(副本數), "selector": { "name": "app-tomcat(選擇的pod的label)" }, "template": { "metadata": { "labels": { "name": "app-tomcat(pod的label)" } }, "spec": { "containers": [ { "name": "kaifa2-group-tomcat", "image": "192.168.54.64:5000/tomcat-248:V1.0", "command": [ "/bin/bash", "/opt/apache-tomcat-7.0.57/bin/catalina.sh", "run" ], "env": [ { "name": "url_addr", "value": "http://192.168.54.64:8080/paas/jsp/index.jsp" } ], "resources": { "limits": { "cpu": "1", "memory": "1073741824" }, "requests": { "cpu": "100m", "memory": "104857600" } }, "imagePullPolicy": "Always" } ], "restartPolicy": "Always", "nodeSelector": { "group": "node1" } } } } }
(3) Service架構
service是pod的路由代理抽象,用於解決pod之間的服務發現問題,即上下游pod之間使用的問題。傳統部署方式中,實例所在的主機ip(或者dns名字)通常是不會改變的,可是pod的運行狀態可動態變化(好比容器重啓、切換機器了、縮容過程當中被終止了等),
因此訪問端不能以寫死IP的方式去訪問該pod提供的服務。service的引入旨在保證pod的動態變化對訪問端透明,訪問端只須要知道service的地址,由service來提供代理。
{ "kind": "Service", "apiVersion": "v1", "metadata": { "name": "tomcat-yefp", "namespace": "default", "labels": { "name": "tomcat-yefp" } }, "spec": { "ports": [ { "protocol": "TCP", "port": 8080(訪問端口), "targetPort": 8080 } ], "selector": { "name": "app-tomcat(選擇的pod的label)" }, "type": "ClusterIP", "sessionAffinity": "None" } }
(4) EndPoint
app
Endpoint是可被訪問的服務端點,即一個狀態爲running的pod,它是service訪問的落點,只有service關聯的pod纔可能成爲endpoint。 Endpoint、service和pod的關係: