Consul 安装部署

Prometheus   2025-01-12 21:27   178   0  

1、下载安装包解压

cd /usr/local/prometheus
wget https://releases.hashicorp.com/consul/1.12.3/consul_1.12.3_linux_amd64.zip
unzip consul_1.12.3_linux_amd64.zip

解压出来的就是一个可执行文件
image.png

2、启动服务

nohup /usr/local/prometheus/consul agent -dev -ui -node=consul-dev -client=0.0.0.0 >/usr/local/prometheus/consul.log 2>&1 &

3、开启防火墙端口

systemctl status firewalld
firewall-cmd --zone=public --add-port=8500/tcp --permanent 
firewall-cmd --reload
firewall-cmd --zone=public --query-port=8500/tcp

4、测试验证

浏览器访问

http://IP:8500/

image.png

5、注册服务

新建一个JSON文件

touch prometheus.json
vim prometheus.json

JSON文件需要指定服务ID、名称、标签,服务地址,端口,轮询周期等。

{
  "ID": "prometheus",
  "Name": "prometheus",
  "Tags": [
    "primary",
    "v1"
  ],
  "address": "localhost",
  "port": 9090,
  "check": {
    "http": "http://localhost:9090/metrics",
    "interval": "10s"
  }
}

注册服务(重启失效)

curl --request PUT --data @prometheus.json http://localhost:8500/v1/agent/service/register

删除服务(url最后面为服务ID)

curl --request PUT http://localhost:8500/v1/agent/service/deregister/prometheus

注册服务,不使用JSON文件(重启失效)

curl --request PUT --data '{"ID":"prometheus","Name":"prometheus","Tags":["primary","v1"],"address":"localhost","port":9090,"check":{"http":"http://localhost:9090/metrics","interval":"10s"}}' http://localhost:8500/v1/agent/service/register

image.png
image.png
image.png

6、Shell 脚本一键安装

touch consul.sh && chmod +x consul.sh
#!/bin/bash
#用于安装Consul

#版本号
CONSUL_VER=1.12.3
#安装位置
CONSUL_DIR=/app/consul
#安装包存放路径
INSTALL_PACKAGE=/app/install
#日志文件
LOG_FILE=/tmp/consul.log
#节点名称
NODE_NAME=wxhntmy

# consul的用户名
CONSUL_USER=prometheus
# CONSUL监听端口
CONSUL_PORT=8500

check_err()
{
    if [ $? -ne 0 ]; then
        echo "$1"
        exit 1
    else
        echo "$2"
    fi
}

start() {
    [ ! -d /app ] && mkdir -p /app

    #检查是否存在wget命令,没有则安装
    type wget &> /dev/null
    if [ $? -ne 0 ]; then
        yum install wget -y
        check_err "\033[31myum安装依赖包 wget 失败,请检查\033[0m" "\033[36myum安装依赖包 wget 成功\033[0m"
    fi

    #检查是否存在netstat命令,没有则安装
    type netstat &> /dev/null
    if [ $? -ne 0 ]; then
        yum install net-tools -y
        check_err "\033[31myum安装依赖包 net-tools 失败,请检查\033[0m" "\033[36myum安装依赖包 net-tools 成功\033[0m"
    fi

    netstat -tln | grep ":$CONSUL_PORT"
    CHECK_RESULT=$?
    if [ $CHECK_RESULT -eq 0 ];then
      echo "CONSUL 已启动,请勿重复启动应用!"
      exit 1
    fi
    echo "正在启动 CONSUL....."

    [ ! -d $INSTALL_PACKAGE ] && mkdir -p $INSTALL_PACKAGE

    [ ! -f $INSTALL_PACKAGE/consul_${CONSUL_VER}_linux_amd64.zip ] && wget -O $INSTALL_PACKAGE/consul_${CONSUL_VER}_linux_amd64.zip https://releases.hashicorp.com/consul/${CONSUL_VER}/consul_${CONSUL_VER}_linux_amd64.zip

    [ ! -d $CONSUL_DIR ] && mkdir -p $CONSUL_DIR
    count=`ls $CONSUL_DIR | wc -l`
    if [ $count -gt 0 ]; then
        echo "目录 $CONSUL_DIR 不为空,不再重复解压压缩包"
    else
        unzip $INSTALL_PACKAGE/consul_${CONSUL_VER}_linux_amd64.zip -d $CONSUL_DIR
    fi

    cat /etc/group | grep $CONSUL_USER
    if [ $? -ne 0 ]; then
        groupadd -g 10002 $CONSUL_USER
    fi
    cat /etc/passwd | grep $CONSUL_USER
    if [ $? -ne 0 ]; then
        useradd -u 10002 -g $CONSUL_USER -d /home/$CONSUL_USER -m $CONSUL_USER
    fi

    chown -R $CONSUL_USER:$CONSUL_USER $CONSUL_DIR

    [ ! -f $LOG_FILE ] && touch $LOG_FILE
    chown -R $CONSUL_USER:$CONSUL_USER $LOG_FILE

    # 切换用户
su - $CONSUL_USER << EOF
    # 不加反斜杠,取的值是切换用户前的
    nohup $CONSUL_DIR/consul agent -dev -ui -node=$NODE_NAME -client=0.0.0.0 >> $LOG_FILE 2>&1 &
    #每2s检查一次监听端口是否启动,总共检查60次共2分钟,超时未启动则退出
    CHECK_RESULT=1
    CHECK_COUNT=60
    while [ \$CHECK_RESULT -ne 0 ];do
        if [ \$CHECK_COUNT -gt 0 ];then
          echo "等待监听端口启动..."
          sleep 2
          netstat -tln | grep ":$CONSUL_PORT"
          CHECK_RESULT=\$?
          CHECK_COUNT=\$((\$CHECK_COUNT-1))
        else
          echo "ERROR: 启动$CONSUL_PORT端口超时,请检查!"
          exit 1
        fi
    done
echo "CONSUL 启动成功!"
EOF
#检查防火墙是否已启动,如果启动则开放端口
systemctl status firewalld > /dev/null
if [ $? -eq 0 ];then
    firewall-cmd --add-port=$CONSUL_PORT/tcp --permanent
    firewall-cmd --reload
fi
}

