kubernetes中metrics-server与HPA

一、 K8S监控组件metrics-server

安装步骤


1.添加开源社的仓库
[root@k8s-master ~]# helm repo add kaiyuanshe http://mirror.kaiyuanshe.cn/kubernetes/charts/


#搜索metrics-server
[root@k8s-master ~]# helm search repo metrics-server

2.下载metrics-server包
helm pull kaiyuanshe/metrics-server

3.解压
tar -xf metrics-server-2.11.4.tgz

4.修改values.yaml文件
cd metrics-server

vim values.yaml

# 替换成下面的镜像源和版本号
image:
  repository: registry.cn-hangzhou.aliyuncs.com/linxiaowen/metrics-server
  tag: v0.4.1


args: []	# 删掉括号,换行写入下方内容,经测试,下面缩不缩进都没关系,如果端口冲突则在下方修改。
  - --cert-dir=/tmp
  - --secure-port=6443
  - --metric-resolution=30s
  - --kubelet-insecure-tls
  - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,externalDNS
  - --requestheader-username-headers=X-Remote-User
  - --requestheader-group-headers=X-Remote-Group
  - --requestheader-extra-headers-prefix=X-Remote-Extra-
  
  # 如果出现端口被占用了,改端口的话,需要改两个文件三处地方一起改端口(注:必须同时修改以下端口)
[root@k8s-m-01 metrics-server]# grep -R '8443' ./
./templates/metrics-server-deployment.yaml:            - --secure-port=6443
./templates/metrics-server-deployment.yaml:          - containerPort: 6443
./values.yaml:  - --secure-port=6443


5.创建用户
[root@k8s-master metrics-server]# kubectl create clusterrolebinding system:anonymous  --clusterrole=cluster-admin  --user=system:anonymous
 
 
6.安装metrics-server 
[root@k8s-master metrics-server]# helm install metrics-server ./


7.查看metrics-server的pod服务跑起来没有
[root@k8s-master metrics-server]# kubectl get pod
metrics-server-675ccccb46-84pbm               1/1     Running   0          19m

7.服务起来后测试命令
[root@k8s-m-01 metrics-server]# kubectl top nodes
NAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-master   110m         5%     948Mi           32%       
k8s-node1    41m          2%     1013Mi          35%       
k8s-node2    60m          3%     1228Mi          42%    

[root@k8s-m-01 metrics-server]# kubectl top pod
NAME                                          CPU(cores)   MEMORY(bytes)   
nfs-nfs-client-provisioner-8557b8c764-lc4nx   3m           6Mi 

二、HPA自动伸缩

在生产环境中,总会有一些意想不到的事情发生,比如公司网站流量突然升高,此时之前创建的Pod已不足以撑住所有的访问,而运维人员也不可能24小时守着业务服务,这时就可以通过配置HPA,实现负载过高的情况下自动扩容Pod副本数以分摊高并发的流量,当流量恢复正常后,HPA会自动缩减Pod的数量。HPA是根据CPU的使用率、内存使用率自动扩展Pod数量的,所以要使用HPA就必须定义Requests参数。

HPA全称是Horizontal Pod Autoscaler,翻译成中文是POD水平自动伸缩HPA可以基于CPU利用率对replication controller、deployment和replicaset中的pod数量进行自动扩缩容(除了CPU利用率也可以基于其他应程序提供的度量指标custom metrics进行自动扩缩容)。pod自动缩放不适用于无法缩放的对象,比如DaemonSets。HPA由Kubernetes API资源和控制器实现。资源决定了控制器的行为。控制器会周期性的获取平均CPU利用率,并与目标值相比较后来调整replication controller或deployment中的副本数量。


# 编写pod资源清单
kind: Deployment
apiVersion: apps/v1
metadata:
  name: hpa
spec:
  selector:
    matchLabels:
      app: hpa
  template:
    metadata:
      labels:
        app: hpa
    spec:
      containers:
        - name: hpa
          image: alvinos/django:v1
          resources:
            requests:           # 最少使用多少资源
              cpu: 100m         # cpu最少给100m
              memory: 100Mi     # 内存最少给100Mi

            limits:             # 最多使用多少资源
              cpu: 200m         # cpu最多给200m,最多不能超过
              memory: 200Mi     # 内存最多给200Mi,最多不能超过
---
# 配置HPA资源清单
kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2beta1
metadata:
  name: hpa
  namespace: default
