k8s学习笔记-资源限制和资源指标监控

k8s支持内存和cpu的限制
https://kubernetes.io/zh/docs/concepts/configuration/manage-compute-resources-container/
requests:容器运行需求,最低保障
limits:限制,硬限制(资源上限)
CPU:
正实数,代表分配几颗CPU,可以是小数点,比如0.5代表0.5颗CPU,意思是一颗CPU的一半时间。2代表两颗CPU。
正整数m,也代表1000m=1,所以500m等价于0.5。
1颗逻辑CPU(1核CPU=4个逻辑CPU)
1物理核=1000个微核(millicores)
1000m=1CPU
内存:
正整数,直接的数字代表Byte
k、K、Ki,Kilobyte
m、M、Mi,Megabyte
g、G、Gi,Gigabyte
t、T、Ti,Terabyte
p、P、Pi,Petabyte
kubectl explain pods.spec.containers.resources
[root@master metrics]# vim pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
     name: pod-demo
labels:
     app: myapp
spec:
   containers:
   -  name: myapp
      image: ikubernetes/stress-ng
      command: ["/usr/bin/stress-ng", "-c 1", "--metrics-brief"] #-c 1表示启动一个子进程对cpu做压测.默认stress-ng的一个子进程使用256M内存
      resources:
         requests:
            cpu:  "200m"
            memory:  "128Mi"
         limits:
            cpu:  "500m"
            memory:  "512Mi"
[root@master metrics]# kubectl apply -f pod-demo.yaml
pod/pod-demo created
[root@master metrics]# kubectl get pods
NAME        READY               STATUS          RESTARTS      AGE
pod-demo      1/1                   Running                  0                6s
[root@master metrics]# kubectl exec pod-demo -- top 可以看看CPU 的使用率,是否满足最大限制
我们对容器分配了资源限制后,k8s会自动分配一个QoS,叫服务质量,

通过kubectl describe pods pod_name可以查看这个字段;
[root@master metrics]# kubectl describe pods pod-demo |grep QoS
QoS Class: Burstable
Qos类别:
1.Guranteed:(优选级最高)
(每个容器)同时设置了CPU和内存的requests和limits,cpu.limits=cpu.requests,memory.limits=memory。request
2.Burstable:(优先级第二)
至少有一个容器设置了CPU或内存资源的requests属性
3.BestEffort:(最低优先级)
没有任何一个容器设置了requests或limits属性
当资源不够使用时,BestEffort状态的容器会被优先终止(根据优先级终止)
k8s是以资源的实际占用量和requests设置的需求量的比例,优先终止实际占用量和requests的需求量高的
(例如设置requests为512M的内存,实际使用500M与requests为1g,实际使用600M,会优先终止使用500M容器的pod)
kubectl top pod 报错
因为缺少Heapster这个插件

Heapster 在 k8s 1.11 时就已经不添加新功能了,在 1.12 时已经从 k8s 安装脚本中删除掉了,在 1.13 中已经彻底切除连错误修正都不会更新了。详情可以查看说明

资源指标的监控:

 

kubernetes的监控指标分为两种:

 

Core metrics(核心指标):从 Kubelet、cAdvisor 等获取度量数据,再由metrics-server提供给 Dashboard、HPA 控制器等使用。

 

Custom Metrics(自定义指标):由Prometheus Adapter提供API custom.metrics.k8s.io,由此可支持任意Prometheus采集到的指标。

 

核心指标只包含node和pod的cpu、内存等,一般来说,核心指标作HPA已经足够,但如果想根据自定义指标:如请求qps/5xx错误数来实现HPA,就需要使用自定义指标了,目前Kubernetes中自定义指标一般由Prometheus来提供,再利用k8s-prometheus-adpater聚合到apiserver,实现和核心指标(metric-server)同样的效果。

 

以下是官方metrics的项目介绍:

 

Resource Metrics API(核心api)

 

Heapster
Metrics Server


Custom Metrics API:

 

Prometheus Adapter
Microsoft Azure Adapter
Google Stackdriver
Datadog Cluster Agent

总要用到上面标红的组件

