假設現在有五颱機器,我們給其中的三颱安裝了mysql,那麼這三颱機器上就有了mysql的服務程序,我們把三個服務程序叫做k8s的乙個service。在實際的應用中,通過在一台機器上部署多個docker例項來達到這種效果。
然後給service貼個標籤,比如起個名字「mysql_***」。那麼,在k8s容器中,它就是唯一確定的乙個服務,也就是k8s的乙個pod物件,我們通過虛擬ip+埠號的方式可以訪問到這個servidce。k8s通過貼標籤的方式實現了應用間的隔離。
在k8s內部,service的服務程序通過socket通訊的方式對外提供服務。所以,k8s服務一定是實現了某個具體業務的tcp程序。
即使在使用的過程中,某個服務程序掛掉了或者重啟了,或者轉移到了其他的機器上,都不會影響我們對服務的正常呼叫,因為這個service本身一單建立就不會再變化了,我們也不用為了服務ip位址的變化而頭疼了。
k8s將集群中的機器劃分為乙個master節點和一堆工作節點node,在建立好rc後,k8s會通過rc中定義的label篩選出對應的pod例項並實施監控器狀態和數量。如果例項數量少於定義的副本數量,則會根據rc中定義的pod模板來建立乙個新的pod,然後將pod排程到合適的node上啟動執行,直到pod例項的數量達到預定目標,這個過程完全是自動化。其中,master節點執行著集群管理相關的一組程序kube-api-server、kube-controller-mananger和kube-scheduler,這些程序實現了整個集群的資源管理、pod排程,彈性伸縮、安全控制、系統監控和糾錯等管理能力,並且都是全自動完成的。
node作為集群中的乙個工作及誒單那,執行真正的應用程式,在node上k8s管理的最小執行單元是pod。node上執行著k8s的kubelet、kube-proxy服務程序,這些服務程序負責pod的建立、啟動、監控、重啟、銷毀以及實現軟體模式的負載均衡器。
k8s的管理節點,負責管理集群,提供集群的資料訪問入口,擁有etcd儲存服務(可選)。執行api server程序,controller
manager服務程序及scheduler服務程序,關聯工作及節點node。
kubernetes api server**:提供http
rest介面的關鍵服務程序,是kubernetes裡所有資源的增刪改查等操作的唯一入口,也是集群控制的入口程序。
kubernetes controller manager**:是kubernetes controllernode是kubernetes集群架構中執行pod的服務及誒點。node是kubernetes集群操作的單元,用來成單被分配pod的執行,是pod的宿主機。關聯master管理節點,擁有名稱和ip,系統資源資訊。執行docker engine服務,守護程序kunelet以及負載均衡器kube-proxy。manager是kuberbetes所有資源物件的自動化控制中心;
kubernetes schedule**:是負責資源排程的(pod排程)程序。
kubelet:服務隊pod對於容器的建立,啟停等任務;node節點可以在執行期間動態增加到kubernetes集群中,預設情況下,kubelete會向master註冊自己,這也是kubernetes推介的node管理方式,kubelet程序會定時向master匯報自身情報,如作業系統,docker版本,cpu和記憶體,以及哪些pod在執行等等,這樣master可以在獲知每個node及誒點的資源使用情況,並實現高效負載均衡的資源排程策略。kube-proxy:實現kubernetes
service的通訊與負載均衡的重要元件; docker engine(docker):負責本機容器的建立和管理工作。
執行在node節點上,若干相關容器的組合。pod內包含的容器執行在同一宿主機上,使用相同的網路命名空間,ip位址和埠,能夠通過localhost進行通訊。pod是kubernetes進行建立,排程和管理的最小單位,他提供了比容器更高層次的抽象,使得部署和管理更加靈活。乙個pod可以包含乙個容器或者多個相關容器。
pod其實有兩種型別,普通pod和靜態pod,後者比較特殊,它並不存在kubernetes村村中,而是存在在某個具體的node上的具體檔案,並且只在此node上啟動。普通pod一單被建立,就會被放入etcd儲存中,隨後會被kubernetes master排程到某個具體的node上進行繫結,隨後改pod對應的node上的kubelet程序例項化成一組相關的docker容器並啟動起來。在預設情況下,當pod裡某個容器停止時,kubernetes會自動檢測到這個問題並且重啟這個pod(重啟pod裡所有程序)。如果pod所在的node宕機,則會將這個node上的所有pod重新排程到其他節點上。
repplication controller用來管理pod的副本,保證集群中uc妮子啊指定數量的pod副本。集群中副本數量大於指定數量,則會停止多餘容器數量。反之,則會啟動少於指定數量個數的容器。保證數量不便,repplication controller是實現彈性繩索,動態擴容和滾動公升級的核心。
service定義了pod的邏輯接和訪問該集合的策略,是真實服務的抽象。service提供了乙個統一的服務訪問入口以及服務**和發現機制,關聯多個相同label的pod。使用者不需要了解後台pod是如何執行。
外部系統訪問service的問題,需要弄明白kubernetes的三種ip問題:
首先,node ip是kubernetes集群中節點的物理網絡卡ip位址。所有屬於這個網路ode伺服器之間都你能通過這風格網路直接通訊。
pod ip是每個pod的ipo位址,它是docker enhine根據docker網橋的up位址段進行分配的,通常是虛擬二層網路。
cluster ip是乙個虛擬ip,更像乙個偽造的ip網路。
kubernetes中的任意api物件都是通過label進行標識,label的實質是一系列的key/value鍵值對,其中key於value由使用者自己指定。label可以附加在各種資源物件上,如node、pod、service、rc等,乙個資源物件可以定義任意數量的label,同乙個label也可以被新增到任意數量的資源物件上去。label是replication controller和service執行的基礎,二者通過label來進行關聯node上執行的pod。
我們可以通過給指定的資源物件**乙個或者多個不同的label來實現多維度的資源分組管理功能,以便於靈活、方便的進行資源分配、排程、配置等管理工作。
一些常用的label如下:
版本標籤:"release":"stable","release":"canary"......
環境標籤:"environment":"dev","environment":"qa","environment":"production"
架構標籤:"tier":"frontend","tier":"backend","tier":"middleware"
分割槽標籤:"partition":"customera","partition":"customerb"
質量管控標籤:"track":"daily","track":"weekly"
label相當於我們熟悉的標籤,給某個資源物件定義乙個label就相當於給它大了乙個標籤,隨後可以通過label selector(標籤選擇器)查詢和篩選擁有某些label的資源物件,kubernetes通過這種方式實現了類似sql的簡單又通用的物件查詢機制。
kube-controller程序通過資源物件rc上定義label selector來篩選要監控的pod副本的數量,從而實現副本數量始終符合預期設定的全自動控制流程
kube-proxy程序通過service的label selector來選擇對應的pod,自動建立起每個service島對應pod的請求**路由表,從而實現service的智慧型負載均衡
通過對某些node定義特定的label,並且在pod定義檔案中使用nodeselector這種標籤排程策略,kuber-scheduler程序可以實現pod」定向排程「的特性。
k8s命令學習筆記
發布 replicationcontroller.yaml到kubernetes集群中命令 master節點執行 kubectl create f mysql.yaml 檢視 kubectl get rc kubectl get pods nodes services ex.kubectl desc...
K8S學習總結(一)
kubernetes是容器集群管理系統,是乙個開源的平台,可以實現容器集群的自動化部署 自動化擴縮容 維護等功能。master元件可以再集群中任何節點上執行,通常將所有master元件執行於一台伺服器上,並且不會在該伺服器上執行任何使用者容器。kube apiserver用於提供資源請求 呼叫介面 ...
雜亂筆記 k8s
k8s中 1.排程 etcd kubectl 以及資源都要呼叫api server 2.資源排程機制 listwatch 隨時監控節點加入刪除,新pod的 原有節點加標籤 觸發creatset 3.建立應用 service demoset satefulset 補充 無狀態應用,比如 3個pod服務...