1 回答

TA貢獻(xiàn)1946條經(jīng)驗 獲得超4個贊
我們先從整體上看一下Kubernetes的一些理念和基本架構(gòu), 然后從網(wǎng)絡(luò)、 資源管理、存儲、服務(wù)發(fā)現(xiàn)、負(fù)載均衡、高可用、rolling upgrade、安全、監(jiān)控等方面向大家簡單介紹Kubernetes的這些主要特性。
當(dāng)然也會包括一些需要注意的問題。主要目的是幫助大家快速理解 Kubernetes的主要功能,今后在研究和使用這個具的時候有所參考和幫助。
1.Kubernetes的一些理念:
用戶不需要關(guān)心需要多少臺機(jī)器,只需要關(guān)心軟件(服務(wù))運(yùn)行所需的環(huán)境。以服務(wù)為中心,你需要關(guān)心的是api,如何把大服務(wù)拆分成小服務(wù),如何使用api去整合它們。
保證系統(tǒng)總是按照用戶指定的狀態(tài)去運(yùn)行。
不僅僅提給你供容器服務(wù),同樣提供一種軟件系統(tǒng)升級的方式;在保持HA的前提下去升級系統(tǒng)是很多用戶最想要的功能,也是最難實現(xiàn)的。
那些需要擔(dān)心和不需要擔(dān)心的事情。
更好的支持微服務(wù)理念,劃分、細(xì)分服務(wù)之間的邊界,比如lablel、pod等概念的引入。
對于Kubernetes的架構(gòu),可以參考官方文檔。
大致由一些主要組件構(gòu)成,包括Master節(jié)點(diǎn)上的kube-apiserver、kube-scheduler、kube-controller-manager、控制組件kubectl、狀態(tài)存儲etcd、Slave節(jié)點(diǎn)上的kubelet、kube-proxy,以及底層的網(wǎng)絡(luò)支持(可以用Flannel、OpenVSwitch、Weave等)。
看上去也是微服務(wù)的架構(gòu)設(shè)計,不過目前還不能很好支持單個服務(wù)的橫向伸縮,但這個會在 Kubernetes 的未來版本中解決。
2.Kubernetes的主要特性
會從網(wǎng)絡(luò)、服務(wù)發(fā)現(xiàn)、負(fù)載均衡、資源管理、高可用、存儲、安全、監(jiān)控等方面向大家簡單介紹Kubernetes的這些主要特性 -> 由于時間有限,只能簡單一些了。
另外,對于服務(wù)發(fā)現(xiàn)、高可用和監(jiān)控的一些更詳細(xì)的介紹,感興趣的朋友可以通過這篇文章了解。
1)網(wǎng)絡(luò)
Kubernetes的網(wǎng)絡(luò)方式主要解決以下幾個問題:
a. 緊耦合的容器之間通信,通過 Pod 和 localhost 訪問解決。
b. Pod之間通信,建立通信子網(wǎng),比如隧道、路由,F(xiàn)lannel、Open vSwitch、Weave。
c. Pod和Service,以及外部系統(tǒng)和Service的通信,引入Service解決。
Kubernetes的網(wǎng)絡(luò)會給每個Pod分配一個IP地址,不需要在Pod之間建立鏈接,也基本不需要去處理容器和主機(jī)之間的端口映射。
注意:Pod重建后,IP會被重新分配,所以內(nèi)網(wǎng)通信不要依賴Pod IP;通過Service環(huán)境變量或者DNS解決。
2) 服務(wù)發(fā)現(xiàn)及負(fù)載均衡
kube-proxy和DNS, 在v1之前,Service含有字段portalip 和publicIPs, 分別指定了服務(wù)的虛擬ip和服務(wù)的出口機(jī)ip,publicIPs可任意指定成集群中任意包含kube-proxy的節(jié)點(diǎn),可多個。portalIp 通過NAT的方式跳轉(zhuǎn)到container的內(nèi)網(wǎng)地址。在v1版本中,publicIPS被約定廢除,標(biāo)記為deprecatedPublicIPs,僅用作向后兼容,portalIp也改為ClusterIp, 而在service port 定義列表里,增加了nodePort項,即對應(yīng)node上映射的服務(wù)端口。
DNS服務(wù)以addon的方式,需要安裝skydns和kube2dns。kube2dns會通過讀取Kubernetes API獲取服務(wù)的clusterIP和port信息,同時以watch的方式檢查service的變動,及時收集變動信息,并將對于的ip信息提交給etcd存檔,而skydns通過etcd內(nèi)的DNS記錄信息,開啟53端口對外提供服務(wù)。大概的DNS的域名記錄是servicename.namespace.tenx.domain, "tenx.domain"是提前設(shè)置的主域名。
注意:kube-proxy 在集群規(guī)模較大以后,可能會有訪問的性能問題,可以考慮用其他方式替換,比如HAProxy,直接導(dǎo)流到Service 的endpints 或者 Pods上。Kubernetes官方也在修復(fù)這個問題。
3)資源管理
有3 個層次的資源限制方式,分別在Container、Pod、Namespace 層次。Container層次主要利用容器本身的支持,比如Docker 對CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等的支持;Pod方面可以限制系統(tǒng)內(nèi)創(chuàng)建Pod的資源范圍,比如最大或者最小的CPU、memory需求;Namespace層次就是對用戶級別的資源限額了,包括CPU、內(nèi)存,還可以限定Pod、rc、service的數(shù)量。
資源管理模型 -》 簡單、通用、準(zhǔn)確,并可擴(kuò)展
目前的資源分配計算也相對簡單,沒有什么資源搶占之類的強(qiáng)大功能,通過每個節(jié)點(diǎn)上的資源總量、以及已經(jīng)使用的各種資源加權(quán)和,來計算某個Pod優(yōu)先非配到哪些節(jié)點(diǎn),還沒有加入對節(jié)點(diǎn)實際可用資源的評估,需要自己的scheduler plugin來支持。其實kubelet已經(jīng)可以拿到節(jié)點(diǎn)的資源,只要進(jìn)行收集計算即可,相信Kubernetes的后續(xù)版本會有支持。
4)高可用
主要是指Master節(jié)點(diǎn)的 HA方式 官方推薦 利用etcd實現(xiàn)master 選舉,從多個Master中得到一個kube-apiserver 保證至少有一個master可用,實現(xiàn)high availability。對外以loadbalancer的方式提供入口。這種方式可以用作ha,但仍未成熟,據(jù)了解,未來會更新升級ha的功能。
一張圖幫助大家理解:
也就是在etcd集群背景下,存在多個kube-apiserver,并用pod-master保證僅是主master可用。同時kube-sheduller和kube-controller-manager也存在多個,而且伴隨著kube-apiserver 同一時間只能有一套運(yùn)行。
5) rolling upgrade
RC 在開始的設(shè)計就是讓rolling upgrade變的更容易,通過一個一個替換Pod來更新service,實現(xiàn)服務(wù)中斷時間的最小化?;舅悸肥莿?chuàng)建一個復(fù)本為1的新的rc,并逐步減少老的rc的復(fù)本、增加新的rc的復(fù)本,在老的rc數(shù)量為0時將其刪除。
通過kubectl提供,可以指定更新的鏡像、替換pod的時間間隔,也可以rollback 當(dāng)前正在執(zhí)行的upgrade操作。
同樣, Kuberntes也支持多版本同時部署,并通過lable來進(jìn)行區(qū)分,在service不變的情況下,調(diào)整支撐服務(wù)的Pod,測試、監(jiān)控新Pod的工作情況。
6)存儲
大家都知道容器本身一般不會對數(shù)據(jù)進(jìn)行持久化處理,在Kubernetes中,容器異常退出,kubelet也只是簡單的基于原有鏡像重啟一個新的容器。另外,如果我們在同一個Pod中運(yùn)行多個容器,經(jīng)常會需要在這些容器之間進(jìn)行共享一些數(shù)據(jù)。Kuberenetes 的 Volume就是主要來解決上面兩個基礎(chǔ)問題的。
Docker 也有Volume的概念,但是相對簡單,而且目前的支持很有限,Kubernetes對Volume則有著清晰定義和廣泛的支持。其中最核心的理念:Volume只是一個目錄,并可以被在同一個Pod中的所有容器訪問。而這個目錄會是什么樣,后端用什么介質(zhì)和里面的內(nèi)容則由使用的特定Volume類型決定。
創(chuàng)建一個帶Volume的Pod:
spec.volumes 指定這個Pod需要的volume信息 spec.containers.volumeMounts 指定哪些container需要用到這個Volume Kubernetes對Volume的支持非常廣泛,有很多貢獻(xiàn)者為其添加不同的存儲支持,也反映出Kubernetes社區(qū)的活躍程度。
emptyDir 隨Pod刪除,適用于臨時存儲、災(zāi)難恢復(fù)、共享運(yùn)行時數(shù)據(jù),支持 RAM-backed filesystemhostPath 類似于Docker的本地Volume 用于訪問一些本地資源(比如本地Docker)。
gcePersistentDisk GCE disk - 只有在 Google Cloud Engine 平臺上可用。
awsElasticBlockStore 類似于GCE disk 節(jié)點(diǎn)必須是 AWS EC2的實例 nfs - 支持網(wǎng)絡(luò)文件系統(tǒng)。
rbd - Rados Block Device - Ceph
secret 用來通過Kubernetes API 向Pod 傳遞敏感信息,使用 tmpfs (a RAM-backed filesystem)
persistentVolumeClaim - 從抽象的PV中申請資源,而無需關(guān)心存儲的提供方
glusterfs
iscsi
gitRepo
根據(jù)自己的需求選擇合適的存儲類型,反正支持的夠多,總用一款適合的 :)
7)安全
一些主要原則:
基礎(chǔ)設(shè)施模塊應(yīng)該通過API server交換數(shù)據(jù)、修改系統(tǒng)狀態(tài),而且只有API server可以訪問后端存儲(etcd)。
把用戶分為不同的角色:Developers/Project Admins/Administrators。
允許Developers定義secrets 對象,并在pod啟動時關(guān)聯(lián)到相關(guān)容器。
以secret 為例,如果kubelet要去pull 私有鏡像,那么Kubernetes支持以下方式:
通過docker login 生成 .dockercfg 文件,進(jìn)行全局授權(quán)。
通過在每個namespace上創(chuàng)建用戶的secret對象,在創(chuàng)建Pod時指定 imagePullSecrets 屬性(也可以統(tǒng)一設(shè)置在serviceAcouunt 上),進(jìn)行授權(quán)。
認(rèn)證 (Authentication)
API server 支持證書、token、和基本信息三種認(rèn)證方式。
授權(quán) (Authorization)
通過apiserver的安全端口,authorization會應(yīng)用到所有http的請求上
AlwaysDeny、AlwaysAllow、ABAC三種模式,其他需求可以自己實現(xiàn)Authorizer接口。
8)監(jiān)控
比較老的版本Kubernetes需要外接cadvisor主要功能是將node主機(jī)的container metrics抓取出來。在較新的版本里,cadvior功能被集成到了kubelet組件中,kubelet在與docker交互的同時,對外提供監(jiān)控服務(wù)。
Kubernetes集群范圍內(nèi)的監(jiān)控主要由kubelet、heapster和storage backend(如influxdb)構(gòu)建。Heapster可以在集群范圍獲取metrics和事件數(shù)據(jù)。它可以以pod的方式運(yùn)行在k8s平臺里,也可以單獨(dú)運(yùn)行以standalone的方式。
注意: heapster目前未到1.0版本,對于小規(guī)模的集群監(jiān)控比較方便。但對于較大規(guī)模的集群,heapster目前的cache方式會吃掉大量內(nèi)存。因為要定時獲取整個集群的容器信息,信息在內(nèi)存的臨時存儲成為問題,再加上heaspter要支持api獲取臨時metrics,如果將heapster以pod方式運(yùn)行,很容易出現(xiàn)OOM。所以目前建議關(guān)掉cache并以standalone的方式獨(dú)立出k8s平臺。
- 1 回答
- 0 關(guān)注
- 1789 瀏覽
添加回答
舉報