天天看点

k8s之核心指标API Metrics-Server部署及HPA

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           

继续阅读