使用 Jenkins 进行服务拨测

2023年 1月 4日 63.6k 0

1. 为什么要拨测

对于系统中的一些关键服务,我们通常会配置监控服务。当故障发生时,能够尽快被检测到,发送通知给关注人。当故障发生后,能够有效地追溯故障过程。拨测是监控系统中的一个重要环节,能够检测服务的网络质量,并提供实时告警。在公有云上,云厂商通过广泛分布的拨测节点,提供拨测服务。那么在 Jenkins 上如何实现拨测功能呢?

2. 搭建邮件服务器

这里选择的是 Poste 邮件服务,邮件域名 mail.dev.chenshaowen.com。

  • 域名配置
    • mail.dev.chenshaowen.com -> A 记录 -> 主机 IP
    • mail.dev.chenshaowen.com -> TXT 记录 -> v=spf1 +all
    • _dmarc.mail.dev.chenshaowen.com -> TXT 记录 -> v=DMARC1;p=none
  • 运行服务
    • 创建数据存储目录
    1
    
    mkdir /maildata
    
    • 以后台的方式运行 poste.io
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    docker run -d 
        -p 25:25 
        -p 80:80 
        -p 110:110 
        -p 143:143 
        -p 443:443 
        -p 587:587 
        -p 993:993 
        -p 995:995 
        -v /etc/localtime:/etc/localtime:ro 
        -v /maildata:/data 
        --name "mailserver" 
        -h "mail.dev.chenshaowen.com" 
        -t analogic/poste.io
    
  • 服务配置,设置 IP 白名单
  • 打开页面 https://mail.dev.chenshaowen.com:443 ,创建邮件账户。进入 Poste 的主页可以看到如下页面:这里需要将 Jenkins 运行的主机 IP 加入到白名单中,否则会有 550 报错。除此,在 /webmail/ 路由下,用户可以正常使用邮箱功能。

    3. 使用 Jenkins 进行拨测

    快速部署 Jenkins 可以参考 Docker Compose 脚本。主要使用的功能包括:

    • 邮件通知
    • 新建流水线
    • 定时构建

    3.1 开启邮件通知

    在 Jenkins 的【系统管理】->【系统配置】->【邮件通知】中,配置邮件通知服务,如下图:填入服务相关信息之后,建议发送测试邮件,确保邮件功能正常。最后,保存即可。

    3.2 新建一个流水线

    这里的拨测,主要分为服务状态码和响应时间两部分,分别由两个并行的 Stage 构成。测试的原理是,通过 curl 命令获取服务链接的状态码和响应时间,然后与预期值比较。如果满足触发条件,则发送异常通知邮件。下面是 Jenkinsfile 文件内容:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    
    pipeline {
      agent any
      parameters {
        string(name: 'LINK', defaultValue: 'https://www.chenshaowen.com/', description: '待拨测链接')
        string(name: 'HTTP_CODE', defaultValue: '200', description: '预期状态码')
        string(name: 'TIME_TOTAL', defaultValue: '1', description: '超时时间,单位:秒')
        string(name: 'EMAIL', defaultValue: '[email protected]', description: '异常时,邮件通知人')
      }
      stages {
        stage('default') {
            parallel {
                stage('状态测试') {
                    steps {
                        script {
                            try{
                                sh '''
                                export _HTTP_CODE=$(curl --connect-timeout 120 -s -o /dev/null -w '%{http_code}' $LINK)
                                if [ "$_HTTP_CODE" != "$HTTP_CODE" ]
                                then
                                    exit -1
                                fi
                                '''
                            }catch(err){
                                currentBuild.result = 'FAILURE'
                                mail(subject: "$LINK 访问状态码错误", body: "消息来自 DevOps 流水线,请检查相关服务是否异常。", to: "$EMAIL")
                            }
                        }
                    }
                }
                stage('超时测试') {
                    steps {
                        script {
                            try{
                                sh '''
                                _TIME_TOTAL=$(curl --connect-timeout 120 -s -o /dev/null -w '%{time_total}' $LINK)
                                TIME_TOTAL=`echo $TIME_TOTAL| awk '{print int($0)}'`
                                _TIME_TOTAL=`echo $_TIME_TOTAL| awk '{print int($0)}'`
                                if [ $_TIME_TOTAL -ge  $TIME_TOTAL ]
                                then
                                    exit -1
                                fi
                                '''
                            }catch(err){
                                currentBuild.result = 'FAILURE'
                                mail(subject: "$LINK 访问超时", body: "消息来自 DevOps 流水线,请检查相关服务是否异常。", to: "$EMAIL")
                            }
                        }
                    }
                }
            }
        }
      }
    }
    

    新建一个【流水线】任务,点击【配置】,在【流水线】的脚本内容中粘贴上面的 Jenkinsfile 内容,保存即可。

    3.3 定时构建

    成功创建拨测流水线之后,只能人工触发。拨测需要的是, 24 小时无间断地监控。这时,就需要使用到定时构建功能。在流水线页面,点击【配置】,找到【构建触发器】。勾选定时构建,设置每 5 分钟触发一次流水线,填入参数:

    1
    
    */5 * * * *
    

    最后,点击【确认】,保存即可。

    4. 测试拨测功能

    4.1 SUCCESS

    在流水线,直接使用预期的参数,进行测试。查看执行日志:

    4.2 FAILURE

    这里有意地将状态码设置为 201,超时时间设置为 0 秒,以触发检查失败后的通知逻辑。查看执行日志:在邮件中,我们也可以看到告警邮件:

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论