天天看點

k8s資源名額API及metrics-server資源監控

簡述:

在k8s早期版本中,對資源的監控使用的是heapster的資源監控工具。

但是從 Kubernetes 1.8 開始,Kubernetes 通過 Metrics API 擷取資源使用名額,例如容器 CPU 和記憶體使用情況。

這些度量名額可以由使用者直接通路,例如通過使用kubectl top 指令,或者使用叢集中的控制器。

Metrics API: 通過 Metrics API,您可以獲得 node 或 pod 目前的資源使用情況(但是不存儲)。

metres-server比 heapster 優勢在于: 通路不需要 apiserver 的代理機制,提供認證和授權等; 很多叢集内元件依賴它(HPA,scheduler,kubectl top),是以它應該在叢集中預設運作;

k8s從1.11版開始,将叢集的監控體系、資料的擷取機制轉移向metrics-server

在叢集中,若要擷取叢集内部的資源使用資訊,需要通過metrics-server來實作。

而若要使用metrics-server,就必須建立一個适用于metrics-server的API的資源名額。

因為,叢集中自帶的API無法直接識别第三方的資源名額。

是以這裡就要用到自定義的資源名額API功能

在k8s中,資源名額分兩種:

  1.k8s自帶的資源名額,也就是說叢集内部的資源名額

  2.自定義資源名額,允許使用者自定義資源名額來實作使用者想要實作的功能

我們可以通過指令:kubectl api-versions來檢視叢集中已存在的資源名額API

重點說明一下:

metres-server在GitHub項目位址有兩個用的比較多的:

  官方穩定版的:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/metrics-server

  這個不知道是不是官方的,不過使用者也很多:https://github.com/kubernetes-incubator/metrics-server/tree/master/deploy

  首先說一下,其實兩種方式的我都部署過,但是官方的最新版的metrics-server:v0.3.3和addon-resizer:1.8.5這兩個元件,在預設使用資源清單部署時,試了無數次,鏡像下載下傳下來了,但死活Running不起來。

  找了好多文檔,看了好多部落格,就是起不來,可能是技術還沒有到位。為了避免踩坑,這裡建議使用早點的release-1.11版本,在:

  https://github.com/kubernetes/kubernetes/tree/release-1.11/cluster/addons/metrics-server這個版本中修改一下資源清單就可以Running起來

  第二個kubernetes-incubator沒什麼太大問題。

一、使用官方資源清單部署:(release-1.11版)

  1.下載下傳資源清單:

   使用for循環快速下載下傳資源清單:

1 for file in auth-delegator.yaml auth-reader.yaml metrics-apiservice.yaml metrics-server-deployment.yaml metrics-server-service.yaml resource-reader.yaml ;do wget https://raw.githubusercontent.com/kubernetes/kubernetes/release-1.11/cluster/addons/metrics-server/$file;done      

   2.修改資源清單參數:這裡使用的鏡像為metrics-server:v0.2.1和addon-resizer:1.8.3

1 vim metrics-server-deployment.yaml
 2 ......
 3       containers:
 4       - name: metrics-server
 5         image: gcr.azk8s.cn/google_containers/metrics-server-amd64:v0.2.1   #修改鏡像倉庫位址
 6         command:
 7         - /metrics-server
 8 #        - --source=kubernetes.summary_api:''  #注釋這行
 9         - --source=kubernetes.summary_api:https://kubernetes.default?kubeletHttps=true&kubeletPort=10250&insecure=true   #添加這行表示不驗證用戶端證書
10         ports:
11         - containerPort: 443
12           name: https
13 ......      
1 vim resource-reader.yaml
 2 ......
 3 rules:
 4 - apiGroups:
 5   - ""
 6   resources:
 7   - pods
 8   - nodes
 9   - nodes/stats   #添加這行,否則無法擷取其他節點資料。
10   - namespaces
11 ......      

  3.部署資源清單:

  切換到下載下傳好資源清單的目錄下

1 kubectl apply -f ./      

  4.驗證:

    檢視叢集中是否建構metrics-server的API

1 kubectl api-versions
2 ......
3 metrics.k8s.io/v1beta1
4 ......      

   檢視metrics-server的pod是否Running

1 kubectl get pods -n kube-system
2 ......
3 NAME                                     READY   STATUS    RESTARTS   AGE
4 metrics-server-v0.2.1-55c4957fd4-9z65b   2/2     Running   0          8h      

     檢視kubectl top 指令是否可用:

