前言:
生產(chǎn)環(huán)境下的kubernetes集群安裝部署僅僅是前期的一點點工作,主要的工作其實是集中在集群正式運行后的維護,管理工作。
而kubernetes集群的巡視檢查工作是一個比較重要的工作,可以通過定時,定期的巡檢能夠提前發(fā)現(xiàn)kubernetes集群的一些潛在問題,從而在發(fā)生大的影響運行的問題前發(fā)現(xiàn)問題并解決問題。
那么,通常的做法是安裝部署監(jiān)控軟件,例如,prometheus,grafana,zabbix這些,但,毫無疑問的,這些監(jiān)控系統(tǒng)或多或少的會對kubernetes集群有所侵入,并且監(jiān)控系統(tǒng)也是需要維護的,這些無形中增加了我們的維護工作量。
OK,那么使用shell腳本來對集群做一個最為簡單的監(jiān)控,無疑是一個可行的方案。
對于kubernetes集群來說,我們關注的點應該是以下幾點:
1,
kubernetes集群的關鍵服務,例如,kubelet,kube-scheduel,這些服務是否正常
2,
kubernetes集群的整體資源使用率,例如,所有節(jié)點的內(nèi)存,CPU,這樣的關鍵資源使用了多少,剩余多少
如果某個節(jié)點的內(nèi)存使用率過高,會提示我們是哪個節(jié)點,并生成清單文件,按照清單來進行詳細的分析,從而保證集群的穩(wěn)定。
3,
pod的分布,例如,A節(jié)點有哪些pod在運行,這些pod運行是否正常
4,
pod的重啟次數(shù),該指標是一個關鍵的指標,在實際的生產(chǎn)中,很多pod可能實時觀察的時候是running狀態(tài)的,但其實這些pod在不停的反復部署,例如,因為某個存活探針的狀態(tài)不穩(wěn)定,某些pod需要的內(nèi)存不足(pod有指定資源配額策略),造成了oom,等等各種原因都會造成pod反復重啟(pod重啟也就是等于pod重新部署)
因此,我們需要抓取所有pod的重啟次數(shù),并提供一個清單,后續(xù)手動的按照清單文件內(nèi)所列的pod,挨個查詢重啟原因,以此來保證pod的健康,進而保證kubernetes集群的穩(wěn)定。
基于這些需求,編寫了以下的kubernetes巡檢腳本
一,
巡檢腳本的內(nèi)容
#!/bin/bash
#!author zsk
#k8s集群日常巡檢
if [ -d /opt/xunjian/$(date +'%Y-%m-%d') ];
then
echo "巡檢目錄已創(chuàng)建,今日巡檢內(nèi)容都存放到此目錄/opt/xunjian/下"
else
mkdir -p /opt/xunjian/$(date +'%Y-%m-%d')
echo "/opt/xunjian/ 這個目錄剛創(chuàng)建好"
fi
unhealthy=$(kubectl get cs | awk 'NR == 1 {next}{if($2 != "Healthy") print $1}' | wc -l) #組件狀態(tài)異常數(shù)
kubeletError=$(systemctl status kubelet.service | grep ^"$(date | awk '{print$2,$3}')" | grep -i error | wc -l) #kubelet日志報錯數(shù)
errorPod=$(kubectl get po -A | grep -v NAMESPACE| awk '{if($4 != "Running") print}' | wc -l ) #非runing狀態(tài)pod數(shù)
restartPod=`kubectl get po -A |awk '{if($4>0)print$1,$4}'|grep -v NAME`
#查看controller-manager、scheduler、etcd狀態(tài)
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狀態(tài)
echo -e "\n \n---------- Kubelet狀態(tài)檢測中 ----------"
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狀態(tài)
echo -e "\n \n---------- Pods運行狀態(tài)檢測中 ----------"
>/opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-pod.txt
if [ ${errorPod} -gt 1 ];then
echo -e "異常的pod信息將寫入下面的文件內(nèi)"
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運行狀態(tài)都是running" > /opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-pod.txt
fi
if [ -n "$restartPod" ];
then
echo -e "以下是有重啟的pod,請根據(jù)此清單排查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資源使用狀態(tài)檢測中 ----------"
>/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") #內(nèi)存使用率
if (( $cpuUsed > 0)) || (( $memUsed > 0 ));then
let memWarn+=1
echo -e "$i\tCPU使用率:$cpuUsed%\t內(nèi)存使用率:$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內(nèi)存使用率超出預期,請檢查內(nèi)存占用率過高的原因?。?!" >> /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 該節(jié)點的內(nèi)存在正常范圍內(nèi)" >> /opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-memory.txt
fi
done
#if (( $memWarn ==0 ));then
# echo -e "無節(jié)點CPU、內(nèi)存使用異常" >> /opt/xunjian/$(date +'%Y-%m-%d')/$(date +'%Y-%m-%d')-memory.txt
#fi
}
check_node
##獲取node的詳情,記錄每個節(jié)點內(nèi)的運行了哪些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,
需要kubernetes集群內(nèi)部署有metric-server 插件即可,因為腳本內(nèi)很多關鍵數(shù)據(jù)是通過此插件來查詢的
metric-server的部署見我的博客:
云原生|kubernetes|centos7下離線化部署kubesphere-3.3.2---基于kubernetes-1.22.16(從網(wǎng)絡插件開始記錄)_kubesphere離線部署_晚風_END的博客-CSDN博客
2,
kubernetes集群是以kubeadm方式部署的,etcd集群是內(nèi)部堆疊形式部署的,因為腳本內(nèi)的服務檢查是通過kubectl get cs命令來檢查的
三,
腳本說明
該腳本將會生成5個文件,文件存放路徑是/opt/xunjian/當前日期? 日期格式為2023-07-12
describe文件保存了所有節(jié)點的詳細信息
memory文件保存了所有節(jié)點內(nèi)存使用率,如果超出腳本內(nèi)設定的95,將會提示
node文件保存了當前的節(jié)點的資源使用情況,第一列是節(jié)點IP,第二列是cpu使用率,第三列是內(nèi)存使用率
pod文件保存了有過重啟的pod的名稱和重啟次數(shù),如果pod都正常,打印無異常pod文章來源:http://www.zghlxwxcb.cn/news/detail-556466.html
server文件保存了集群的主要服務是否正常,如有異常,將會提示。文章來源地址http://www.zghlxwxcb.cn/news/detail-556466.html
到了這里,關于云原生|kubernetes|kubernetes集群巡檢腳本的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!