Kubernetes的Metrics API和Metrics Server
Kubernetes 1.8關於資源使用情況的metrics(例如容器的CPU和記憶體),可以通過Metrics API獲取到。 前面在做Kubernetes 1.11的升級工作時,Kubernetes 1.11已經廢棄heapster那套監控的東東。因此是時候瞭解一下Kubernetes的Metrics API和Metrics Server了。
Metrics Server的安裝
這裡使用Heml來部署metrics-server,chat模板的值檔案metrics-server.yaml如下:
args: - --logtostderr - --kubelet-insecure-tls
將其安裝到Kubernetes的kube-system名字空間:
helm install stable/metrics-server \ -n metrics-server \ --namespace kube-system \ -f metrics-server.yaml
部署完成後使用下面的命令檢視node相關的指標:
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":[]}
沒有獲取到資訊,此時檢視metric-server容器的日誌,有下面的錯誤:
E1003 05:46:13.7570091 manager.go:102] unable to fully collect metrics: [unable to fully scrape metrics from source kubelet_summary:node1: unable to fetch metrics from Kubelet node1 (node1): Get https://node1:10250/stats/summary/: dial tcp: lookup node1 on 10.96.0.10:53: no such host, unable to fully scrape metrics from source kubelet_summary:node2: unable to fetch metrics from Kubelet node2 (node2): Get https://node2:10250/stats/summary/: dial tcp: lookup node2 on 10.96.0.10:53: read udp 10.244.1.6:45288->10.96.0.10:53: i/o timeout]
可以看到metrics-server在從kubelet的10250埠獲取資訊時,使用的是hostname,而因為node1和node2是一個獨立的Kubernetes演示環境,只是修改了這兩個節點系統的/etc/hosts檔案,而並沒有內網的DNS伺服器,所以metrics-server中不認識node1和node2的名字。這裡我們可以直接修改Kubernetes叢集中的coredns的configmap,修改Corefile加入hostnames外掛,將Kubernetes的各個節點的主機名加入到hostnames中,這樣Kubernetes叢集中的所有Pod都可以從CoreDNS中解析各個節點的名字。
kubectl edit configmap coredns -n kube-system apiVersion: v1 data: Corefile: | .:53 { errors health hosts { 192.168.61.11 node1 192.168.61.12 node2 fallthrough } kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure upstream fallthrough in-addr.arpa ip6.arpa } prometheus :9153 proxy . /etc/resolv.conf cache 30 loop reload loadbalance } kind: ConfigMap
配置修改完畢後重啟叢集中coredns和metrics-server,確認metrics-server不再有錯誤日誌。
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes"
Metrics API
Metrics Server從Kubernetes叢集中每個Node上kubelet的API收集metrics資料。通過Metrics API可以獲取Kubernetes資源的Metrics指標,Metrics API掛載/apis/metrics.k8s.io/
下。 可以使用kubectl top
命令訪問Metrics API,例如:
kubectl top node NAMECPU(cores)CPU%MEMORY(bytes)MEMORY% node1140m14%1285Mi73% node237m3%458Mi26%
kubectl top pod --all-namespaces NAMESPACENAMECPU(cores)MEMORY(bytes) ingress-nginxnginx-ingress-controller-77fc55d6dd-hmlmt3m90Mi ingress-nginxnginx-ingress-controller-77fc55d6dd-htms62m84Mi ingress-nginxnginx-ingress-default-backend-684f76869d-pxlmz1m1Mi kube-systemcoredns-576cbf47c7-mlfcd2m13Mi kube-systemcoredns-576cbf47c7-xgqdd2m10Mi kube-systemetcd-node113m86Mi kube-systemkube-apiserver-node123m514Mi kube-systemkube-controller-manager-node126m54Mi kube-systemkube-flannel-ds-amd64-8rcq41m18Mi kube-systemkube-flannel-ds-amd64-mhx9t2m14Mi kube-systemkube-proxy-nljs82m30Mi kube-systemkube-proxy-pjdsj2m19Mi kube-systemkube-scheduler-node110m18Mi kube-systemkubernetes-dashboard-5746dd4544-gtj651m28Mi kube-systemmetrics-server-8854b78d9-nx9tx1m12Mi kube-systemtiller-deploy-6f6fd74b68-mc2cw1m27Mi
參考
- ofollow,noindex" target="_blank">Core metrics pipeline
- gitlab kubernetes/metrics
- gitlab metrics-server