K8s 集群巡检

K8s 集群巡检

上次发文 K8s 无备份,不运维,文章开篇,插入了一张 K8s 集群巡检的图片,好多小伙伴私信留言,问我要开源地址。由于其通用性不高,大多数公司需要结合自身的架构情况进行不同的巡检,所以我没有开源。

今天发现有小伙伴还在群里讨论,有没有类似的工具/平台,虽然没有开源,我把其关键的 巡检指标后端核心伪代码 分享出来,供各位同行参考。

什么是平台巡检

平台巡检是一种监测和评估底层系统运行状况的工具,可帮助您快速发现系统中存在的潜在风险并给出相应修复建议。

该工具可用于扫描集群中的各个方面,包括系统性能瓶颈、业务组件运行状态、资源使用情况和配置问题等,以提高系统的性能、稳定性和可用性。

巡检的意义

我反复思考,有了 metrics/logs/traces + grafana + alert ,还需要巡检做什么?以下是我总结巡检的意义:

  • 是监控的补充,比如证书过期、Pod CIDR 使用情况、Etcd 备份情况、Velero 备份情况,通过脚本更方便查看状态,编写 exporter 周期较长
  • 可以监控 Prometheus、VictorMetric 等组件的状态,拉取最新数据情况,监控是否收集了各个组件的 metrics
  • 是主动式的发现问题,能迅速了解整个集群的核心指标的状态,集中式检查,不用一个个 Grafana 图标检查

K8s 巡检关键指标

分三类

  • 集群总览
  • 核心组件状态
  • 节点状态

里面的 Promql 和 Bash 脚本内容,需要根据实际情况进行配置!

集群总览

巡检项名称:Node 使用情况

描述:旨在查看集群 是否有备用资源

动作来源:bash

具体动作:

#!/bin/bash
#
# Node 数量巡检脚本

set -o errexit
set -o nounset

node_sum=$(kubectl get nodes | awk 'NR>1' | grep -v master -c)
node_ready=$(kubectl get nodes | awk 'NR>1' | grep -v master | grep -v SchedulingDisabled -c)
echo "| " "${node_ready}/${node_sum}"

if [[ $node_sum -gt $node_ready ]]; then
  echo "success"
else
  echo "warning"
fi

巡检项名称:Pod 剩余情况

描述:旨在查看 有无 Pod 资源可供分配

动作来源:prometheus

具体动作:

sum(kube_node_status_capacity{
   resource='pods'} * on(node) group_left(label_env) kube_node_labels{
   label_env=~"prod",cluster="core",zone=~"shanghai"} unless on(node) kube_node_role) -
sum(kube_pod_info *on (node) group_left(label_env) kube_node_labels{
   label_env=~"prod",cluster="core",zone=~"shanghai"} unless on(node) kube_node_role)

阈值:["<", 90]

巡检项名称:Pod CIDR 使用情况

描述:Pod 剩余可分配 IP 数量

动作来源:bash

具体动作:

#!/bin/bash
#
# Pod IP 剩余数量 巡检脚本

set -o errexit
set -o nounset

pod_ip_free=$(calicoctl ipam show | grep '%' | awk '{print $12}')
echo '| IP 剩余数量:' ${pod_ip_free}

if [[ $pod_ip_free -gt 500 ]]; then
  echo "success"
elif [[ $pod_ip_free -gt 100 ]]; then
  echo "warning"
else
  echo "error"
fi

巡检项名称:集群 CPU 使用率

动作来源:prometheus

具体动作:

(1 - avg(label_replace(rate(node_cpu_seconds_total{
   mode="idle", cluster="core",zone=~"shanghai"}[60s]), "internal_ip", "$1", "instance", "(.+):(\\d+)") and on(internal_ip) kube_node_labels{
   cluster="core",zone=~"shanghai"} * on(node) group_left(internal_ip) kube_node_info)) * 100

阈值:[">", 50]

巡检项名称:集群 MEM 使用率

动作来源:prometheus

具体动作:

(1 - sum(label_replace(node_memory_MemAvailable_bytes{
   cluster="core",zone=~"shanghai"}, "internal_ip", "$1", "instance", "(.+):(\\d+)") and on(internal_ip) kube_node_labels{
   cluster="core",zone=~"shanghai"} * on(node) group_left(internal_ip) kube_node_info) / sum(label_replace(node_memory_MemTotal_bytes{
   cluster="core",zone=~"shanghai"}, "internal_ip", "$1", "instance", "(.+):(\\d+)") and on(internal_ip) kube_node_labels{
   cluster="core",zone=~"shanghai"} * on(node) group_left(internal_ip) kube_node_info)) * 100

阈值:[">", 85]

巡检项名称:证书过期时间

动作来源:bash

具体动作:

#!/bin/bash
#
# 证书过期时间 巡检脚本

set -o errexit
set -o nounset

ct=$(date -d "$(openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates |awk -F '=' '/notAfter/{print $2}'|awk '{print $1,$2,$3,$4}')" +%s)
dt=$(date +%s)
expired=$(($(($ct-$dt))/(60*60*24)))
echo "| " $expired "天后过期"

if [[ $expired -gt 60 ]]; then
  echo "success"
elif [[ $expired -gt 15 ]]; then
  echo "warning"
else
  echo "error"
fi

巡检项名称:ectd 备份情况

描述:是否有最新备份

动作来源:bash

具体动作:

#!/bin/bash
#
# Etcd 备件检查脚本

set -o nounset

result=$(find /var/lib/docker/etcd_backup/ -mmin -120)
if [[ -n ${result} ]]; then
  echo "正常"
  echo "success"
else
  echo "异常"
  echo "error"
fi

巡检项名称:velero备份情况

描述:是否有最新备份

动作来源:bash

具体动作:

#!/bin/bash
#
# Velero 备件检查脚本

set -o nounset
current_date=$(date +%F)
backup_date=$(velero backup get | grep core-shanghai | awk '{print $5}' | sort -nr | head -1)
backup_date_2d=$(date -d "$backup_date +2 days" +%F)
if [<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值