stop(){

netstat -tln | grep ":$CONSUL_PORT"
check_err "CONSUL 未启动!" "CONSUL 正在运行,开始停止应用....."

su - $CONSUL_USER << EOF
PROCESS=`ps aux | grep $CONSUL_DIR/consul | grep -v "grep" | awk '{print $2}'`
for i in \${PROCESS}
do
  echo "Kill the CONSUL process [ \$i ]"
  kill -9 \$i
done
EOF
    CHECK_RESULT=0
    CHECK_COUNT=30
    while [ $CHECK_RESULT -eq 0 ];do
      if [ $CHECK_COUNT -gt 0 ];then
        echo "等待监听端口关闭..."
        sleep 2
        netstat -tln | grep ":$CONSUL_PORT"
        CHECK_RESULT=$?
        CHECK_COUNT=$(($CHECK_COUNT-1))
      else
        echo "ERROR: 关闭$CONSUL_PORT端口超时,请检查!"
        exit 1
      fi
    done
    echo "关闭 CONSUL 成功!"
}

restart(){
    stop
    start
}

status(){
    su $CONSUL_USER -c "ps aux | grep $CONSUL_DIR/consul | grep -v \"grep\" | grep -v \"su $CONSUL_USER\""
}

remove(){
    rm -rf $LOG_FILE
    rm -rf $CONSUL_DIR
    userdel -r $CONSUL_USER
}

register(){
    JSON_FILE=$1
    if [[ ! -n "$JSON_FILE" ]] || [[ ! -f $JSON_FILE ]]; then
        echo "$JSON_FILE 文件不存在!"
        echo "请在 register 后面指定注册服务的 JSON 文件,JSON文件需要指定服务ID、名称、标签,服务地址,端口,轮询周期等。"
        echo "JSON文件示例:{
      "ID": "prometheus",
      "Name": "prometheus",
      "Tags": [
        "primary",
        "v1"
      ],
      "address": "localhost",
      "port": 9090,
      "check": {
        "http": "http://localhost:9090/metrics",
        "interval": "10s"
      }
    }"
        exit 1
    fi

    ip=`ifconfig ens33 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/netmask.*$//g' | sed 's/ //g'`
    echo "当前服务器 IP 为:$ip,默认以该 IP 地址进行服务注册!"

    curl --request PUT -T $JSON_FILE http://${ip}:${CONSUL_PORT}/v1/agent/service/register
    SERVICE_ID=`cat $JSON_FILE | grep 'ID' | sed 's/ //g' | sed 's/"//g' | sed 's/,//g' | sed 's/://g' | sed 's/ID//g'`
    echo "SERVICE_ID: $SERVICE_ID"
    if [[ ! -n "$SERVICE_ID" ]] ; then
        echo "SERVICE_ID不能为空!"
        exit 1
    fi
    CNT=`curl --request GET http://${ip}:${CONSUL_PORT}/v1/agent/services | grep 'ID' | grep $SERVICE_ID | wc -l`
    if [ $CNT -gt 0 ]; then
        echo "服务注册成功!"
    else
        echo "服务注册失败!"
    fi
}

deregister(){
    ip=`ifconfig ens33 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/netmask.*$//g' | sed 's/ //g'`
    echo "当前服务器 IP 为:$ip,默认以该 IP 地址删除 Consul 已注册的服务!"
    curl --request PUT http://${ip}:${CONSUL_PORT}/v1/agent/service/deregister/$1
    CNT=`curl --request GET http://${ip}:${CONSUL_PORT}/v1/agent/services | grep 'ID' | grep $1 | wc -l`
    if [ $CNT -eq 0 ]; then
        echo "服务删除成功!"
    else
        echo "服务删除失败!"
    fi
}

service(){
    ip=`ifconfig ens33 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/netmask.*$//g' | sed 's/ //g'`
    echo "当前服务器 IP 为:$ip,默认以该 IP 地址获取 Consul 已注册的服务!"
    SERVICE_STATUS=`curl http://${ip}:${CONSUL_PORT}/v1/agent/service/$1`
    echo "$SERVICE_STATUS"
}

usage ()
{
    echo " "
    echo "请输入 start 启动 CONSUL。"
    echo "请输入 stop 停止 CONSUL。"
    echo "请输入 status 获取 CONSUL 状态。"
    echo "请输入 restart 重启 CONSUL。"
    echo "请输入 remove 删除 CONSUL。"
    echo "请输入 service 获取已注册的服务状态。在 service 后面指定服务ID(示例:./consul.sh service prometheus)。"
    echo "请输入 register 进行服务注册(重启失效)。在 register 后面指定注册服务的 JSON 文件(示例:./consul.sh register /root/prometheus.json)。"
    echo "请输入 deregister 删除服务。在 deregister 后面指定要删除的服务ID(示例:./consul.sh deregister prometheus)。"
    echo " "
}

INPUT_ACTIVE=$1
ACTIVE=${INPUT_ACTIVE:=start}
case ${ACTIVE} in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        ;;
    restart)
        restart
        ;;
    remove)
        remove
        ;;
    register)
        register $2
        ;;
    deregister)
        deregister $2
        ;;
    service)
        service $2
        ;;
    *)
        usage
        ;;
esac


博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。