1 [root@K8s-master ~]# kubectl top pods
 2 NAME                           CPU(cores)   MEMORY(bytes)   
 3 myapp-deploy-9dc49d6f8-56s7k   0m           2Mi             
 4 myapp-deploy-9dc49d6f8-gsw8c   0m           3Mi             
 5 myapp-deploy-9dc49d6f8-z6mxv   0m           3Mi             
 6 [root@K8s-master ~]# kubectl top nodes
 7 NAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
 8 k8s-master   290m         3%     1027Mi          59%       
 9 k8s-node1    46m          4%     463Mi           52%       
10 k8s-node2    47m          4%     459Mi           52%      

  5.疑問:

  即使pod可以Running起來,即使有metrics-server的API,即使可以使用kubectl top指令,但是addon-resizer:1.8.3容器中的日志依然有報錯:

1 [root@K8s-master ~]# kubectl logs kube-state-metrics-8578649b5-gj29z -n kube-system -c addon-resizer
2 ERROR: logging before flag.Parse: I0605 10:34:09.624889       1 pod_nanny.go:65] Invoked by [/pod_nanny --container=kube-state-metrics --cpu=100m --extra-cpu=1m --memory=100Mi --extra-memory=2Mi --threshold=5 --deployment=kube-state-metrics]
3 ERROR: logging before flag.Parse: I0605 10:34:09.624969       1 pod_nanny.go:81] Watching namespace: kube-system, pod: kube-state-metrics-8578649b5-gj29z, container: kube-state-metrics.
4 ERROR: logging before flag.Parse: I0605 10:34:09.624972       1 pod_nanny.go:82] storage: MISSING, extra_storage: 0Gi
5 ERROR: logging before flag.Parse: I0605 10:34:09.625799       1 pod_nanny.go:171] Failed to read data from config file "MISSING/NannyConfiguration": open MISSING/NannyConfiguration: no such file or directory, using default parameters
6 ERROR: logging before flag.Parse: I0605 10:34:09.625829       1 pod_nanny.go:109] cpu: 100m, extra_cpu: 1m, memory: 100Mi, extra_memory: 2Mi
7 ERROR: logging before flag.Parse: I0605 10:34:09.625838       1 pod_nanny.go:138] Resources: [{Base:{i:{value:100 scale:-3} d:{Dec:<nil>} s:100m Format:DecimalSI} ExtraPerNode:{i:{value:1 scale:-3} d:{Dec:<nil>} s:1m Format:DecimalSI} Name:cpu} {Base:{i:{value:104857600 scale:0} d:{Dec:<nil>} s:100Mi Format:BinarySI} ExtraPerNode:{i:{value:2097152 scale:0} d:{Dec:<nil>} s:2Mi Format:BinarySI} Name:memory}]      

期望有大佬可以給出解釋

二、使用kubernetes-incubator的資源清單部署 

  1.下載下傳資源清單(我這裡直接克隆整個項目):   

1 git clone https://github.com/kubernetes-incubator/metrics-server.git      

   2.進入目錄,修改資源清單:

1 cd metrics-server/deploy/1.8+/
 2 vim metrics-server-deployment.yaml
 3 ......
 4       containers:
 5       - name: metrics-server
 6         image: gcr.azk8s.cn/google_containers/metrics-server-amd64:v0.3.3  #修改鏡像倉庫位址
 7         imagePullPolicy: IfNotPresent
 8         command:                                                           #添加這行
 9             - /metrics-server                                              #添加這行        
10             - --kubelet-preferred-address-types=InternalIP                 #添加這行
11             - --kubelet-insecure-tls                                       #添加這行表示不驗證用戶端證書
12         volumeMounts:
13         - name: tmp-dir
14           mountPath: /tmp      
1 vim resource-reader.yaml
 2 ......
 3 rules:
 4 - apiGroups:
 5   - ""
 6   resources:
 7   - pods
 8   - nodes
 9   - namespaces
10   - nodes/stats  #檢查是否存在此項,若不存在,則添加
11 ......      

  3.部署:

1 kubectl apply -f ./      

       4.驗證:

1 kubectl logs metrics-server-5cf4b94d8b-pllxh -n kube-system
2 I0605 15:13:00.513687       1 serving.go:312] Generated self-signed cert (apiserver.local.config/certificates/apiserver.crt, apiserver.local.config/certificates/apiserver.key)
3 I0605 15:13:01.126262       1 secure_serving.go:116] Serving securely on [::]:443