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

一、資源指標和資源監控

一個集羣系統管理離不開監控,一樣的Kubernetes也須要根據數據指標來採集相關數據,從而完成對集羣系統的監控情況進行監測。這些指標整體上分爲兩個組成:監控集羣自己和監控Pod對象,一般一個集羣的衡量性指標包括如下幾個部分:nginx

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

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

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

二、Weave Scope監控集羣

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

(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 等)。vim

(3)拓撲結構

Scope 會自動構建應用和集羣的邏輯拓撲。好比點擊頂部 PODS,會顯示全部 Pod 以及 Pod 之間的依賴關係。後端

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

(4)實時資源監控

能夠在 Scope 中查看資源的 CPU 和內存使用狀況。 支持的資源有 Host、Pod 和 Container。瀏覽器

(5)在線操做

能夠查看 Pod 的日誌:安全

(6)強大的搜索功能

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

二、核心指標監控之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
相關文章
相關標籤/搜索