Kubernetes學習之路(二十三)之資源指標和集群監控


1、資源指標和資源監控

一個集群系統管理離不開監控,同樣的Kubernetes也需要根據數據指標來采集相關數據,從而完成對集群系統的監控狀況進行監測。這些指標總體上分為兩個組成:監控集群本身和監控Pod對象,通常一個集群的衡量性指標包括以下幾個部分:

  • 節點資源狀態:主要包括網絡帶寬、磁盤空間、CPU和內存使用率
  • 節點的數量:即時性了解集群的可用節點數量可以為用戶計算服務器使用的費用支出提供參考。
  • 運行的Pod對象:正在運行的Pod對象數量可以評估可用節點數量是否足夠,以及節點故障時是否能平衡負載。

另一個方面,對Pod資源對象的監控需求大概有以下三類:

  • Kubernetes指標:監測特定應用程序相關的Pod對象的部署過程、副本數量、狀態信息、健康狀態、網絡等等。
  • 容器指標:容器的資源需求、資源限制、CPU、內存、磁盤空間、網絡帶寬的實際占用情況。
  • 應用程序指標:應用程序自身的內建指標,和業務規則相關

2、Weave Scope監控集群

Weave Scope 是 Docker 和 Kubernetes 可視化監控工具。Scope 提供了至上而下的集群基礎設施和應用的完整視圖,用戶可以輕松對分布式的容器化應用進行實時監控和問題診斷。 對於復雜的應用編排和依賴關系,scope可以使用清晰的圖標一覽應用狀態和拓撲關系。

(1)Weave Scope部署

[root@k8s-master mainfests]# kubectl apply -f "https://cloud.weave.works/k8s/scope.yaml?k8s-version=$(kubectl version | base64 | tr -d '\n')"
namespace/weave created		#創建名稱空間weave,也可以在創建時指定名稱空間
serviceaccount/weave-scope created	#創建serviceaccount
clusterrole.rbac.authorization.k8s.io/weave-scope created
clusterrolebinding.rbac.authorization.k8s.io/weave-scope created
deployment.apps/weave-scope-app created		#創建deployment
service/weave-scope-app created			#創建service
daemonset.extensions/weave-scope-agent created		#創建deamonset
[root@k8s-master mainfests]# kubectl get ns
NAME            STATUS    AGE
default         Active    68d
ingress-nginx   Active    28d
kube-public     Active    68d
kube-system     Active    68d
weave           Active    1m
[root@k8s-master mainfests]# kubectl get deployment -n weave
NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
weave-scope-app   1         1         1            1           1m
[root@k8s-master mainfests]# kubectl get svc -n weave
NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
weave-scope-app   ClusterIP   10.97.229.215   <none>        80/TCP    33s
[root@k8s-master mainfests]# kubectl get pod -n weave
NAME                              READY     STATUS    RESTARTS   AGE
weave-scope-agent-5876w           1/1       Running   0          1m
weave-scope-agent-d6jgt           1/1       Running   0          1m
weave-scope-agent-t9p5g           1/1       Running   0          1m
weave-scope-app-578556559-nfxrf   1/1       Running   0          1m
    1. DaemonSet weave-scope-agent,集群每個節點上都會運行的 scope agent 程序,負責收集數據。
    1. Deployment weave-scope-app,scope 應用,從 agent 獲取數據,通過 Web UI 展示並與用戶交互。
    1. Service weave-scope-app,默認是 ClusterIP 類型,為了方便已通過 kubectl edit 修改為 NodePort
[root@k8s-master mainfests]# kubectl edit svc/weave-scope-app -n weave
將service的type改為NodePort
service/weave-scope-app edited
[root@k8s-master mainfests]# kubectl get svc -n weave
NAME              TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
weave-scope-app   NodePort   10.97.229.215   <none>        80:32313/TCP   11m

(2)使用 Scope

瀏覽器訪問 http://192.168.56.11:32313/,Scope 默認顯示當前所有的 Controller(Deployment、DaemonSet 等)。

(3)拓撲結構

Scope 會自動構建應用和集群的邏輯拓撲。比如點擊頂部 PODS,會顯示所有 Pod 以及 Pod 之間的依賴關系。

點擊 HOSTS,會顯示各個節點之間的關系。

