
k8s卷管理
k8s和docker默認(rèn)使用本地的主機(jī)磁盤
容器卷生命周期
在資源短缺下,k8s可能會停止容器,在相同或另一個(gè)k8s節(jié)點(diǎn)上重新啟動(dòng)容器
Pod內(nèi)共享卷
k8s中通一個(gè)Pod的多個(gè)容器可以共享相同IP地址、網(wǎng)絡(luò)端口和IPC,程序間可以通過localhost網(wǎng)絡(luò)相互通信,但文件系統(tǒng)是相互隔離的
示例:同個(gè)Pod中Tomcat和Nginx容器,可以通過localhost互相通信,但不能訪問彼此的配置文件

無狀態(tài)和有狀態(tài)程序
無狀態(tài)應(yīng)用程序中使用臨時(shí)卷,容器上應(yīng)用程序不需要保留數(shù)據(jù)
示例:通過k8s中的emptydir卷共享日志文件

有狀態(tài)應(yīng)用會使用持久卷,如ES,即使容器重新啟動(dòng)也必須保留數(shù)據(jù)
不需要在相同pod中配置ES容器,ES可獨(dú)立擴(kuò)展
Kubernetes持久卷和動(dòng)態(tài)配置
Persistent Volumne(PV),如AWS EBS、Google Persisten Disk
支持網(wǎng)絡(luò)(分布式)文件系統(tǒng),如NFS、ClusterFS、Ceph
還支持塊設(shè)備,如iSCSI和FC
持久卷抽象層聲明
直接將持久卷指定到配置文件中,與特定基礎(chǔ)設(shè)施構(gòu)成緊耦合
從容器角度,pod定義不應(yīng)鎖定到特定環(huán)境,基礎(chǔ)設(shè)施因環(huán)境而異,理想pod應(yīng)該是靈活的抽象的,僅指定卷名和掛載點(diǎn)
k8s提供抽象層,在pod和持久卷之間關(guān)聯(lián),稱為持久卷聲明 persistent volume claim,PVC,使基礎(chǔ)設(shè)施被分離出來,k8s管理員只需預(yù)先分配所需容量的持久卷,然后k8s將綁定持久卷和PVC

動(dòng)態(tài)配置和存儲類型
PVC為持久卷管理提供靈活性,但是預(yù)分配持久卷池不具備成本效益,尤其公有云
k8s通過支持持久卷的動(dòng)態(tài)配置dynamics provision來改善這種情況
k8s管理員定義持久卷provisioner,稱為存儲類storageClass,持久卷聲明要求storageClass動(dòng)態(tài)分配持久卷,后將其與PVC關(guān)聯(lián)

使用狀態(tài)集(StatefulSet)管理具有持有卷的Pod
狀態(tài)集和持久卷組合功能強(qiáng)大,可以使應(yīng)用程序變得更靈活,從而更方便進(jìn)行擴(kuò)展
狀態(tài)集涵蓋了Pod和持久卷之間的綁定,當(dāng)Pod擴(kuò)展或收縮時(shí),將同時(shí)創(chuàng)建或刪除Pod和持久卷
Pod的創(chuàng)建過程是串行的,如當(dāng)請求k8s擴(kuò)展另外兩個(gè)StatefulSet時(shí),k8s先創(chuàng)建持久卷聲明1和po1,再創(chuàng)建持久卷聲明2和pod2

即使一個(gè)pod已銷毀,狀態(tài)集也會保留pod的位置(名稱、IP、相關(guān)metadata)及持久卷,然后嘗試重新創(chuàng)建一個(gè)容器,重新分配到同一個(gè)pod并掛載相同的持久卷
可幫助控制Pod、持久卷的數(shù)量,同時(shí)通過Scheduler保證應(yīng)用程序始終在線

具有持久卷的狀態(tài)集需要?jiǎng)討B(tài)配置和存儲類,狀態(tài)集時(shí)刻擴(kuò)展的,添加pod時(shí),k8s需要知道如何配置持久卷
持久卷示例
ES集群
ES使用多個(gè)節(jié)點(diǎn)來構(gòu)建集群,有不同類型的節(jié)點(diǎn),如master、data、coordinate,每個(gè)節(jié)點(diǎn)在集群中有不同的角色和職責(zé),相應(yīng)的k8s配置和持久卷應(yīng)與之保持一致
示例:ES節(jié)點(diǎn)組件和角色
ES主節(jié)點(diǎn):唯一,其他節(jié)點(diǎn)需要指向它進(jìn)行注冊,使用statefulSet分配固定的DNS名稱
ES備份節(jié)點(diǎn):主節(jié)點(diǎn)的備用節(jié)點(diǎn),擴(kuò)展StatefulSet來分配,無需另外創(chuàng)建k8s對象
ES數(shù)據(jù)節(jié)點(diǎn):負(fù)責(zé)存儲數(shù)據(jù),如有更大的數(shù)據(jù)量或更多查詢請求,使用StatefulSet和持久卷進(jìn)行橫向擴(kuò)展,不需要DNS名稱,不需要為ES數(shù)據(jù)節(jié)點(diǎn)創(chuàng)建服務(wù)
ES協(xié)調(diào)節(jié)點(diǎn):負(fù)責(zé)負(fù)載均衡,需要水平擴(kuò)展以處理更多來自外部的HTTP流量,并不需要對數(shù)據(jù)持久保存,可以將復(fù)制集ReplicaSet與服務(wù)結(jié)合使用,對外暴露HTTP接口

Kubernetes資源管理
資源服務(wù)質(zhì)量(QoS)
可以關(guān)注管理員按不同優(yōu)先級分配和管理容器
根據(jù)Pod設(shè)置,按優(yōu)先級將pod分為三類:Guaranteed Pod->Burstable Pod->BestEffort Pod
配置BestEffort Pod
QoS中最低優(yōu)先級,資源短缺下,該類Pod將首先被終止(資源限制設(shè)置為0或不指定)
BestEffort Pod常用于無狀態(tài)和可恢復(fù)的應(yīng)用程序,如worker進(jìn)程、代理或緩存節(jié)點(diǎn)
配置Guaranteed Pod
QoS中最高優(yōu)先級,資源短缺下,k8s調(diào)度器會長期保障該類容器到最后
用來運(yùn)行關(guān)鍵任務(wù),如帶持久卷的后端數(shù)據(jù)庫、主節(jié)點(diǎn)
需要將資源限制和資源請求顯示設(shè)置為相同值,或僅設(shè)置資源限制
如不確定應(yīng)用程序所需CPU和內(nèi)存資源,可先試用Burstable類型觀察一段時(shí)間
配置Burstable Pod
資源限制配置不是強(qiáng)制性的,當(dāng)節(jié)點(diǎn)資源充足時(shí),pod可以盡可能的消耗CPU和內(nèi)存
任何類型的應(yīng)用都可以使用
如已知道應(yīng)用程序最小內(nèi)存大小,可指定請求資源,有助于k8s調(diào)度器分配正確的節(jié)點(diǎn)
QoS顆粒度是Pod級別而不是容器級別,如具有兩個(gè)容器的Pod,容器A容器GB配置B,則選B
資源使用監(jiān)控
如資源不足,Pod可能無法由k8s調(diào)度器進(jìn)行部署
kubectl describe nodes可以查看分配資源
如節(jié)點(diǎn)已運(yùn)行了Burstable Pod配置,但沒資源分配,則不用執(zhí)行該pod,需要k8s節(jié)點(diǎn)提供更多資源