面试题答案
一键面试设计思路
- 监控资源使用:通过
kubectl top
命令获取Kubernetes集群中应用的CPU和内存使用情况。 - 比较阈值:将获取到的资源使用数据与设定的阈值(CPU 80%,内存 70%)进行比较。
- 资源调整:如果某个应用资源使用超过阈值,利用
kubectl scale
或直接修改Deployment
的资源配额通过kubectl apply
来调整资源。 - Slack通知:使用Slack Webhook将资源调整的信息发送到指定的Slack群组。
涉及技术点
- Kubernetes命令行工具(kubectl):用于与Kubernetes集群交互,获取资源使用情况和调整资源配额。
- Bash脚本基础:包括变量定义、循环、条件判断等。
- 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"
注意:
<SLACK_WEBHOOK_URL>
需要替换为实际的Slack Webhook URL。- 资源调整策略(如增加或减少的比例)需根据实际集群情况和应用需求进行调整。
- 上述代码中的
deployment
假设应用是以Deployment方式部署,若为其他方式(如StatefulSet等),需相应修改kubectl
命令。