在瞭解Kubernetes應用狀態部署前,咱們先看看Kubernetes的高級架構,方便更好的理解Kubernetes的狀態。數據庫
Kubernetes 的高級架構服務器
包括應用程序部署模型,服務發現和負載均衡,內部/外部路由分離、persistentvolume 的使用,部署節點守護程序,部署有狀態分佈式系統,做業後臺運行,部署數據庫,配置管理,憑證管理,滾動更新,自動縮放和包管理。網絡
A、Kubernetes的基本設計策略之一就是,無需更改應用程序代碼,就能部署在虛擬機上運行的現有應用程序。另外,任何運行在虛擬機上的應用程序均可以經過容器化組件在 Kubernetes 上實現部署。這是經過容器分組、容器編排、覆蓋網絡、基於第 4 層虛擬IP、服務發現、支持守護程序運行、部署有狀態應用程序組件、以及擴展容器編排系統這些核心功能實現的。架構
B、Kubernetes 能夠提供一組可動態擴展的主機,能夠應用容器運行 workload,並使用一組稱爲 master 的管理主機來提供管理整個容器基礎架構的 API。這些 workload 包括長期運行服務,批處理做業和容器主機的守護程序。爲了提供容器到容器的路由,全部容器主機都用覆蓋網絡鏈接在一塊兒。部署在 Kubernetes 上的應用程序在集羣網絡中是動態可見的,並可經過傳統負載均衡器向外部網絡暴露。集羣管理器的狀態存儲在一個高度分佈的 key/value 存儲(etcd)中,該存儲在 master上運行。負載均衡
Kubernetes應用狀態部署分佈式
在K8s運行的服務,分爲無狀態服務和有狀態服務,下面分別看看K8s是如何運行這兩類不一樣的服務的微服務
01大數據
「無狀態」服務插件
無狀態服務,即 Web 服務器、代理和應用程序代碼這樣的應用程序,它們能夠處理數據但不進行存儲。編排過程當中,開發者比較喜歡使用它們,由於它們易於部署且易於擴展。若是流量上升,則只需添加更多的負載平衡。更重要的是,它們是「不變更的」;上游容器鏡像和基礎架構中正在運行的容器其實幾乎沒有區別。這意味着它們能夠隨時被替代,並且容器實例切換過程當中幾乎不須要耗費「切換成本」。設計
無狀態服務,K8s使用Replicaset來保證一個服務的實例數量,若是說某個Pod實例因爲某個緣由被crash了,RC會當即用一個Pod的模板新啓一個Pod來替代它,因爲是無狀態的服務,新啓的Pod與原來健康狀態下的Pod是如出一轍。當Pod被重建後它的IP地址可能發生變化,爲了對外提供一個穩定的訪問接口,K8s引入了Service的概念,一個Service後面能夠掛多個Pod,實現服務的高可用。
在Kubernetes中,Deployment和Replicasets都是運用無狀態服務的有效手段。
02
「有狀態」服務
有狀態的服務,即路由器、CDN(內容傳送網絡)、streaming 服務器和認證服務器。從部署開始,這些容器就開始與上游鏡像不一樣了,時間越長它們的差別越大。這種差別就被稱爲「state(狀態)」。事實上,每一個運行的應用程序都至少有一個小狀態(差別),但對於「無狀態」應用程序來講,狀態(差別)很小,並且能夠進行快速替換。
普通有狀態服務,和無狀態服務相比,它多了狀態保存的需求,K8s提供了以Volmume和Peristent Volmume爲基礎的存儲系統,能夠實現服務的狀態保存。
而在容器化應用程序最困難的任務之一,就是設計有狀態分佈式組件的部署體系結構。因爲無狀態組件可能沒有預約義的啓動順序、集羣要求、點對點 TCP 鏈接、惟一的網絡標識符、正常的啓動和終止要求等,所以能夠很容易地進行容器化。諸如數據庫,大數據分析系統,分佈式 key/value 存儲和 message brokers 可能有複雜的分佈式體系結構,均可能用到上述功能。
Kubernetes 引入了 StatefulSets 資源來支持這種複雜的需求,用來管理POD部署和擴容,併爲這些pod提供順序和惟一性的保證。
03
StatefulSet部署—有狀態應用
用於解決各個pod實例獨立生命週期管理,提供各個實例的啓動順序和惟一性。
使用StatefulSet的前提是:
一、Kubernetes集羣的版本≥1.5;
二、安裝好DNS集羣插件,版本≥15。
StatefulSet爲何適合有狀態的程序,看看它的特性:
A、穩定,惟一的網絡標識符。能夠發現集羣內部的其餘成員。
B、穩定的持久化存儲。經過Kubernetes的PV/PVC或者外部存儲(預先提供)來實現。
C、啓動或關閉時有序。有序的,優雅的部署和擴展。有序,優雅的刪除和終止。有序的自動滾動更新。實現部署和擴容保證。
04
運用StatefulSet會帶來什麼好處呢?
部署和擴容的保證
對於帶有N個副本集的StatefulSet,當pod被部署,它們將按0到N-1的順序被建立。
當一Pod被刪除時,它們將按照N-1到0的順序被終止。
在進行Pod擴容前,全部依賴的Pod應該都已在運行和準備好。
在Pod被終止前,全部的依賴它的Pod都必須徹底中止。
若是你的系統是微服務構成的生態系統,就會比較繁瑣的交付新服務,若是更近一步,服務是有狀態的,那麼kubernetes的自動化和健壯性特性會對你有很大的幫助,StatefulSet的目的就是給衆多的有狀態負載提供正確的控制器支持。