(4)實時資源監控

可以在 Scope 中查看資源的 CPU 和內存使用情況。 支持的資源有 Host、Pod 和 Container。

(5)在線操作

可以查看 Pod 的日志:

(6)強大的搜索功能

Scope 支持關鍵字搜索和定位資源。

2、核心指標監控之metrics-server

在最初的系統資源監控,是通過cAdvisor去收集單個節點以及相關Pod資源的指標數據,但是這一功能僅能夠滿足單個節點,在集群日益龐大的過程中,該功能就顯得low爆了。於是將各個節點的指標數據進行匯聚並通過一個借口進行向外暴露傳送是必要的。

Heapster就是這樣的一種方式,通過為集群提供指標API和實現並進行監控,它是集群級別的監控和事件數據的聚合工具,但是一個完備的Heapster監控體系是需要進行數據存儲的,為此其解決方案就是引入了Influxdb作為后端數據的持久存儲,Grafana作為可視化的接口。原理就是Heapster從各個節點上的cAdvisor采集數據並存儲到Influxdb中,再由Grafana展示。原理圖如下:

時代在變遷,陳舊的東西將會被淘汰,由於功能和系統發展的需求,Heapster無法滿足k8s系統監控的需求,為此在Kubernetes 1.7版本以后引入了自定義指標(custom metrics API),在1.8版本引入了資源指標(resource metrics API)。逐漸地Heapster用於提供核心指標API的功能也被聚合方式的指標API服務器metrics-server所替代。

在新一代的Kubernetes指標監控體系當中主要由核心指標流水線和監控指標流水線組成:

  • 核心指標流水線:是指由kubelet、、metrics-server以及由API server提供的api組成,它們可以為K8S系統提供核心指標,從而了解並操作集群內部組件和程序。其中相關的指標包括CPU的累積使用率、內存實時使用率,Pod資源占用率以及容器磁盤占用率等等。其中核心指標的獲取原先是由heapster進行收集,但是在1.11版本之后已經被廢棄,從而由新一代的metrics-server所代替對核心指標的匯聚。核心指標的收集是必要的。如下圖:

  • 監控指標流水線:用於從系統收集各種指標數據並提供給終端用戶、存儲系統以及HPA。它們包含核心指標以及許多非核心指標,其中由於非核心指標本身不能被Kubernetes所解析,此時就需要依賴於用戶選擇第三方解決方案。如下圖:

一個可以同時使用資源指標API和自定義指標API的組件是HPAv2,其實現了通過觀察指標實現自動擴容和縮容。而目前資源指標API的實現主流是metrics-server

自1.8版本后,容器的cpu和內存資源占用利用率都可以通過客戶端指標API直接調用,從而獲取資源使用情況,要知道的是API本身並不存儲任何指標數據,僅僅提供資源占用率的實時監測數據。

資源指標和其他的API指標並沒有啥區別,它是通過API Server的URL路徑/apis/metrics.k8s.io/進行存取,只有在k8s集群內部署了metrics-server應用才能只用API,其簡單的結構圖如下:

Heapster。 Metrics Server 通過 Kubernetes 聚合 器( kube- aggregator) 注冊 到 主 API Server 之上, 而后 基於 kubelet 的 Summary API 收集 每個 節 點上 的 指標 數據, 並將 它們 存儲 於 內存 中 然后 以 指標 API 格式 提供,如下圖:

Metrics Server 基於 內存 存儲, 重 啟 后 數據 將 全部 丟失, 而且 它 僅能 留存 最近 收集 到 的 指標 數據, 因此, 如果 用戶 期望 訪問 歷史 數據, 就不 得不 借助於 第三方 的 監控 系統( 如 Prometheus 等)。

一般說來, Metrics Server 在 每個 集群 中 僅 會 運行 一個 實例, 啟動 時, 它將 自動 初始化 與 各 節點 的 連接, 因此 出於 安全 方面 的 考慮, 它 需要 運行 於 普通 節點 而非 Master 主機 之上。 直接 使用 項目 本身 提供 的 資源 配置 清單 即 能 輕松 完成 metrics- server 的 部署。

官方YAML鏈接

#從官方YAML文件中下載以下文件
[root@k8s-master metrics]# ll
total 24
-rw-r--r-- 1 root root  398 Mar 22 02:52 auth-delegator.yaml
-rw-r--r-- 1 root root  419 Mar 22 02:52 auth-reader.yaml
-rw-r--r-- 1 root root  393 Mar 22 02:53 metrics-apiservice.yaml
-rw-r--r-- 1 root root 2905 Mar 22 03:46 metrics-server-deployment.yaml
-rw-r--r-- 1 root root  336 Mar 22 02:53 metrics-server-service.yaml
-rw-r--r-- 1 root root  817 Mar 22 03:53 resource-reader.yaml

#修改下面這個文件的部分內容
[root@k8s-master metrics]# vim metrics-server-deployment.yaml 

#在metrics-server這個容器字段里面修改command為如下:
    spec:
      priorityClassName: system-cluster-critical
      serviceAccountName: metrics-server
      containers:
      - name: metrics-server
        image: k8s.gcr.io/metrics-server-amd64:v0.3.1
        command:
        - /metrics-server
        - --metric-resolution=30s
        - --kubelet-insecure-tls
        - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

#再修改metrics-server-nanny容器中的cpu和內存值,如下:
        command:
          - /pod_nanny
          - --config-dir=/etc/config
          - --cpu=100m
          - --extra-cpu=0.5m
          - --memory=100Mi
          - --extra-memory=50Mi
          - --threshold=5
          - --deployment=metrics-server-v0.3.1
          - --container=metrics-server
          - --poll-period=300000
          - --estimator=exponential
          - --minClusterSize=10
        
#由於啟動容器還需要權限獲取數據,需要在resource-reader.yaml文件中增加nodes/stats
[root@k8s-master metrics]# vim resource-reader.yaml
....
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - nodes/stats
  - namespaces

#部署開始
[root@k8s-master metrics]# kubectl apply -f .

[root@k8s-master metrics]# kubectl api-versions |grep metrics
metrics.k8s.io/v1beta1

#檢查資源指標API的可用性
[root@k8s-master metrics]# kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes"
{"kind":"NodeMetricsList","apiVersion":"metrics.k8s.io/v1beta1","metadata":{"selfLink":"/apis/metrics.k8s.io/v1beta1/nodes"},"items":[{"metadata":{"name":"k8s-master","selfLink":"/apis/metrics.k8s.io/v1beta1/nodes/k8s-master","creationTimestamp":"2019-03-22T08:12:44Z"},"timestamp":"2019-03-22T08:12:10Z","window":"30s","usage":{"cpu":"522536968n","memory":"1198508Ki"}},{"metadata":{"name":"k8s-node01","selfLink":"/apis/metrics.k8s.io/v1beta1/nodes/k8s-node01","creationTimestamp":"2019-03-22T08:12:44Z"},"timestamp":"2019-03-22T08:12:08Z","window":"30s","usage":{"cpu":"70374658n","memory":"525544Ki"}},{"metadata":{"name":"k8s-node02","selfLink":"/apis/metrics.k8s.io/v1beta1/nodes/k8s-node02","creationTimestamp":"2019-03-22T08:12:44Z"},"timestamp":"2019-03-22T08:12:11Z","window":"30s","usage":{"cpu":"68437841n","memory":"519756Ki"}}]}

#確保Pod對象運行正常
[root@k8s-master metrics]# kubectl get pods -n kube-system |grep metrics
metrics-server-v0.3.1-5977577c75-wrcrt   2/2       Running   0          22m

以上如果內容沒有做修改的話,會出現容器跑不起來一直處於CrashLoopBackOff狀態,或者出現權限拒絕的問題。可以通過kubectl logs 進行查看相關的日志。下面使用kubectl top命令進行查看資源信息:

[root@k8s-master metrics]# kubectl top node
NAME         CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%   
k8s-master   497m         12%       1184Mi          68%       
k8s-node01   81m          8%        507Mi           58%       
k8s-node02   63m          6%        505Mi           57%       


[root@k8s-master metrics]# kubectl top pod -l k8s-app=kube-dns --containers=true -n kube-system
POD                        NAME      CPU(cores)   MEMORY(bytes)   
coredns-78fcdf6894-nmcmz   coredns   5m           12Mi            
coredns-78fcdf6894-p5pfm   coredns   5m           15Mi            


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM