溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

原生Kubernetes監(jiān)控功能詳解-Part1

發(fā)布時(shí)間:2020-07-07 14:20:08 來源:網(wǎng)絡(luò) 閱讀:698 作者:RancherLabs 欄目:云計(jì)算
今晚20:30,Kubernetes Master Class在線培訓(xùn)第五期《Kubernetes中的日志、監(jiān)控與告警》即將開播,點(diǎn)擊http://live.vhall.com/317569561 即可免費(fèi)預(yù)約注冊(cè)!

介?紹

Kubernetes是一個(gè)開源的容器編排框架,它為我們提供了一種簡單的部署、擴(kuò)展和監(jiān)控的方法。在本文中,我們將討論Kubernetes的內(nèi)置監(jiān)控功能。為了便于讀者更好地理解,本文包含了一些演示。

Kubernetes架構(gòu)概述

在基礎(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組件公開API的主組件

  • scheduler:負(fù)責(zé)依照pod規(guī)范中的信息來決定pod應(yīng)該運(yùn)行在哪個(gè)node上

  • controller-manager:負(fù)責(zé)node管理(檢測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地址,且還提供控制訪問IP地址的策略。

  • ReplicaSet:由deployment控制,負(fù)責(zé)確保deployment所需數(shù)量的pod都正常運(yùn)行。

  • Namespace(命名空間):為pod或service等不同類型的資源定義邏輯隔離。

  • Metadata:根據(jù)容器的部署特征對(duì)容器進(jìn)行標(biāo)記。

監(jiān)控Kubernetes

若我們想要預(yù)測問題并發(fā)現(xiàn)開發(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)控資源使用情況并分析容器性能的開源代理。

  • Liveness和Readiness Probe:主動(dòng)監(jiān)控容器的健康情況。

  • Horizontal?Pod Autoscaler:基于通過分析不同指標(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ù)器層的問題往往都會(huì)出現(xiàn)在工作負(fù)載中。監(jiān)控node資源時(shí)要注意的一些指標(biāo)包括CPU、磁盤和網(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)。

前期準(zhǔn)備

在以下部分中,我們將以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一起安裝。通過使用你的憑據(jù)進(jìn)行身份驗(yàn)證(gcloud init和gcloud auth login),確保gcloud可以訪問你的谷歌云帳戶。

啟動(dòng)Rancher實(shí)例

第一步,啟動(dòng)Rancher實(shí)例。Rancher有一份非常直觀的入門指南可供參考: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監(jiān)控功能詳解-Part1

Kubernetes Dashboard

Kubernetes dashboard是基于Web的Kubernetes用戶界面,我們可以使用它來對(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ò)誤的信息

?

要訪問dashboard,我們需要在我們的計(jì)算機(jī)和Kubernetes API服務(wù)器之間代理請(qǐng)求。輸入以下代碼即可使用kubectl啟動(dòng)代理服務(wù)器:

原生Kubernetes監(jiān)控功能詳解-Part1

代理服務(wù)器將在后臺(tái)啟動(dòng),輸出類似于下文的內(nèi)容:

原生Kubernetes監(jiān)控功能詳解-Part1

現(xiàn)在,要查看dashboard,請(qǐng)通過瀏覽器訪問以下地址:

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

然后,我們需要在登錄頁面輸入相應(yīng)的憑據(jù):

原生Kubernetes監(jiān)控功能詳解-Part1

下面我們將來了解如何使用服務(wù)帳戶機(jī)制,創(chuàng)建具有管理員權(quán)限的用戶。我們將使用兩個(gè)YAML文件。

?

一個(gè)YAML文件用于創(chuàng)建服務(wù)帳戶:

原生Kubernetes監(jiān)控功能詳解-Part1

另一個(gè)YAML文件將為我們的用戶創(chuàng)建ClusterRoleBinding:

原生Kubernetes監(jiān)控功能詳解-Part1

應(yīng)用兩個(gè)YAML文件,來創(chuàng)建其定義的對(duì)象:

原生Kubernetes監(jiān)控功能詳解-Part1

創(chuàng)建用戶并設(shè)置了正確的權(quán)限后,我們需要找到令牌才能登錄:

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

原生Kubernetes監(jiān)控功能詳解-Part1

在Kubernetes dashboard憑據(jù)提示中選擇“Token(令牌)”,然后在字段中輸入你在上面檢索的值以進(jìn)行身份驗(yàn)證。

?

Kubernetes Dashboard包含幾個(gè)主要視圖:

?

  • 管理視圖:列出了node、命名空間和持久卷以及其他詳細(xì)信息。我們可以獲得node的集成頁面(CPU和內(nèi)存使用情況)以及每個(gè)node的單獨(dú)詳細(xì)信息頁面,顯示其指標(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ù)載均衡視圖:顯示了向外部公開服務(wù)的Kubernetes資源,并在集群內(nèi)啟用服務(wù)發(fā)現(xiàn)。

  • 配置和存儲(chǔ)視圖:顯示了應(yīng)用程序使用的持久卷聲明資源。配置視圖顯示了用于在集群中運(yùn)行的應(yīng)用程序?qū)崟r(shí)配置的所有Kubernetes資源。

?

在沒有任何工作負(fù)載運(yùn)行的情況下,dashboard頁面將為空,因?yàn)榇藭r(shí)在Kubernetes上不會(huì)部署任何內(nèi)容。如果要瀏覽 dashboard提供的所有視圖,最佳選擇是部署使用不同工作負(fù)載類型的應(yīng)用程序(StatefulSet、部署、副本集等)。這篇如何在Kubernetes上部署Redis的文章就是一個(gè)很好的示例,它展示了部署一個(gè)Redis集群(具有卷聲明和configMaps的有狀態(tài)集)和一個(gè)測試應(yīng)用程序(一個(gè)Kubernetes部署)時(shí),dashboard會(huì)如何顯示相關(guān)信息。

配置完工作負(fù)載后,我們可以關(guān)閉一個(gè)node,然后檢查不同的選項(xiàng)卡,以查看一些更新:

原生Kubernetes監(jiān)控功能詳解-Part1

原生Kubernetes監(jiān)控功能詳解-Part1


原生Kubernetes監(jiān)控功能詳解-Part1


cAdvisor

cAdvisor是一個(gè)集成到kubelet二進(jìn)制文件中的開源代理,主要用于監(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之類的命令直接訪問指標(biāo),也可以使用調(diào)度程序執(zhí)行調(diào)度層的指標(biāo)(例如使用autoscaling)。

?

需要注意的是,cAdvisor不會(huì)長期存儲(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問cAdvisor UI。

?

要訪問cAdvisor UI,我們需要在我們的計(jì)算機(jī)和Kubernetes API服務(wù)器之間進(jìn)行代理。輸入以下命令啟動(dòng)代理服務(wù)器的本地實(shí)例:

原生Kubernetes監(jiān)控功能詳解-Part1

接下來,找到node的名稱:

原生Kubernetes監(jiān)控功能詳解-Part1

你可以通過以下地址在瀏覽器中查看UI,將node名稱替換為你在命令行中找到的標(biāo)識(shí)符:

http://localhost:8001/api/v1/nodes/gke-c-plnf4-default-pool-5eb56043-23p5:4194/proxy/containers/

?

原生Kubernetes監(jiān)控功能詳解-Part1


原生Kubernetes監(jiān)控功能詳解-Part1

為了確認(rèn)kubelet正在監(jiān)聽端口4194,你可以登錄到node查看更多信息:

原生Kubernetes監(jiān)控功能詳解-Part1

我們可以確認(rèn),在我們的Kubernetes版本中,kubelet進(jìn)程通過該端口提供cAdvisor Web UI:

原生Kubernetes監(jiān)控功能詳解-Part1

如果你運(yùn)行的Kubernetes版本為1.12或更高,因?yàn)閏AdvisorUI已被刪除,因此kubelet不會(huì)再監(jiān)聽4194端口了。你可以使用上面的命令進(jìn)行確認(rèn)。不過,由于cAdvisor是kubelet二進(jìn)制文件的一部分,因此相關(guān)指標(biāo)仍然存在。

?

kubelet二進(jìn)制文件使用Prometheus展示格式公開了所有runtime和cAdvisor指標(biāo):

http://localhost:8001/api/v1/nodes/gke-c-plnf4-default-pool-5eb56043-23p5/proxy/metrics/cadvisor

原生Kubernetes監(jiān)控功能詳解-Part1


在一大堆輸出中,你可以重點(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:頁面緩存內(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)存使用量

?

磁盤:

  • 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:寫入的累計(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(),我們可以訪問:

http://localhost:8001/api/v1/nodes/gke-c-plnf4-default-pool-5eb56043-23p5:10255/proxy/spec/

原生Kubernetes監(jiān)控功能詳解-Part1


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/

原生Kubernetes監(jiān)控功能詳解-Part1


同樣,也可以通過訪問以下鏈接來獲取日志:

http://localhost:8001/logs/kube-apiserver.log

結(jié)?語

監(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)期待。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI