资源监控、弹性伸缩

  • 一、资源监控
  • 二、Pod水平伸缩



一、资源监控

Metrics Server是一个集群范围的资源使用情况的数据聚合器。作为一个应用部署在集群中。
Metric server从每个节点上Kubelet API收集指标,通过Kubernetes聚合器注册在Master APIServer
早期版本使用cAdvisor采集数据,现已将cAdvisor集成到kubelet组件里面。当然我们可以使用kubectl top来查看监控信息

Kubernetes监控指标采集 kubernetes资源监控_容器

metrics项目地址:
https://github.com/kubernetes-sigs/metrics-server

部署metrics-server

wget https://github.com/kubernetes-sigs/metrics-server/releases/download/metrics-server-helm-chart-3.8.0/components.yaml

修改yaml文件,默认image使用google,image无法拉取,这里我们使用aliyun

133       containers:
134       - args:
135         - --cert-dir=/tmp
136         - --secure-port=4443
137         - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
138         - --kubelet-use-node-status-port
139         - --metric-resolution=15s
140         - --kubelet-insecure-tls
141         #image: k8s.gcr.io/metrics-server/metrics-server:v0.6.0
142         image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.0
143         imagePullPolicy: IfNotPresent

Kubernetes监控指标采集 kubernetes资源监控_kubernetes_02

kubectl apply -f components.yaml

执行后pod一直未处于就绪状态

Kubernetes监控指标采集 kubernetes资源监控_运维_03

查看pod状态信息,发现就绪检查失败。因为证书的原因,修改启动参数不验证https证书即可

Kubernetes监控指标采集 kubernetes资源监控_运维_04

  

  

Kubernetes监控指标采集 kubernetes资源监控_kubernetes_05

重新执行yaml文件,pod启动成功

Kubernetes监控指标采集 kubernetes资源监控_kubernetes_06

使用kubectl top 获取采集信息

[root@k8s-master ~]# kubectl  top node k8s-node1
NAME        CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-node1   336m         16%    965Mi           51%       
[root@k8s-master ~]# kubectl  top node k8s-node2
NAME        CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-node2   357m         17%    961Mi           51%       
[root@k8s-master ~]# kubectl  top pod my-busybox
NAME         CPU(cores)   MEMORY(bytes)   
my-busybox   0m           0Mi

二、Pod水平伸缩

HPA(Horizontal Pod Autoscaler)pod水平伸缩,可以基于cpu使用率、内存使用率自动扩缩 ReplicationController、Deployment和 StatefulSet 中的 Pod 数量,当然也可以基于其他监控程序的指标来执行扩缩容。

kubectl top/hpa -> apiserver -> metrics-server -> kubelet -> pod

要实现水平扩缩容必须满足两个条件:

  1. 集群必须安装metrics监控组件
  2. Pod必须配置resource.request(pod limit)

首先我们创建一个deployment,必须配置request字段

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: "0.5"
            memory: 100Mi
          requests:
            cpu: "0.2"
            memory: 50Mi

配置autoscale,最小1个副本最多4个副本,当cpu-percent超过80进行扩容

Kubernetes监控指标采集 kubernetes资源监控_kubernetes_07

创建svc暴露服务,方便访问nginx

Kubernetes监控指标采集 kubernetes资源监控_容器_08

使用ab工具压测测试,-w观察pod数量、HPA指标

Kubernetes监控指标采集 kubernetes资源监控_容器_09

HPA获取到cpu-percent超过80%,扩容,副本加1

Kubernetes监控指标采集 kubernetes资源监控_Pod_10

  

  

查看pod状态

Kubernetes监控指标采集 kubernetes资源监控_Kubernetes监控指标采集_11

我们再看下pod和endpoint状态

Kubernetes监控指标采集 kubernetes资源监控_Kubernetes监控指标采集_12

过一段时间负载下来后会自动进行缩容,时间大约5分钟。这块儿底层逻辑不太清楚,猜测这个时间应该是逻辑中去检测的时间

Kubernetes监控指标采集 kubernetes资源监控_Kubernetes监控指标采集_13

  

  

Kubernetes监控指标采集 kubernetes资源监控_Kubernetes监控指标采集_14