Metrics API
介紹Metrics-Server之前,必須要提一下Metrics API的概念
Metrics API相比於之前的監控採集方式(hepaster)是一種新的思路,官方希望核心指標的監控應該是穩定的,版本可控的,且可以直接被使用者訪問(例如通過使用 kubectl top 命令),或由叢集中的控制器使用(如HPA),和其他的Kubernetes APIs一樣。
官方廢棄heapster專案,就是為了將核心資源監控作為一等公民對待,即像pod、service那樣直接通過api-server或者client直接訪問,不再是安裝一個hepater來匯聚且由heapster單獨管理。
假設每個pod和node我們收集10個指標,從k8s的1.6開始,支援5000節點,每個節點30個pod,假設採集粒度為1分鐘一次,則:
因為k8s的api-server將所有的資料持久化到了etcd中,顯然k8s本身不能處理這種頻率的採集,而且這種監控資料變化快且都是臨時資料,因此需要有一個元件單獨處理他們,k8s版本只存放部分在記憶體中,於是metric-server的概念誕生了。
其實hepaster已經有暴露了api,但是使用者和Kubernetes的其他元件必須通過master proxy的方式才能訪問到,且heapster的介面不像api-server一樣,有完整的鑑權以及client整合。這個api現在還在alpha階段(18年8月),希望能到GA階段。類api-server風格的寫法:generic apiserver
有了Metrics Server元件,也採集到了該有的資料,也暴露了api,但因為api要統一,如何將請求到api-server的/apis/metrics
請求轉發給Metrics Server呢,解決方案就是:kube-aggregator,在k8s的1.7中已經完成,之前Metrics Server一直沒有面世,就是耽誤在了kube-aggregator這一步。
kube-aggregator(聚合api)主要提供:
-
Provide an API for registering API servers.
-
Summarize discovery information from all the servers.
-
Proxy client requests to individual servers.
詳細設計文件:參考連結
metric api的使用:
-
Metrics API 只可以查詢當前的度量資料,並不儲存歷史資料
-
Metrics API URI 為 /apis/metrics.k8s.io/,在 k8s.io/metrics 維護
-
必須部署 metrics-server 才能使用該 API,metrics-server 通過呼叫 Kubelet Summary API 獲取資料
如:
http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/nodes http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/nodes/<node-name> http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/namespace/<namespace-name>/pods/<pod-name>
Metrics-Server
Metrics server定時從Kubelet的Summary API(類似/ap1/v1/nodes/nodename/stats/summary)採集指標資訊,這些聚合過的資料將儲存在記憶體中,且以metric-api的形式暴露出去。
Metrics server複用了api-server的庫來實現自己的功能,比如鑑權、版本等,為了實現將資料存放在記憶體中嗎,去掉了預設的etcd儲存,引入了記憶體儲存(即實現Storage interface)。因為存放在記憶體中,因此監控資料是沒有持久化的,可以通過第三方儲存來擴充,這個和heapster是一致的。
Metrics server出現後,新的Kubernetes 監控架構將變成上圖的樣子
-
核心流程(黑色部分):這是 Kubernetes正常工作所需要的核心度量,從 Kubelet、cAdvisor 等獲取度量資料,再由metrics-server提供給 Dashboard、HPA 控制器等使用。
-
監控流程(藍色部分):基於核心度量構建的監控流程,比如 Prometheus 可以從 metrics-server 獲取核心度量,從其他資料來源(如 Node Exporter 等)獲取非核心度量,再基於它們構建監控告警系統。
官方地址:https://github.com/kubernetes-incubator/metrics-server
部署
mkdir metrics;cd metics git clone https://github.com/kubernetes-incubator/metrics-server.git cd metrics-server/deploy/1.8+/
修改metrics-server-deployment.yaml,紅色command部分。
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: metrics-server
namespace: kube-system
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
labels:
k8s-app: metrics-server
spec:
selector:
matchLabels:
k8s-app: metrics-server
template:
metadata:
name: metrics-server
labels:
k8s-app: metrics-server
spec:
serviceAccountName: metrics-server
volumes:
# mount in tmp so we can safely use from-scratch images and/or read-only containers
- name: tmp-dir
emptyDir: {}
containers:
- name: metrics-server
image: k8s.gcr.io/metrics-server-amd64:v0.3.3
command:
- /metrics-server
- --metric-resolution=30s
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
- --kubelet-insecure-tls
imagePullPolicy: Always
volumeMounts:
- name: tmp-dir
mountPath: /tmp
建立
[root@cn-hongkong 1.8+]# kubectl apply -f . clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader unchanged clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator unchanged rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader unchanged apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io unchanged serviceaccount/metrics-server unchanged deployment.extensions/metrics-server configured
等待一會就可以看下叢集的資源使用情況了!