序文:
実稼働環境での kubernetes クラスターのインストールとデプロイは、初期段階ではほんのわずかな作業に過ぎませんが、実際の主な作業は、正式に稼働した後のクラスターの保守と管理に集中します。
kubernetesクラスタの巡回検査は比較的重要な作業であり、定期的・定期的な検査により、kubernetesクラスタの潜在的な問題の一部を事前に発見することができ、運用に影響を与える大きな問題が発生する前に問題を発見し、解決することができます。
次に、prometheus、grafana、zabbix などの監視ソフトウェアをインストールしてデプロイするのが一般的ですが、これらの監視システムが多かれ少なかれ kubernetes クラスターに侵入することは間違いなく、監視システムにもメンテナンスが必要です。これらにより、メンテナンスの作業負荷が事実上増加します。
シェル スクリプトを使用してクラスターの最も単純な監視を行うことは、間違いなく実行可能な解決策です。
Kubernetes クラスターの場合、次のことに重点を置く必要があります。
1、
kubernetes クラスターの主要なサービス (kubelet、kube-scheduel など)、これらのサービスが正常であるかどうか
2、
Kubernetes クラスターの全体的なリソース使用量 (すべてのノードのメモリや CPU など)、そのような主要なリソースの使用量と残りの量
特定のノードのメモリ使用量が高すぎる場合、それがどのノードであるかを通知し、リスト ファイルを生成し、リストに従って詳細な分析を実行して、クラスタの安定性を確保します。
3、
ポッドの分布 (ノード A でどのポッドが実行されているか、およびこれらのポッドが正常に実行されているかどうかなど)
4、
ポッドの再起動の数、この指標は重要な指標です。実際の運用では、リアルタイムで観察すると多くのポッドが実行状態にある可能性がありますが、実際には、これらのポッドは、生存プローブなどにより常に繰り返しデプロイされています。ポッドの状態が不安定である、一部のポッドが必要とするメモリが不十分である (ポッドには指定されたリソース クォータ ポリシーがある) ため、oom が発生する、その他の理由によりポッドが繰り返し再起動される (ポッドの再起動はポッドの再デプロイメントと同じ)
したがって、すべてのポッドの再起動時間を取得してリストを提供し、リスト ファイルにリストされているポッドに従って再起動の理由を 1 つずつ手動でクエリして、ポッドの健全性と安定性を確保する必要があります。 Kubernetes クラスター。
これらの要件に基づいて、次の kubernetes 検査スクリプトが作成されます。
一、
検査スクリプトの内容
#!/bin/bash
#!author zsk
#k8s集群日常巡检
if [ -d /opt/xunjian/$(date +'%Y-%m-%d') ];
then
echo "巡检目录已创建,今日巡检内容都存放到此目录/opt/xunjian/下"
else
mkdir -p /opt/xunjian/$(date +'%Y-%m-%d')
echo "/opt/xunjian/ 这个目录刚创建好"
fi
unhealthy=$(kubectl get cs | awk 'NR == 1 {next}{if($2 != "Healthy") print $1}' | wc -l) #组件状态异常数
kubeletError=$(systemctl status kubelet.service | grep ^"$(date | awk '{print$2,$3}')" | grep -i error | wc -l) #kubelet日志报错数
errorPod=$(kubectl get po -A | grep -v NAMESPACE| awk '{if($4 != "Running") print}' | wc -l ) #非runing状态pod数
restartPod=`kubectl get po -A |awk '{if($4>0)print$1,$4}'|grep -v NAME`
#查看controller-manager、scheduler、etcd状态
server_stat=/opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-server.txt
>$server_stat
echo -e "----------Controller-manager、Scheduler、Etcd-0检测中--------------------------------------"
if (( ${unhealthy} >=1 ));then
echo -e "\033[31m$(kubectl get cs | awk 'NR == 1 {next}{if($2 != "Healthy") print $1}') Unhealthy\033[0m" >$server_stat
else
echo -e "controller-manager、scheduler、etcd-0无异常">$server_stat
fi
#查看kubelet状态
echo -e "\n \n---------- Kubelet状态检测中 ----------"
if (( ${kubeletError} >=1 ));then
echo -e "\033[31mkubelet错误日志:\033[0m" ; systemctl status kubelet.service | grep ^"$(date | awk '{print$2,$3}')" |awk '{for (i=10;i<=NF;i++)printf("%s ", $i);print ""}' | grep -i error | sort -n | uniq >> node.txt 2>&1
else
echo -e "\033[32mkubelet无日志报错\033[0m"
fi
#查看Pods状态
echo -e "\n \n---------- Pods运行状态检测中 ----------"
>/opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-pod.txt
if [ ${errorPod} -gt 1 ];then
echo -e "异常的pod信息将写入下面的文件内"
echo -e "\033[31mErrorPod:\033[0m" && kubectl get po -A | grep -v NAMESPACE | awk '{if($4 != "Running") print}' > /opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-pod.txt
else
echo -e "所有pod运行状态都是running" > /opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-pod.txt
fi
if [ -n "$restartPod" ];
then
echo -e "以下是有重启的pod,请根据此清单排查pod的重启原因 \n">>/opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-pod.txt
echo -e "$restartPod" >>/opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-pod.txt
else
echo "所有pod没有重启的情况">>/opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-pod.txt
fi
#查看Node资源使用率
check_node(){
echo -e "\n \n---------- Nodes资源使用状态检测中 ----------"
>/opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-memory.txt
>/opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-node.txt
memWarn=0
for i in $(kubectl get nodes | awk 'NR == 1 {next}{print $1}');do
memRq=$(kubectl describe node $i | grep memory | grep % | awk '{print $3}' | sed "s/[^0-9]//g") #memory_request
memLim=$(kubectl describe node $i | grep memory | grep % | awk '{print $5}' | sed "s/[^0-9]//g") #memory_limit
cpuUsed=$(kubectl top nodes $i | awk 'NR == 1 {next}{print $3}'| sed "s/[^0-9]//g") #cpu使用率
memUsed=$(kubectl top nodes $i | awk 'NR == 1 {next}{print $5}'| sed "s/[^0-9]//g") #内存使用率
if (( $cpuUsed > 0)) || (( $memUsed > 0 ));then
let memWarn+=1
echo -e "$i\tCPU使用率:$cpuUsed%\t内存使用率:$memUsed" >> /opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-node.txt
fi
if [ $memUsed -gt 95 ];then
let memWarn+=1
echo "|||+++++++++++++++++++++++++++++++++++++++++++|||" >> /opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-memory.txt
echo -e "$i\t内存使用率超出预期,请检查内存占用率过高的原因!!!" >> /opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-memory.txt
echo "|||++++++++++++++++++++++++++++++++++++++++++|||" >> /opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-memory.txt
echo -e "\n \n \n" >> /opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-memory.txt
else
echo -e "$i 该节点的内存在正常范围内" >> /opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-memory.txt
fi
done
#if (( $memWarn ==0 ));then
# echo -e "无节点CPU、内存使用异常" >> /opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-memory.txt
#fi
}
check_node
##获取node的详情,记录每个节点内的运行了哪些pod,以及pod的资源使用情况
>/opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-describenode.txt
for e in $(kubectl get node |grep -v NAME|awk '{print $1}')
do
kubectl describe node $e >> /opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-describenode.txt 2>&1
echo -e "\n \n" >>/opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-describenode.txt
echo "||++++++++++++++++++++++++++++++++++++++这是分隔这是分隔这是分隔这是分隔+++++++++++++||" >>/opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-describenode.txt
done
jilu_tar(){
cd /opt/xunjian
tar cvjf /opt/xunjian.tar.gz /opt/xunjian
echo "打包成功"
}
jilu_tar
二、
検査スクリプトを使用するための前提条件
1、
metric-server プラグインは、スクリプト内の多くの重要なデータがこのプラグインを通じてクエリされるため、kubernetes クラスターにデプロイする必要があります。
metric-server のデプロイメントについては、私のブログを参照してください。
2、
kubernetes クラスターは kubeadm モードでデプロイされ、etcd クラスターは内部スタッキングの形式でデプロイされます。これは、スクリプト内のサービス チェックが kubectl get cs コマンドを通じてチェックされるためです。
三つ、
スクリプトの説明
スクリプトは 5 つのファイルを生成します。ファイル ストレージ パスは /opt/xunjian/current date、日付形式は 2023-07-12 です。
記述ファイルには、すべてのノードの詳細情報が保存されます
メモリ ファイルには、すべてのノードのメモリ使用量が保存されます。スクリプトで設定された 95 を超えると、プロンプトが表示されます。
ノード ファイルには、現在のノードのリソース使用量が保存されます。最初の列はノード IP、2 列目は CPU 使用率、3 列目はメモリ使用率です。
ポッド ファイルには、再起動されたポッドの名前と再起動回数が保存されます。ポッドが正常な場合は、異常なポッドは出力されません。
サーバー ファイルには、クラスターの主要なサービスが正常かどうかが保存され、異常がある場合にはプロンプトが表示されます。