Kubernetes各个组件的概念
前言
Kubernetes中的概念太多了, 什么Pod Service Deployment 等等等等, 給剛接觸的我都整蒙了. 通過(guò)幾天觀察下來(lái), 說(shuō)一下我對(duì)各個(gè)組件的理解.
此文章僅僅對(duì)這些概念做一個(gè)簡(jiǎn)單的介紹, 不至于后面看其他文章的時(shí)候一頭霧水.
Node
Node很好理解. 就是服務(wù)實(shí)際運(yùn)行的實(shí)例, 可以是一臺(tái)物理機(jī), 也可以是一臺(tái) VM 虛擬機(jī)
Pod
docker都用過(guò)了吧, 就是容器. 而Pod其實(shí)就類似于docker-composer, 多個(gè)的相關(guān)聯(lián)的容器組成了一個(gè) Pod. 比如有一個(gè)nginx容器和一個(gè)php-fpm的容器, 他們兩個(gè)就可以組合為一個(gè)Pod`.
在同一個(gè)Pod中, 不同容器共享網(wǎng)絡(luò)棧與存儲(chǔ)卷. 也就是說(shuō), nginx訪問(wèn)php-fpm可以直接使用localhost:9000即可, 也就是說(shuō), 一個(gè)Pod中啟動(dòng)兩個(gè)容器, 都占用80端口, 是無(wú)法成功啟動(dòng)的. 共享是通過(guò)Pause容器實(shí)現(xiàn)的, 這里只簡(jiǎn)單介紹概念, 不展開(kāi)了.
Pod 控制器
在Kubernetes中, Pod是資源的最小單位了. 而這一堆控制器, 就是用來(lái)對(duì)Pod進(jìn)行自動(dòng)管理的.當(dāng)然, 如果不使用控制器而是手動(dòng)管理也不是不行, 就是累唄. 比如:
- 管理Pod的數(shù)量
- 實(shí)現(xiàn)Pod的彈性伸縮
- 監(jiān)控Pod的狀態(tài)
- 定時(shí)啟動(dòng)并釋放Pod
- 等等
為了實(shí)現(xiàn)不同的需求, 出現(xiàn)了不同的Pod控制器. 以下控制器只是實(shí)現(xiàn)了不同的需求, 簡(jiǎn)單過(guò)一下即可.
ReplicationController
對(duì)Pod數(shù)量進(jìn)行管理. 確保Pod數(shù)量保持在用戶定義的數(shù)量. (若容器異常退出, 自動(dòng)創(chuàng)建新的 Pod. 若數(shù)量多了, 也會(huì)自動(dòng)回收. ) 不過(guò)現(xiàn)在建議使用 ReplicaSet替代了.
ReplicaSet
和ReplicationController的功能差不多, 額外增加了集合式selector的支持(標(biāo)簽選擇器).
雖然ReplicaSet可以單獨(dú)使用, 但建議用Deployment進(jìn)行管理.
Deployment
Deployment不會(huì)直接管理Pod, 而是通過(guò)管理ReplicaSet, 再經(jīng)有ReplicaSet管理Pod.
Deployment處理了很多ReplicaSet不支持的額外操作. 如:
- rolling-update (滾動(dòng)更新) 和回滾
- 自動(dòng)伸縮(擴(kuò)容和縮容)
- 暫停和繼續(xù)
- 等等
順帶說(shuō)一下, Deployment的熱更新, 就是通過(guò)新建一個(gè)ReplicaSet, 逐漸減少原來(lái)ReplicaSet中Pod數(shù)量并增加新ReplicaSet中Pod數(shù)量來(lái)實(shí)現(xiàn)的. 回滾就是反過(guò)來(lái)嘛.
HorizontalPodAutoscaler
HPA也不會(huì)直接管理Pod, 而是管理Deployment或者ReplicaSet.
HPA可以檢測(cè)Pod資源使用率, 可以實(shí)現(xiàn)這樣的場(chǎng)景: 當(dāng)Pod CPU 使用率大于80則自動(dòng)新建, 否則自動(dòng)釋放. 同時(shí)啟動(dòng)的Pod數(shù)量最多30個(gè), 最少5個(gè). 既實(shí)現(xiàn)服務(wù)的水平擴(kuò)展.
StatefulSet
StatefulSet是為了解決有狀態(tài)服務(wù)的. 上面的控制器都是無(wú)狀態(tài)的. StatefulSet可以實(shí)現(xiàn)如下功能:
- 穩(wěn)定的持久化存儲(chǔ). 當(dāng)Pod動(dòng)態(tài)調(diào)整后能夠訪問(wèn)到相同的持久化數(shù)據(jù). 基于PVC實(shí)現(xiàn)
- 穩(wěn)定的網(wǎng)絡(luò)標(biāo)識(shí). Pod動(dòng)態(tài)調(diào)整后 PodName HostName不變. 基于Headless Service實(shí)現(xiàn).
- 有序部署. 既前一個(gè)Pod啟動(dòng)成功, 才會(huì)創(chuàng)建下一個(gè)Pod. 解決服務(wù)依賴的問(wèn)題. 基于init containers實(shí)現(xiàn).
- 有序刪除. 有序部署的反向操作.
DeamonSet
可以確保所有(或指定的一部分)Node都運(yùn)行一個(gè)Pod副本. 當(dāng)新Node加入集群時(shí)自動(dòng)新增對(duì)應(yīng)的Pod, 當(dāng)Node從集群移除時(shí), 對(duì)應(yīng)的Pod也會(huì)被回收.
這種運(yùn)行在Node中的Pod有什么用呢? 比如資源監(jiān)控, 再比如日志收集等等.
Job
批處理任務(wù). kubernetes可以保證此任務(wù)的一個(gè)或多個(gè)Pod成功結(jié)束, 若任務(wù)失敗, kubernetes會(huì)自動(dòng)重啟, 直到成功.
CronJob
Job的crontab版本. 基于時(shí)間管理的Job. 是通過(guò)在特定時(shí)間創(chuàng)建Job實(shí)現(xiàn)的. 可以在指定時(shí)間運(yùn)行一次任務(wù), 或者周期性的在指定時(shí)間運(yùn)行.
服務(wù)發(fā)現(xiàn)及負(fù)載均衡
Service
Pod控制器只是對(duì)Pod的管理, 比如在一個(gè)Deployment中運(yùn)行了5個(gè)Pod, 如果外部訪問(wèn)Pod服務(wù)時(shí)寫(xiě)的是每一個(gè)Pod的地址, 當(dāng)Pod動(dòng)態(tài)伸縮的時(shí)候, 維護(hù)這些地址就是一個(gè)讓人頭大的問(wèn)題了.
而Service就是為了解決這個(gè)問(wèn)題而出現(xiàn)的. 它為一組Pod提供了一個(gè)統(tǒng)一對(duì)外的接口, 外部訪問(wèn)Service再經(jīng)有Service將請(qǐng)求發(fā)給Pod, 而不需要關(guān)心Pod的數(shù)量、啟動(dòng)、釋放等等。
同時(shí)Service還能夠?qū)α髁窟M(jìn)行負(fù)載均衡
Ingress
因?yàn)镾ervice是四層負(fù)載均衡, 也就是說(shuō)只能代理到 IP 層, 無(wú)法實(shí)現(xiàn)像nginx一樣根據(jù)不同域名不同路徑進(jìn)行負(fù)載均衡. 為了解決這個(gè)問(wèn)題而提出了Ingress, Ingress是獨(dú)立與其他服務(wù)對(duì)請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)的. 可以將其理解為Service的Service.
一般來(lái)說(shuō), 通過(guò)Service對(duì)Pod進(jìn)行內(nèi)部代理, 然后通過(guò)Ingress將請(qǐng)求轉(zhuǎn)發(fā)給Service. Ingress也有不同的實(shí)現(xiàn), 而其中比較常用的就是ingress-nginx了,其配置文件類似與nginx. 由官方維護(hù)的. 啟動(dòng)命令為:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml
官方文檔: https://kubernetes.github.io/ingress-nginx/
存儲(chǔ)卷
這個(gè)需求就很普遍了, 用來(lái)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)及掛載服務(wù). 在不同的容器、以及不同的pod中進(jìn)行共享.
具體的使用方式可見(jiàn): https://hujingnb.com/archives/709
ConfigMap
專門用于存儲(chǔ)配置文件, 同時(shí)還支持二進(jìn)制內(nèi)容. 將文件內(nèi)容直接寫(xiě)入到y(tǒng)aml配置中. 同時(shí), ConfigMap是支持熱更新的.
Secret
存儲(chǔ)一些需要加密的信息, 比如密鑰、密碼等. 其基本上和ConfigMap差不多, 區(qū)別就是在ConfigMap的基礎(chǔ)上對(duì)內(nèi)容做了一次加密. 不過(guò)不過(guò), 現(xiàn)階段Secret的加密方式就是base64? 這也叫加密? 只能算作編碼吧.
可以通過(guò)命令: kubectl get secrets secret-name -o yaml查看內(nèi)容.
不過(guò), 社區(qū)后續(xù)應(yīng)該會(huì)推出更安全的加密策略.
另外, 對(duì)于私有的鏡像倉(cāng)庫(kù), Secret可以添加拉取鏡像時(shí)的鑒權(quán)信息.
volume
在同一個(gè)pod下的多個(gè)容器之間共享存儲(chǔ)卷, 就跟磁盤的掛載差不多啦. volume沒(méi)有單獨(dú)的kind, 是直接進(jìn)行定義的.
如上, 對(duì)Kubernetes中的各個(gè)名稱進(jìn)行了簡(jiǎn)單介紹, 再回去看其他文章, 是不是清楚多了. 全部都是對(duì)容器的各個(gè)方面各個(gè)層次的管理.
原文鏈接: https://hujingnb.com/archives/706
總結(jié)
以上是生活随笔為你收集整理的Kubernetes各个组件的概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: bootstrap上传图片可实现查看上一
- 下一篇: msflexgrid允许大选择_特大型矿