资源指标:metrics-server,
自定义指标:prometheus,k8s-prometheus-adapter
新一代架构:
核心指标流水线:
由kubelet metrics-server已经由API server提供的api组成;CPU累积使用率,内存的实时使用率,Pod的资源占用率和容器的磁盘占用率;

其中核心指标的获取原先是由heapster进行收集,但是在1.11版本之后已经被废弃,从而由新一代的metrics-server所代替对核心指标的汇聚。核心指标的收集是必要的。如下图:

 


监控流水线:
用于从系统收集各种指标数据并提供终端用户,存储,系统已经HPA,它包括核心指标和许多核心指标。非核心指标本身不能被K8S解析

 Metrics Server

Metrics Server 是用来监控 k8s 集群资源使用情况的组件,是用来替换掉之前的 Heapster 的。从 k8s 1.8 开始,

资源的使用情况就可以通过 Metrics API 的形式获取到,Metrics Server 组件就是其具体的实现

资源指标和其他的API指标并没有啥区别,它是通过API Server的URL路径/apis/metrics.k8s.io/进行存取,只有在k8s集群内部署了metrics-server应用才能只用API,其简单的结构图如下:

Metrics Server 通过 Kubernetes 聚合 器( kube- aggregator) 注册 到 主 API Server 之上, 而后 基于 kubelet 的 Summary API 收集 每个 节 点上 的 指标 数据, 并将 它们 存储 于 内存 中 然后 以 指标 API 格式 提供

如下图:

注: 默认是没有这个API 的,需要安装了metrics server才会有

通过kubectl api-versions 可以查看相关的API

Metrics Server基于 内存 存储, 重 启 后 数据 将 全部 丢失, 而且 它 仅能 留存 最近 收集 到 的 指标 数据, 因此, 如果 用户 期望 访问 历史 数据, 就不 得不 借助于 第三方 的 监控 系统( 如 Prometheus 等)。

一般说来, Metrics Server 在 每个 集群 中 仅 会 运行 一个 实例, 启动 时, 它将 自动 初始化 与 各 节点 的 连接, 因此 出于 安全 方面 的 考虑, 它 需要 运行 于 普通 节点 而非 Master 主机 之上。 直接 使用 项目 本身 提供 的 资源 配置 清单 即 能 轻松 完成 metrics- server 的 部署。

安装Metrics Server

官网地址

https://github.com/kubernetes-incubator/metrics-server

k8s 插件加载的地址

https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/metrics-server

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

[root@k8s-master ~]# cd metrics-server/deploy/1.8+/
[root@k8s-master 1.8+]# ll
-rw-r--r-- 1 root root 384 4月 28 09:46 aggregated-metrics-reader.yaml
-rw-r--r-- 1 root root 308 4月 28 09:46 auth-delegator.yaml
-rw-r--r-- 1 root root 329 4月 28 09:46 auth-reader.yaml
-rw-r--r-- 1 root root 298 4月 28 09:46 metrics-apiservice.yaml
-rw-r--r-- 1 root root 815 4月 28 09:46 metrics-server-deployment.yaml
-rw-r--r-- 1 root root 291 4月 28 09:46 metrics-server-service.yaml
-rw-r--r-- 1 root root 502 4月 28 09:46 resource-reader.yaml

注意:这里面要修改了2个地方:

metrics-server-deployment.yaml 

 

 

因为里面涉及到的镜像

image: k8s.gcr.io/metrics-server-amd64:v0.3.3 国内不FQ是下载不到的

在各节点运行下面命令

docker pull mirrorgooglecontainers/metrics-server-amd64:v0.3.3
docker tag mirrorgooglecontainers/metrics-server-amd64:v0.3.3 k8s.gcr.io/metrics-server-amd64:v0.3.3
docker rmi mirrorgooglecontainers/metrics-server-amd64:v0.3.3

1.镜像拉取策略,默认是Always(这种策略总是拉取镜像,不管本地 有没有)

   image: k8s.gcr.io/metrics-server-amd64:v0.3.2
   imagePullPolicy: IfNotPresent

2添加命令和相关参数

command: - /metrics-server

-  --metric-resolution=30s

-  --kubelet-insecure-tls

-  --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

如果不增加command区域的参数则会报如下错误:

