MST
星途 面试题库

面试题:Bash脚本优化云原生应用的资源调度与监控

在一个复杂的云原生环境中,有多个不同类型的应用运行在Kubernetes集群上。现需要编写一个Bash脚本,实时监控这些应用的CPU和内存使用情况,当发现某个应用资源使用持续超过设定阈值(例如CPU使用率80%,内存使用率70%)时,自动通过Kubernetes API对该应用进行资源调整(增加或减少CPU和内存配额),并且在调整后发送通知到Slack群组。请详细阐述实现此功能的完整Bash脚本设计思路、涉及的技术点及具体代码实现。
38.5万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 监控资源使用:通过 kubectl top 命令获取Kubernetes集群中应用的CPU和内存使用情况。
  2. 比较阈值:将获取到的资源使用数据与设定的阈值(CPU 80%,内存 70%)进行比较。
  3. 资源调整:如果某个应用资源使用超过阈值,利用 kubectl scale 或直接修改 Deployment 的资源配额通过 kubectl apply 来调整资源。
  4. Slack通知:使用Slack Webhook将资源调整的信息发送到指定的Slack群组。

涉及技术点

  1. Kubernetes命令行工具(kubectl):用于与Kubernetes集群交互,获取资源使用情况和调整资源配额。
  2. Bash脚本基础:包括变量定义、循环、条件判断等。
  3. Slack Webhook:用于向Slack群组发送通知。

具体代码实现

#!/bin/bash

# 设定阈值
CPU_THRESHOLD=80
MEM_THRESHOLD=70

# 获取所有Pod的CPU和内存使用情况
RESOURCE_USAGE=$(kubectl top pods --all-namespaces)

# 逐行处理资源使用信息
while read -r line; do
    if [[ $line != "NAME                                     CPU(cores)   MEMORY(bytes)" ]]; then
        # 解析每行数据
        IFS=' ' read -r -a parts <<< "$line"
        NAMESPACE=${parts[0]}
        POD_NAME=${parts[1]}
        CPU_USAGE=${parts[2]%?}
        MEM_USAGE=${parts[4]%?}

        # 检查CPU使用情况
        if (( $(echo "$CPU_USAGE >= $CPU_THRESHOLD" | bc -l) )); then
            # 调整CPU配额,这里假设增加10%,实际需根据集群情况调整
            NEW_CPU=$(echo "$CPU_USAGE * 1.1" | bc)
            kubectl patch deployment $POD_NAME -n $NAMESPACE -p "{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"$POD_NAME\",\"resources\":{\"requests\":{\"cpu\":\"$NEW_CPU\"},\"limits\":{\"cpu\":\"$NEW_CPU\"}}}]}}}"
            # 发送Slack通知
            SLACK_MESSAGE="CPU usage of $POD_NAME in $NAMESPACE exceeds threshold. CPU quota adjusted to $NEW_CPU"
            curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$SLACK_MESSAGE\"}" <SLACK_WEBHOOK_URL>
        fi

        # 检查内存使用情况
        if (( $(echo "$MEM_USAGE >= $MEM_THRESHOLD" | bc -l) )); then
            # 调整内存配额,这里假设增加10%,实际需根据集群情况调整
            NEW_MEM=$(echo "$MEM_USAGE * 1.1" | bc)
            kubectl patch deployment $POD_NAME -n $NAMESPACE -p "{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"$POD_NAME\",\"resources\":{\"requests\":{\"memory\":\"$NEW_MEM\"},\"limits\":{\"memory\":\"$NEW_MEM\"}}}]}}}"
            # 发送Slack通知
            SLACK_MESSAGE="Memory usage of $POD_NAME in $NAMESPACE exceeds threshold. Memory quota adjusted to $NEW_MEM"
            curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$SLACK_MESSAGE\"}" <SLACK_WEBHOOK_URL>
        fi
    fi
done <<< "$RESOURCE_USAGE"

注意:

  1. <SLACK_WEBHOOK_URL> 需要替换为实际的Slack Webhook URL。
  2. 资源调整策略(如增加或减少的比例)需根据实际集群情况和应用需求进行调整。
  3. 上述代码中的 deployment 假设应用是以Deployment方式部署,若为其他方式(如StatefulSet等),需相应修改 kubectl 命令。