今晚20:30,Kubernetes Master Class在線培訓(xùn)第五期《Kubernetes中的日志、監(jiān)控與告警》即將開(kāi)播,點(diǎn)擊http://live.vhall.com/317569561 即可免費(fèi)預(yù)約注冊(cè)!
Kubernetes是一個(gè)開(kāi)源的容器編排框架,它為我們提供了一種簡(jiǎn)單的部署、擴(kuò)展和監(jiān)控的方法。在本文中,我們將討論Kubernetes的內(nèi)置監(jiān)控功能。為了便于讀者更好地理解,本文包含了一些演示。
創(chuàng)新互聯(lián)服務(wù)緊隨時(shí)代發(fā)展步伐,進(jìn)行技術(shù)革新和技術(shù)進(jìn)步,經(jīng)過(guò)十年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計(jì)師、專業(yè)的網(wǎng)站實(shí)施團(tuán)隊(duì)以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對(duì)網(wǎng)站進(jìn)行網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、建設(shè)、維護(hù)、更新和改版,實(shí)現(xiàn)客戶網(wǎng)站對(duì)外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。在基礎(chǔ)架構(gòu)級(jí)別,Kubernetes集群是一組各自發(fā)揮特定功能的物理機(jī)或虛擬機(jī)。充當(dāng)主要角色的物理機(jī)或虛擬機(jī)負(fù)責(zé)整個(gè)操作,并協(xié)調(diào)在所有node上運(yùn)行的容器管理。
Master組件管理pod的生命周期:
apiserver:為所有其他master組件公開(kāi)API的主組件
scheduler:負(fù)責(zé)依照pod規(guī)范中的信息來(lái)決定pod應(yīng)該運(yùn)行在哪個(gè)node上
controller-manager:負(fù)責(zé)node管理(檢測(cè)node是否出現(xiàn)故障)、pod復(fù)制和endpoint創(chuàng)建
etcd:用于存儲(chǔ)所有內(nèi)部集群數(shù)據(jù)的鍵/值存儲(chǔ)
Node組件是Kubernetes中由master管理的worker機(jī)器。每個(gè)node都包含運(yùn)行pod所需的必要組件:
kubelet:處理master及其上運(yùn)行的node之間的所有通信。它與容器運(yùn)行時(shí)配合,負(fù)責(zé)部署和監(jiān)控容器
kube-proxy:負(fù)責(zé)維護(hù)node的網(wǎng)絡(luò)規(guī)則,還負(fù)責(zé)處理pod、node和外部之間的通信。
容器運(yùn)行時(shí):在node上運(yùn)行容器。
從邏輯角度看,一個(gè)Kubernetes部署,是由在集群中各自發(fā)揮作用的各個(gè)組件組成:
Pod:Kubernetes內(nèi)部的基本部署單位。一個(gè)pod由一個(gè)或多個(gè)容器組成,這些容器共享網(wǎng)絡(luò)命名空間和IP地址。
Service:充當(dāng)負(fù)載均衡器。它們?cè)诔兀ㄒ唤Mpod)之前提供IP地址,且還提供控制訪問(wèn)IP地址的策略。
ReplicaSet:由deployment控制,負(fù)責(zé)確保deployment所需數(shù)量的pod都正常運(yùn)行。
Namespace(命名空間):為pod或service等不同類型的資源定義邏輯隔離。
Metadata:根據(jù)容器的部署特征對(duì)容器進(jìn)行標(biāo)記。
若我們想要預(yù)測(cè)問(wèn)題并發(fā)現(xiàn)開(kāi)發(fā)或部署中潛在的瓶頸,那么對(duì)應(yīng)用程序進(jìn)行監(jiān)控是必不可少的。
為了幫助監(jiān)控集群和構(gòu)成部署的許多活動(dòng)組件,Kubernetes提供了一些內(nèi)置的監(jiān)控功能:
Kubernetes dashboard:為集群上運(yùn)行的資源提供一個(gè)概覽。它還提供了一種非?;镜牟渴鹨约芭c這些資源進(jìn)行交互的方法。
cAdvisor:一種用于監(jiān)控資源使用情況并分析容器性能的開(kāi)源代理。
Liveness和Readiness Probe:主動(dòng)監(jiān)控容器的健康情況。
Horizontal?Pod Autoscaler:基于通過(guò)分析不同指標(biāo)所收集的信息,根據(jù)需要增加pod的數(shù)量。
在本文中,我們將重點(diǎn)介紹前兩個(gè)內(nèi)置工具。在本系列文章的下一篇中,我們將介紹其他的監(jiān)控工具。
Kubernetes中有許多指標(biāo)需要監(jiān)控。正如我們會(huì)以兩種不同的方式(基礎(chǔ)架構(gòu)和邏輯)描述架構(gòu)那樣,我們也可以將監(jiān)控分為兩個(gè)主要組件:監(jiān)控集群本身以及集群上運(yùn)行的工作負(fù)載監(jiān)控。
集群監(jiān)控
所有集群都應(yīng)監(jiān)控底層服務(wù)器組件,因?yàn)榉?wù)器層的問(wèn)題往往都會(huì)出現(xiàn)在工作負(fù)載中。監(jiān)控node資源時(shí)要注意的一些指標(biāo)包括CPU、磁盤(pán)和網(wǎng)絡(luò)帶寬。了解這些指標(biāo)可以讓我們知道是否需要對(duì)集群進(jìn)行擴(kuò)容或縮容(如果企業(yè)使用的是云提供商,對(duì)運(yùn)行成本很看重,那么這一點(diǎn)更尤其重要)。
工作負(fù)載監(jiān)控
我們還需要考慮與部署及其pod相關(guān)的指標(biāo)。其中重要的一點(diǎn),是將deployment中當(dāng)下運(yùn)行的pod數(shù)量與期望的數(shù)量進(jìn)行對(duì)比。此外,我們還應(yīng)當(dāng)注意健康檢查、容器指標(biāo)以及最終的應(yīng)用指標(biāo)。
在以下部分中,我們將以demo的形式逐一介紹列出的內(nèi)置監(jiān)控功能,為此我們需要做的前期準(zhǔn)備有:
谷歌云平臺(tái)帳戶:使用免費(fèi)試用版的即可,若你使用的是其他的主流云平臺(tái),操作方法也是類似的。
用于運(yùn)行Rancher的主機(jī):可以是個(gè)人PC / Mac或公有云中的VM。
谷歌云SDK:應(yīng)與運(yùn)行Rancher的主機(jī)上的kubectl一起安裝。通過(guò)使用你的憑據(jù)進(jìn)行身份驗(yàn)證(gcloud init和gcloud auth login),確保gcloud可以訪問(wèn)你的谷歌云帳戶。
啟動(dòng)Rancher實(shí)例
第一步,啟動(dòng)Rancher實(shí)例。Rancher有一份非常直觀的入門(mén)指南可供參考:https://rancher.com/quick-start/
使用Rancher部署GKE集群
按照操作指南,使用Rancher設(shè)置和配置Kubernetes集群:
https://rancher.com/docs/rancher/v2.x/en/cluster-provisioning/hosted-kubernetes-clusters/gke/
注意:請(qǐng)確保已啟用Kubernetes Dashboard,我們這里使用的Kubernetes 版本為v.1.10。
Kubernetes dashboard是基于Web的Kubernetes用戶界面,我們可以使用它來(lái)對(duì)應(yīng)用程序進(jìn)行故障排除并管理集群資源。
而Rancher,能幫助用戶一鍵安裝dashboard。dashboard的主要用途包括:
對(duì)集群資源進(jìn)行概述(包括整體情況和每個(gè)node的情況),顯示所有命名空間,列出定義的所有存儲(chǔ)類
顯示集群上運(yùn)行的所有應(yīng)用程序
提供關(guān)于集群中Kubernetes資源狀態(tài)以及可能出現(xiàn)的任何錯(cuò)誤的信息
要訪問(wèn)dashboard,我們需要在我們的計(jì)算機(jī)和Kubernetes API服務(wù)器之間代理請(qǐng)求。輸入以下代碼即可使用kubectl啟動(dòng)代理服務(wù)器:
代理服務(wù)器將在后臺(tái)啟動(dòng),輸出類似于下文的內(nèi)容:
現(xiàn)在,要查看dashboard,請(qǐng)通過(guò)瀏覽器訪問(wèn)以下地址:
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
然后,我們需要在登錄頁(yè)面輸入相應(yīng)的憑據(jù):
下面我們將來(lái)了解如何使用服務(wù)帳戶機(jī)制,創(chuàng)建具有管理員權(quán)限的用戶。我們將使用兩個(gè)YAML文件。
一個(gè)YAML文件用于創(chuàng)建服務(wù)帳戶:
另一個(gè)YAML文件將為我們的用戶創(chuàng)建ClusterRoleBinding:
應(yīng)用兩個(gè)YAML文件,來(lái)創(chuàng)建其定義的對(duì)象:
創(chuàng)建用戶并設(shè)置了正確的權(quán)限后,我們需要找到令牌才能登錄:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
在Kubernetes dashboard憑據(jù)提示中選擇“Token(令牌)”,然后在字段中輸入你在上面檢索的值以進(jìn)行身份驗(yàn)證。
Kubernetes Dashboard包含幾個(gè)主要視圖:
管理視圖:列出了node、命名空間和持久卷以及其他詳細(xì)信息。我們可以獲得node的集成頁(yè)面(CPU和內(nèi)存使用情況)以及每個(gè)node的單獨(dú)詳細(xì)信息頁(yè)面,顯示其指標(biāo)、規(guī)范、狀態(tài)、分配的資源和pod。
工作負(fù)載視圖:顯示了在選定的命名空間中運(yùn)行的所有應(yīng)用程序??偨Y(jié)了關(guān)于工作負(fù)載的重要信息,例如StatefulSet或部署中準(zhǔn)備好的pod數(shù)量或pod的當(dāng)前內(nèi)存使用情況。
服務(wù)發(fā)現(xiàn)和負(fù)載均衡視圖:顯示了向外部公開(kāi)服務(wù)的Kubernetes資源,并在集群內(nèi)啟用服務(wù)發(fā)現(xiàn)。
配置和存儲(chǔ)視圖:顯示了應(yīng)用程序使用的持久卷聲明資源。配置視圖顯示了用于在集群中運(yùn)行的應(yīng)用程序?qū)崟r(shí)配置的所有Kubernetes資源。
在沒(méi)有任何工作負(fù)載運(yùn)行的情況下,dashboard頁(yè)面將為空,因?yàn)榇藭r(shí)在Kubernetes上不會(huì)部署任何內(nèi)容。如果要瀏覽 dashboard提供的所有視圖,最佳選擇是部署使用不同工作負(fù)載類型的應(yīng)用程序(StatefulSet、部署、副本集等)。這篇如何在Kubernetes上部署Redis的文章就是一個(gè)很好的示例,它展示了部署一個(gè)Redis集群(具有卷聲明和configMaps的有狀態(tài)集)和一個(gè)測(cè)試應(yīng)用程序(一個(gè)Kubernetes部署)時(shí),dashboard會(huì)如何顯示相關(guān)信息。
配置完工作負(fù)載后,我們可以關(guān)閉一個(gè)node,然后檢查不同的選項(xiàng)卡,以查看一些更新:
cAdvisor是一個(gè)集成到kubelet二進(jìn)制文件中的開(kāi)源代理,主要用于監(jiān)控資源使用情況并分析容器的性能。cAdvisor會(huì)收集關(guān)于在給定node上運(yùn)行的所有容器的CPU、內(nèi)存、文件和網(wǎng)絡(luò)使用情況的統(tǒng)計(jì)信息(cAdvisor不在pod層運(yùn)行)。除核心指標(biāo)外,cAdvisor還會(huì)監(jiān)控事件。用戶可以使用諸如kubectl top之類的命令直接訪問(wèn)指標(biāo),也可以使用調(diào)度程序執(zhí)行調(diào)度層的指標(biāo)(例如使用autoscaling)。
需要注意的是,cAdvisor不會(huì)長(zhǎng)期存儲(chǔ)某些指標(biāo),因此如果需要使用該功能,則應(yīng)尋找專用的監(jiān)控工具。
從Kubernetes版本1.10起,cAdvisor的UI已經(jīng)差不多被棄用了,Kubernetes 1.12版本之后cAdvisor的UI會(huì)被徹底刪除。Rancher可以讓你選擇用于集群的Kubernetes版本。在為此演示設(shè)置基礎(chǔ)架構(gòu)時(shí),我們將集群配置為使用版本1.10,因此我們?nèi)匀豢梢栽L問(wèn)cAdvisor UI。
要訪問(wèn)cAdvisor UI,我們需要在我們的計(jì)算機(jī)和Kubernetes API服務(wù)器之間進(jìn)行代理。輸入以下命令啟動(dòng)代理服務(wù)器的本地實(shí)例:
接下來(lái),找到node的名稱:
你可以通過(guò)以下地址在瀏覽器中查看UI,將node名稱替換為你在命令行中找到的標(biāo)識(shí)符:
http://localhost:8001/api/v1/nodes/gke-c-plnf4-default-pool-5eb56043-23p5:4194/proxy/containers/
為了確認(rèn)kubelet正在監(jiān)聽(tīng)端口4194,你可以登錄到node查看更多信息:
我們可以確認(rèn),在我們的Kubernetes版本中,kubelet進(jìn)程通過(guò)該端口提供cAdvisor Web UI:
如果你運(yùn)行的Kubernetes版本為1.12或更高,因?yàn)閏AdvisorUI已被刪除,因此kubelet不會(huì)再監(jiān)聽(tīng)4194端口了。你可以使用上面的命令進(jìn)行確認(rèn)。不過(guò),由于cAdvisor是kubelet二進(jìn)制文件的一部分,因此相關(guān)指標(biāo)仍然存在。
kubelet二進(jìn)制文件使用Prometheus展示格式公開(kāi)了所有runtime和cAdvisor指標(biāo):
http://localhost:8001/api/v1/nodes/gke-c-plnf4-default-pool-5eb56043-23p5/proxy/metrics/cadvisor
在一大堆輸出中,你可以重點(diǎn)查找和關(guān)注的指標(biāo)有:
CPU:
ocontainer_cpu_user_seconds_total:以秒為單位,“用戶”累計(jì)消耗CPU的時(shí)間
ocontainer_cpu_system_seconds_total:以秒為單位,“系統(tǒng)”累計(jì)消耗CPU的時(shí)間
ocontainer_cpu_usage_seconds_total:以秒為單位,累計(jì)消耗CPU的時(shí)間(上述總和)
內(nèi)存:
ocontainer_memory_cache:頁(yè)面緩存內(nèi)存的字節(jié)數(shù)
ocontainer_memory_swap:容器交換使用情況,以字節(jié)為單位
ocontainer_memory_usage_bytes:當(dāng)前內(nèi)存使用情況,以字節(jié)為單位,包括所有內(nèi)存
ocontainer_memory_max_usage_bytes:以字節(jié)為單位,大內(nèi)存使用量
磁盤(pán):
ocontainer_fs_io_time_seconds_total:執(zhí)行I/O所花費(fèi)的時(shí)間,以秒為單位
ocontainer_fs_io_time_weighted_seconds_total:累計(jì)加權(quán)I/O時(shí)間,以秒為單位
ocontainer_fs_writes_bytes_total:寫(xiě)入的累計(jì)字節(jié)數(shù)
ocontainer_fs_reads_bytes_total:讀取的累計(jì)字節(jié)數(shù)
網(wǎng)絡(luò):
ocontainer_network_receive_bytes_total:接收的累計(jì)字節(jié)數(shù)
ocontainer_network_receive_errors_total:接收時(shí)遇到的累計(jì)錯(cuò)誤數(shù)
ocontainer_network_transmit_bytes_total:傳輸?shù)睦塾?jì)字節(jié)數(shù)
ocontainer_network_transmit_errors_total:傳輸時(shí)遇到的累計(jì)錯(cuò)誤數(shù)
一些其他有用的指標(biāo):
/ healthz:用于確定cAdvisor是否健康的端點(diǎn)
/ healthz / ping:檢查與etcd的連接狀況
/ spec:返回cAdvisor?MachineInfo()的端點(diǎn)
例如,要查看cAdvisor?MachineInfo(),我們可以訪問(wèn):
http://localhost:8001/api/v1/nodes/gke-c-plnf4-default-pool-5eb56043-23p5:10255/proxy/spec/
pod端點(diǎn)為node上運(yùn)行的pod提供與kubectl get pods -o json相同的輸出:
http://localhost:8001/api/v1/nodes/gke-c-plnf4-default-pool-5eb56043-23p5:10255/proxy/pods/
同樣,也可以通過(guò)訪問(wèn)以下鏈接來(lái)獲取日志:
http://localhost:8001/logs/kube-apiserver.log
監(jiān)控的重要性不言而喻,它讓我們能充分了解到應(yīng)用程序的狀況。Kubernetes有很多內(nèi)置工具可供用戶們選擇,讓大家更好地對(duì)基礎(chǔ)架構(gòu)層(node)和邏輯層(pod)有充分的了解。
在本文中,我們重點(diǎn)關(guān)注了專為用戶提供監(jiān)控和指標(biāo)的工具。在本系列文章的下一篇中,我們將繼續(xù)分享那些關(guān)注工作負(fù)載擴(kuò)縮容和生命周期管理的監(jiān)控工具,敬請(qǐng)期待。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。