kubectl logs metrics-server-7b7cf668f7-m8hmv -n kube-system

unable to fully collect metrics: [unable to fully scrape metrics from source kubelet_summary:k8s-master: unable to fetch metrics from Kubelet k8s-master (k8s-master): Get https://k8s-master:10250/stats/summary/: dial tcp: lookup k8s-master on 10.96.0.10:53: no such host, unable to fully scrape metrics from source kubelet_summary:k8s-node1: unable to fetch metrics from Kubelet k8s-node1 (k8s-node1): Get https://k8s-node1:10250/stats/summary/: dial tcp: lookup k8s-node1 on 10.96.0.10:53: no such host, unable to fully scrape metrics from source kubelet_summary:k8s-node2: unable to fetch metrics from Kubelet k8s-node2 (k8s-node2): Get https://k8s-node2:10250/stats/summary/: dial tcp: lookup k8s-node2 on 10.96.0.10:53: no such host]

提示 无法解析节点的主机名,是metrics-server这个容器不能通过CoreDNS 10.96.0.10:53 解析各Node的主机名,metrics-server连节点时默认是连接节点的主机名,需要加个参数,让它连接节点的IP,同时因为10250是https端口,连接它时需要提供证书,所以加上--kubelet-insecure-tls,表示不验证客户端证书,此前的版本中使用--source=这个参数来指定不验证客户端证书。
这样,修改完下载下来的文件就可以部署了

 

cd metrics-server/deploy/1.8+/

Kubectl apply –f /.

 

[root@k8s-master 1.8+]# kubectl get pods -n kube-system |egrep metrics
metrics-server-7b7cf668f7-hqt6j 1/1 Running 0 15s

[root@k8s-master 1.8+]# kubectl logs metrics-server-644bbfc74-hzthx -n kube-system
I0520 15:42:22.198619 1 serving.go:312] Generated self-signed cert (apiserver.local.config/certificates/apiserver.crt, apiserver.local.config/certificates/apiserver.key)
I0520 15:42:23.192265 1 secure_serving.go:116] Serving securely on [::]:443

[root@k8s-master k8s]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-deploy-675558bfc5-2qdmk 1/1 Running 0 50s
myapp-deploy-675558bfc5-lg22q 1/1 Running 0 50s
myapp-deploy-675558bfc5-zf85w 1/1 Running 0 50s
[root@k8s-master k8s]# kubectl top pods
NAME CPU(cores) MEMORY(bytes)
myapp-deploy-675558bfc5-2qdmk 0m 2Mi
myapp-deploy-675558bfc5-lg22q 0m 2Mi
myapp-deploy-675558bfc5-zf85w 0m 2Mi
[root@k8s-master k8s]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 245m 12% 1757Mi 47%
k8s-node1 87m 4% 2291Mi 62%
k8s-node2 70m 3% 794Mi 21%
说明部署完成 ,

kubectl api-versions|egrep metrics

metrics.k8s.io/v1beta1

可以看到已经有相关的API 版本了,也可以通过url 来测试

[root@k8s-master 1.8+]# kubectl proxy --port=8080

[root@k8s-master ~]# curl localhost:8080/apis/metrics.k8s.io/v1beta1/pods

另一种安装方式(推荐安装,因为是经过K8S 测试加入插件安装目录的)

官方YAML链接

查看文章

https://www.cnblogs.com/linuxk/p/10560022.html

这里需要注意一点,里面会涉及到另一个镜像,国内是无法下载的

 

 

 

参考地址

https://github.com/kubernetes/autoscaler/tree/master/addon-resizer

[root@k8s-master metrics]# egrep "image:" metrics-server-deployment.yaml
image: k8s.gcr.io/metrics-server-amd64:v0.3.3
image: k8s.gcr.io/addon-resizer:1.8.4

这里通过下面命令运行,在各节点运行

docker pull mirrorgooglecontainers/addon-resizer:1.8.4

docker tag   mirrorgooglecontainers/addon-resizer:1.8.4  k8s.gcr.io/addon-resizer:1.8.4

 

posted @ 2019-05-21 17:14  屌丝的IT  阅读(1884)  评论(0编辑  收藏  举报