检测etcd、k8s、docker、registry等健康状态脚本

1. 检查etcd服务状态

脚本描述:

  1. 判定方法:
    "systemctl is-active etcd"会返回3种状态:(1)unknow:代表主机未安装查询的服务;(2)active:服务正在运行;(3)inactive:服务未运行
#伪代码
  if [ "etcd状态" 不等于 "unknown" ];then
    if [ "etcd状态" 等于 "active" ];then
      echo "xx主机etcd状态正常"
    else
      echo "xx主机etcd服务异常"
    fi
  else
    echo "xx主机未安装etcd服务!"
  fi
}

2. 检查etcd集群健康

脚本描述:

  1. 判定方法:执行etcdctl endpoint health命令的返回结果,使用正则匹配,如果存在unhealthy,代表集群不健康,否则集群为健康。
  2. "etcdctl endpoint health"这条命令之所有能执行成功,是因为我已经提前把命令需要添加的参数加入到了环境变量中在这里插入图片描述
#伪代码
  result="systemctl is-active etcd"
  if [[ result匹配到"unhealthy" ]];then
    echo  "ETCD集群不健康"
    echo "result"
  else
    echo  "ETCD集群健康"
    echo "result"
  fi

3. 检查docker服务状态及ip_forward是否打开

脚本描述:

  1. docker服务状态检测原理同etcd
  2. systctl -n 可以检测内核参数值,ip_forward=1表示开关打开
#伪代码
   IP_FORWARD开关="sysctl -n net.ipv4.ip_forward"
   docker状态="systemctl is-active docker"
  if [ docker状态不等于 "unknown" ];then
    if [ docker状态等于 "active" ];then
      echo "xx主机docker服务状态启动"
    else
      echo "xx主机docker服务未启动"
    fi
  else
    echo "xx主机未安装docker"
  fi
  if [ IP_FORWARD开关=1 ];then
    echo  "xx主机已打开ip_forward"
  else
    echo  "xx主机未打开ip_forward"
  fi

4. 检查registry仓库是否正常

脚本描述:
使用到的关键命令:
curl -o /dev/null -s -w “%{http_code}” “http://127.0.0.1:5000/v2/_catalog”
如果镜像仓库正常会返回200的状态码
镜像仓库的服务端口根据创建docker容器时映射的端口决定,此处使用的是5000

#伪代码
   HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "http://127.0.0.1:5000/v2/_catalog"`
  if [ HTTP_CODE 等于 200 ];then
    echo "registry运行正常"
  else
    echo "regisrty运行异常"
  fi

5. 检查k8s各组件状态(适用于二进制方式安装)

脚本描述
脚本监测原理同etcd、docker

#伪代码
  SCHEDULE_STATUS="systemctl is-active kube-scheduler"
  MANAGE_STATUS="systemctl is-active kube-controller-manager"
  APISERVER_STATUS="systemctl is-active kube-apiserver"
  KUBELET_STATUS="systemctl is-active kubelet"
  PORXY_STATUS="systemctl is-active kube-proxy"
  定义数组 status_array
  status_array=(["kube-apiserver"]="APISERVER_STATUS" ["kube-controller-manager"]="MANAGE_STATUS" ["kube-scheduler"]="SCHEDULE_STATUS" ["kubelet"]="KUBELET_STATUS" ["kube-proxy"]="PORXY_STATUS")
  for 服务状态 in status_array数组
  do
    if [ 服务状态 不等于 "unknown" ];then
      if [ 服务状态 等于 "active" ];then
        echo  "xx主机xx服务启动"
      else
        echo  "xx主机xx服务未启动"
      fi
    else
      echo "xx主机未安装xx服务!"
    fi
  done

6. 检查k8s集群健康

脚本描述:
检查kubectl get nodes的返回结果,分2种情况:
1.如果命令执行返回结果不为0,说明集群的状态是不健康的
2. 如果匹配到master或者node的状态含有NotReady关键字,说明集群的状态是不健康的

#伪代码
  kubectl get nodes &>/dev/null
  if [  命令结果 返回 0 ];then
     执行结果="kubectl get nodes"
    if [[ 执行结果 匹配到 "NotReady" ]];then
      echo "K8S集群健康不健康"
      echo "执行结果"
    else
      echo "K8S集群健康"
      echo "执行结果"
    fi
  else
    echo "K8S集群不健康"
    echo "kubectl get nodes执行结果"
  fi

7.在main函数中的处理

  1. 对于registry,一般一套环境只会在某些机器上安装,以此执行脚本前应该先判断该机器是否运行了registry
  2. 检查etcd集群健康的时候,在会在安装了etcd服务的机器上执行
  3. 检查k8s集群健康的时候,只会在master节点上执行
if [[ registry进程存在 ]];then
  执行检测registry函数
else
  echo "xx未安装docker-registry"
fi
if [ etcd服务状态 不等于 "unknown" ];then
  执行检测etcd集群函数
fi
if [ kube-apiserver服务状态 不等于 "unknown" ];then
  执行检测k8s集群函数
fi

8. 测试脚本执行的结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Ethin_l/article/details/131571642