目錄node
一個集羣系統管理離不開監控,一樣的Kubernetes也須要根據數據指標來採集相關數據,從而完成對集羣系統的監控情況進行監測。這些指標整體上分爲兩個組成:監控集羣自己和監控Pod對象,一般一個集羣的衡量性指標包括如下幾個部分:nginx
另外一個方面,對Pod資源對象的監控需求大概有如下三類:git
Weave Scope 是 Docker 和 Kubernetes 可視化監控工具。Scope 提供了至上而下的集羣基礎設施和應用的完整視圖,用戶能夠輕鬆對分佈式的容器化應用進行實時監控和問題診斷。 對於複雜的應用編排和依賴關係,scope可使用清晰的圖標一覽應用狀態和拓撲關係。github
[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
weave-scope-app
,scope 應用,從 agent 獲取數據,經過 Web UI 展現並與用戶交互。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
瀏覽器訪問 http://192.168.56.11:32313/
,Scope 默認顯示當前全部的 Controller(Deployment、DaemonSet 等)。vim
Scope 會自動構建應用和集羣的邏輯拓撲。好比點擊頂部 PODS
,會顯示全部 Pod 以及 Pod 之間的依賴關係。後端
點擊 HOSTS
,會顯示各個節點之間的關係。api
能夠在 Scope 中查看資源的 CPU 和內存使用狀況。 支持的資源有 Host、Pod 和 Container。瀏覽器
能夠查看 Pod 的日誌:安全
Scope 支持關鍵字搜索和定位資源。服務器
在最初的系統資源監控,是經過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文件中下載如下文件 [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