Metrics-server簡介
Metrics-server是用來替換heapster擷取叢集上資源名額資料的,heapster從1.11開始逐漸被廢棄了。
在使用heapster時,擷取資源名額是由heapster自已擷取的,heapster有自已的擷取路徑,沒有通過apiserver,後來k8s引入了資源名額API(Metrics API),于是資源名額的資料就從k8s的api中的直接擷取,不必再通過其它途徑。
metrics-server: 它是一種API Server,提供了核心的Metrics API,就像k8s元件kube-apiserver提供了很多API群組一樣,但它不是k8s組成部分,而是托管運作在k8s之上的Pod。為了讓使用者無縫的使用metrics-server當中的API,還需要把這類自定義的API,通過聚合器聚合到核心API組裡,
然後可以把此API當作是核心API的一部分,通過kubectl api-versions可直接檢視。
metrics-server收集名額資料的方式是從各節點上kubelet提供的Summary API 即10250端口收集資料,收集Node和Pod核心資源名額資料,主要是記憶體和cpu方面的使用情況,并将收集的資訊存儲在記憶體中,是以當通過kubectl top不能檢視資源資料的曆史情況,其它資源名額資料則通過prometheus采集了。
k8s中很多元件是依賴于資源名額API的功能 ,比如kubectl top 、hpa,如果沒有一個資源名額API接口,這些元件是沒法運作的。早期是依賴heapster。
Metrics-server的部署
有兩個項目提供了metrics-server:
- github.com/kubernetes-incubator/metrics-server。
- github.com/kubernetes/kubernetes 官方源碼樹上作為addon提供。
這裡就從官方源碼樹上直接下載下傳部署,版本為目前最新版本v0.3.1
這裡用的k8s叢集是用kubeadm部署的,部署起來非常簡單,kubeadm一些配置都自動化了。如果是用二進制部署的k8s叢集,部署就得頗費一番周折,配置起來複雜很多。
下載下傳資源清單檔案
$ ls metrics-server/
auth-delegator.yaml metrics-server-deployment.yaml resource-reader.yaml
auth-reader.yaml metrics-server-service.yaml
metrics-apiservice.yaml
目前metrics-server的鏡像版本已經更新到metrics-server-amd64:v0.3.1了,此前的版本為v0.2.1,兩者的啟動的參數還是有所不同的。
修改配置
下載下傳下來的檔案不能直接部署,有幾處需要修改
resource-reader.yaml
rules:
- apiGroups:
- ""
resources:
- pods
- nodes
- nodes/stats #新增這一行
- namespaces
verbs:
- get
- list
- watch
metrics-server-deployment.yaml
#修改containers 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
# These are needed for GKE, which doesn't support secure communication yet.
# Remove these lines for non-GKE clusters, and when GKE supports token-based auth.
#- --kubelet-port=10255
#- --deprecated-kubelet-completely-insecure=true
----
# 修改containers,metrics-server-nanny 啟動參數,修改好的如下:
command:
- /pod_nanny
- --config-dir=/etc/config
- --cpu=80m
- --extra-cpu=0.5m
- --memory=80Mi
- --extra-memory=8Mi
- --threshold=5
- --deployment=metrics-server-v0.3.1
- --container=metrics-server
- --poll-period=300000
- --estimator=exponential
# Specifies the smallest cluster (defined in number of nodes)
# resources will be scaled to.
#- --minClusterSize={{ metrics_server_min_cluster_size }}
應用到叢集
root@k8s-master:/metrics-server# kubectl create -f ./
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
serviceaccount/metrics-server created
configmap/metrics-server-config created
deployment.extensions/metrics-server-v0.3.1 created
service/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
檢視
#已成功運作
$ kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
metrics-server-v0.3.1-75d77b57cd-hlwlh 2/2 Running 0 3m
有幾點要注意的:
- 在部署過程中遇到的錯誤:
Get https://k8s-master:10250/stats/summary/: dial tcp: lookup k8s-master on 10.96.0.10:53: no such host
提示 無法解析節點的主機名,是metrics-server這個容器不能通過CoreDNS 10.96.0.10:53 解析各Node的主機名,metrics-server連節點時預設是連接配接節點的主機名,需要加個參數,讓它連接配接節點的IP:
“--kubelet-preferred-address-types=InternalIP”
-
- 因為10250是https端口,連接配接它時需要提供證書,是以加上--kubelet-insecure-tls,表示不驗證用戶端證書,此前的版本中使用--source=這個參數來指定不驗證用戶端證書。
驗證metrics-server
檢視api
#metrics-server所提供的API
root@k8s-master:~# kubectl api-versions
metrics.k8s.io/v1beta1
檢視Metrics API資料
#啟動一個代理以便curl api
root@k8s-master:~# kubectl proxy --port=8091
Starting to serve on 127.0.0.1:8091
#直接檢視接口資料:
#可擷取的資源:nodes和pods
root@k8s-master:~# curl localhost:8091/apis/metrics.k8s.io/v1beta1
{
"kind": "APIResourceList",
"apiVersion": "v1",
"groupVersion": "metrics.k8s.io/v1beta1",
"resources": [
{
"name": "nodes",
"singularName": "",
"namespaced": false,
"kind": "NodeMetrics",
"verbs": [
"get",
"list"
]
},
{
"name": "pods",
"singularName": "",
"namespaced": true,
"kind": "PodMetrics",
"verbs": [
"get",
"list"
]
}
]
#檢視擷取到的Node資源名額資料:cpu和記憶體
root@k8s-master:~# curl localhost:8091/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-node02",
"selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/k8s-node02",
"creationTimestamp": "2018-10-06T08:48:51Z"
},
"timestamp": "2018-10-06T08:48:23Z",
"window": "30s",
"usage": {
"cpu": "118493217n",
"memory": "1320848Ki"
}
kubectl top檢視
通過接口檢視到了資料,就可以使用kubetl top直接檢視了:
root@k8s-master:/data/k8s/metrics-server# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 323m 8% 2319Mi 40%
k8s-node01 112m 2% 1327Mi 34%
k8s-node02 114m 2% 1273Mi 33%
metrics-server已經可以正常工作了,核心名額已經擷取到了,其它的自定義名額擷取則要借助于prometheus了。
k8s v1.10版本之前仍然要通過heapster擷取名額資料,否則即使部署了metrics-server,kubectl top這個指令仍然連接配接heapster。
HPA
HPA是k8s一個非常強大的功能,根據Pod的cpu、記憶體及其它名額自動伸縮Pod副本數量,
HPA目前有兩個版本,通過kubectl api-versions檢視:
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
- autoscaling/v1:僅支援核心名額API,目前是由metrics-service提供的metrics.k8s.io/v1beta1, 提供的名額來定義,也就是cpu和記憶體,而記憶體是不可壓縮型資源,不支援彈性縮放,是以隻能支援cpu名額來彈性伸縮。
- autoscaling/v2:除了核心名額之後,還支援定義自定義名額,目前是由custom-metrics-apiserver服務提供的custom.metrics.k8s.io/v1beta1,比如記憶體、網絡方面的名額,提前是配置了自定義名額API服務。
下面建立一個Pod,然後建立一個HPA監控Pod的CPU使用率,再對Pod實施壓測,檢視HPA是否根據Pod的cpu使用率伸縮Pod副本。
建立一個Pod
$ kubectl run php-apache --image=k8s.gcr.io/hpa-example --requests=cpu=200m --expose --port=80
service/php-apache created
deployment.apps/php-apache created
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
php-apache-b5f58cc5f-6csfw 1/1 Running 0 28s 192.168.85.198 k8s-node01 <none>
定義HPA
#HPA監控目标對象的cpu使用率,確定所有副本的Pod的CPU使用不超50%, 并适當的進行伸縮。
$ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled
#目前為0%
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
啟動一個程式對其壓測
$ kubectl run -i --tty load-generator --image=busybox /bin/sh
/ # while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done
OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK
等一會檢視hpa
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 481%/50% 1 10 1 21m
$ kubectl get deployments php-apache
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
php-apache 10 10 10 10 25m
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 39m
$ kubectl get deployments php-apache
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
php-apache 1 1 1 1 39