spec:
  # HPA的最小pod数量和最大pod数量
  maxReplicas: 10
  minReplicas: 2
  # HPA的伸缩对象描述,HPA会动态修改该对象的pod数量
  scaleTargetRef:
    kind: Deployment
    name: hpa
    apiVersion: apps/v1
  # 监控的指标数组,支持多种类型的指标共存
  metrics:
    - type: Resource
      #  核心指标,包含cpu和内存两种(被弹性伸缩的pod对象中容器的requests和limits中定义的指标。)
      resource:
        name: cpu
        # CPU 阈值
        # 计算公式:所有目标pod的metric的使用率(百分比)的平均值,
        # 例如limit.cpu=1000m,实际使用500m,则utilization=50%
        # 例如(副本数)deployment.replica=3, limit.cpu=1000m,则pod1实际使用cpu=500m, pod2=300m, pod=600m
        ## 则averageUtilization=(500/1000+300/1000+600/1000)/3 = (500 + 300 + 600)/(3*1000))=0.4666666666666667
        # 例如limit设置200m   40 41 42    计算的结果是:(40+41+42)/600=0.205
        targetAverageUtilization: 40      # 注:超过0.4%就写40,cpu超过40就立即扩容,cpu最多扩容10个,最小2个。200*0.4=80(80以下都是它的安全范围)

---
# 编写service资源清单
kind: Service
apiVersion: v1
metadata:
  name: hpa
spec:
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: hpa

单位解释

requests:代表容器启动请求的资源限制,分配的资源必须要达到此要求
limits:代表最多可以请求多少资源
单位m:CPU的计量单位叫毫核(m)。一个节点的CPU核心数量乘以1000,得到的就是节点总的CPU总数量。如,一个节点有两个核,那么该节点的CPU总量为2000m。

下面拿双核举例:

  resources:
    requests:
      cpu: 50m     #等同于0.05
      memory: 512Mi
    limits:
      cpu: 100m    #等同于0.1
      memory: 1Gi

含义:该容器启动时请求50/2000的核心(2.5%)并且允许最多使用100/2000核心(5%)
0.05个核除总核数量2就是2.5%了,0.1个核除总核数就2是5%了

        resources:
          requests:
            cpu: 100m    #等同于0.1
            memory: 512Mi
          limits:
            cpu: 200m    #等同于0.2
            memory: 1Gi

cpu单位m的含义:该容器启动时请求100/2000的核心(5%)并且允许最多使用200/2000核心(10%)
0.1个核除总核数量2就是5%了,0.2个核除总核数2就是10%了

应用

2、# 应用资源
[root@k8s-master ~]# kubectl apply -f hpa.yaml 
deployment.apps/hpa created

# 查看hpa监控cpu的使用率
[root@k8s-master ~]#kubectl get horizontalpodautoscalers.autoscaling 
NAME   REFERENCE        TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa    Deployment/hpa   24%/40%   2         10        2          53s

3、# 查看主机资源使用率
[root@k8s-master ~]# kubectl top pods
NAME                                          CPU(cores)   MEMORY(bytes)   
hpa-5cb8bcdc4f-xvkkf                          11m          54Mi  

# 查看pod运行详情
[root@k8s-master ~]# kubectl get pods
NAME                                          READY   STATUS    RESTARTS   AGE
hpa-5cb8bcdc4f-xvkkf                          1/1     Running   0          7m4s

# 查看svc运行详情
[root@k8s-master ~]# kubectl get svc
NAME                           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
hpa                            ClusterIP   10.1.159.102   <none>        80/TCP           6m50s


# 给集群上每个节点输入下面的命令,进行压力测试
[root@k8s-master ~]# while true; do curl 10.1.159.102/index; echo ''; done

# 再次查看本pod的CPU运行状态(cpu流量会增大,如下所示)
[root@k8s-master ~]# kubectl top pods
NAME                                          CPU(cores)   MEMORY(bytes)   
hpa-5cb8bcdc4f-xvkkf                          163m         56Mi 

# 再次查看pod的数量会增加(这就实现了用HPA监控cpu使用率,随着cpu的使用率的增大会自动扩容pod容器)
[root@k8s-master ~]# kubectl get pods
NAME                                          READY   STATUS    RESTARTS   AGE
hpa-7f5d745bf9-45fkj                          1/1     Running   0          4m39s
hpa-7f5d745bf9-5qb4d                          1/1     Running   0          4m55s
hpa-7f5d745bf9-5vnfl                          1/1     Running   0          4m40s
hpa-7f5d745bf9-fh66r                          1/1     Running   0          4m55s
hpa-7f5d745bf9-fnlx4                          1/1     Running   0          15m
hpa-7f5d745bf9-g7r5c                          1/1     Running   0          4m55s
hpa-7f5d745bf9-qdrc7                          1/1     Running   0          4m39s
hpa-7f5d745bf9-s2sbx                          1/1     Running   0          4m39s
hpa-7f5d745bf9-sz9zz                          1/1     Running   0          6m56s
hpa-7f5d745bf9-zw778                          1/1     Running   0          16m

可以看到自动伸缩到十个。

猜你喜欢

转载自blog.csdn.net/m0_46090675/article/details/122287056
今日推荐