前言

继续部署(CD)流水线,曾经成为新软件构建和测试时的必备利器。这其中也包含测试环境建设、测试执行验证和销毁测试环境,以可反复的形式一直继续进行。通常咱们会增加自动化测试工具,进行功能测试、负载测试、集成测试和其余非功能性测试,并在推送到生产之前和之后都会验证产品的品质。

当初借助混沌工程,咱们就能够把故障注入测试增加到已有的自动化测试套件中。CI/CD流水线中,也应增加混沌试验运行的新步骤,确保所有代码更改在达到用户之前都是牢靠的。因而,在继续部署流水线中,咱们应用“主动故障注入”的形式来测试可靠性,以便及早发现问题并缩小生产事件。

本文中,咱们将在Jenkins流水线中创立新的Stage,以应用Gremlin将受控数量的故障注入到测试零碎。通过本文,你将学习到:

  • 如何应用Docker部署Jenkins实例。
  • 如何在Gremlin中创立API密钥。
  • 如何应用Gremlin API发动攻打。

一、先决条件

在开始本教程之前,以下是必备的先决条件:

Docker,用于从容器镜像轻松部署Jenkins。

Gremlin部署在运行混沌试验的主机上。这能够是与Jenkins雷同的主机,但现实状况下,它应该是利用部署的主机,以便进行测试。

Gremlin帐户(在上面注册)。

1.1 启动并运行Jenkins

在这一步中,应用官网Docker镜像建设一个Jenkins实例。如果曾经有一个Jenkins环境,请跳到1.3创立混沌部署流水线。

在命令行中,输出以下内容,应用Docker初始化Jenkins实例。

docker run --publish 8080:8080 --publish 50000:50000 --name jenkins jenkins/jenkins:lts-alpine

在浏览器上关上http://localhost:8080,确认Jenkins正在运行。

如果这是第一次设置 Jenkins,须要输出管理员明码和抉择装置的软件包。默认设置将失常工作。而后,增加一个管理员用户并登录该帐户。

1.2 增加Gremlin API到Jenkins

在此步骤中,在Jenkins实例中输出Gremlin API密钥和团队ID。

Gremlin API密钥与Gremlin用户帐户相关联,并容许Jenkins向Gremlin进行身份验证,而无需用户名或明码。

团队ID与Gremlin团队相关联,并容许Jenkins在Gremlin团队中运行攻打、定位主机和执行其余操作。

要获取团队 ID,请登录Gremlin Web利用。单击右上角的用户图标,而后单击团队设置。单击配置选项卡,查看团队ID:

复制团队ID,因为在下一步中须要它。

接下来,咱们将创立一个API密钥。单击右上角的用户图标,而后单击帐户设置。单击API Keys选项卡,而后单击New API Key。输出密钥的名称(例如“Jenkins”)和可选的形容,而后单击保留。从呈现的窗口中复制密钥。

当初咱们有了团队ID和API密钥,将它们输出到Jenkins 中:

http://localhost:8080/credentials/store/system/domain/_/newCredentials

或者关上Jenkins仪表板,在Manage Jenkins > Manage Credentials > Global。单击增加凭据。将 Kind抉择为Secret text, Scope 设置Global,如下所示。将Gremlin API密钥粘贴到 Secret字段中,而后输出gremlin-api-key作为 ID。单击确定保留。

为团队ID反复此步骤。抉择Secret text,将ID粘贴到该Secret字段中,而后输出gremlin-team-id字段。单击确定保留。

1.3 创立混沌部署流水线

在这一步中,咱们将创立一个Jenkins流水线。该流水线将运行CPU攻打,在肯定工夫内耗费指标主机上的CPU容量。攻打的指标是咱们装置好Gremlin的一台主机。

在典型的CI/CD流水线中,流水线代码会蕴含以下步骤:

  • 提供测试环境
  • 部署应用程序
  • 将 Gremlin 代理部署到该环境
  • 运行攻打

这里,咱们将跳过前三个步骤,仅展现如何应用Gremlin API运行攻打。

在运行自动化测试时,咱们倡议从开发/测试环境开始,而后逐步将它们利用到生产环境中。在生产部署上运行自动化试验,可助力捕捉生产特有的可靠性问题。

在Jenkins主界面上,单击“New Item”。输出一个名称,例如“Chaos Pipeline”,抉择 Pipeline,而后单击 OK。向下滚动到 Pipeline 局部,而后输出以下代码:

pipeline {    agent none    environment {        ATTACK_ID = ''        GREMLIN_API_KEY = credentials('gremlin-api-key')        GREMLIN_TEAM_ID = credentials('gremlin-team-id')    }    parameters {        string(name: 'TARGET_IDENTIFIER', defaultValue: 'gremlin-demo-lab-host', description: 'Host to target')        string(name: 'CPU_LENGTH', defaultValue: '30', description: 'Duration of CPU attack')        string(name: 'CPU_CORE', defaultValue: '1', description: 'Number of cores to impact')        string(name: 'CPU_CAPACITY', defaultValue: '100', description: 'The percentage of total CPU capacity to consume')    }    stages {        stage('Initialize test environment') {            steps{                echo "[Add commands to create a test environment.]"            }        }        stage('Install application to test environment') {            steps{                echo "[Add commands to deploy your application to your test environment.]"            }        }        stage('Run chaos experiment') {            agent any            steps {                script {                    ATTACK_ID = sh (                        script: "curl -s -H 'Content-Type: application/json;charset=utf-8' -H 'Authorization: Key ${GREMLIN_API_KEY}' https://api.gremlin.com/v1/attacks/new?teamId=${GREMLIN_TEAM_ID} --data '{ \"command\": { \"type\": \"cpu\", \"args\": [\"-c\", \"$CPU_CORE\", \"-l\", \"$CPU_LENGTH\", \"-p\", \"$CPU_CAPACITY\"] },\"target\": { \"type\": \"Exact\", \"hosts\" : { \"ids\": [\"$TARGET_IDENTIFIER\"] } } }' --compressed",                        returnStdout: true                    ).trim()                echo "View your experiment at https://app.gremlin.com/attacks/${ATTACK_ID}"                }            }        }    }}

让咱们认真看看这个脚本。

首先,在environment局部,获取Gremlin API密钥和团队ID。在parameters中,咱们定义了攻打的参数。TARGET_IDENTIFIER是攻打对象的主机名,例如这里咱们应用gremlin-demo-lab-host。能够通过单击“Clients” > “Hosts”,在Gremlin Web利用中找到主机列表:

接下来是Stage的局部。前两个Stage是增加提供和设置测试环境的步骤。第三个Stage,“运行混沌试验”,调用Gremlin API开始攻打。请留神该script字段,其中蕴含对Gremlin API的残缺调用。

应用选定的任何Gremlin API调用替换此字段,无论是调用不同类型的攻打(Attack)、运行场景(Scenario)、攻打Kubernetes资源(Resource)还是攻打服务(Service)。

当初,将默认值替换为TARGET_IDENTIFIER,即攻打对象的主机名。有时候,咱们也会调整CPU攻打的参数CPU_LENGTHCPU_CORECPU_CAPACITY。其中

  • CPU_LENGTH是攻打将运行多长时间(秒)
  • CPU_CORE是受影响的CPU核数
  • CPU_CAPACITY是要耗费的CPU百分比

接下来,通过抉择“Build with Parameters”,而后抉择“Build”来运行演示脚本。Jenkins将疾速实现前两个Stage,而后调用Gremlin API并发动攻打。

Stage视图长这个样子:

留神:如果构建失败,会收到groovy.lang.MissingPropertyException: No such property: CPU\_CORE for class: groovy.lang.Binding,请尝试从新构建。

通过单击构建版本号,关上控制台输入,将看到以下内容:

Started by user AdminRunning in Durability level: MAX_SURVIVABILITY[Pipeline] Start of Pipeline[Pipeline] withCredentialsMasking supported pattern matches of $GREMLIN_API_KEY[Pipeline] {[Pipeline] withEnv[Pipeline] {[Pipeline] stage[Pipeline] { (Initialize test environment)[Pipeline] echo[Add commands to create a test environment.][Pipeline] }[Pipeline] // stage[Pipeline] stage[Pipeline] { (Install application to test environment)[Pipeline] echo[Add commands to deploy your application to your test environment.][Pipeline] }[Pipeline] // stage[Pipeline] stage[Pipeline] { (Run chaos experiment)[Pipeline] nodeRunning on Jenkins in /var/jenkins_home/workspace/Chaos Pipeline[Pipeline] {[Pipeline] script[Pipeline] {[Pipeline] shWarning: A secret was passed to "sh" using Groovy String interpolation, which is insecure.         Affected argument(s) used the following variable(s): [GREMLIN_API_KEY]         See https://jenkins.io/redirect/groovy-string-interpolation for details.+ curl -s -H 'Content-Type: application/json' -H 'Authorization: Key ****' https://api.gremlin.com/v1/attacks/new --data '{ "command": { "type": "cpu", "args": ["-c", "1", "-l", "30", "-p", "100"] },"target": { "type": "Exact", "hosts" : { "ids": ["gremlin-demo-lab-host"] } } }' --compressed[Pipeline] echoView your experiment at https://app.gremlin.com/attacks/User requires privilege for target team: TEAM_DEFAULT[Pipeline] }[Pipeline] // script[Pipeline] }[Pipeline] // node[Pipeline] }[Pipeline] // stage[Pipeline] }[Pipeline] // withEnv[Pipeline] }[Pipeline] // withCredentials[Pipeline] End of PipelineFinished: SUCCESS

祝贺!当初已将混沌试验集成到CI/CD流水线中!

结束语

本文只是CI/CD流水线中启用混沌工程的第一步。

将来咱们可通过运行场景(Scenario)而不是攻打(Attack)来进一步扩大混沌工程实际,并验证试验的实现状况,应用状态查看在零碎不稳固时主动进行试验,或者在集成或负载测试中同时运行试验。如果有自动化负载或功能测试,请将它们与混沌试验一起运行,以确保零碎可能在压力下牢靠运行。

这些雷同的准则也可利用于其余继续部署工具,例如Spinnaker、GitLab或CircleCI等等。

起源:混沌工程实际

作者:阮如安

申明:文章取得作者受权在IDCF社区公众号(devopshub)转发。优质内容共享给思否平台的技术伙伴,如原作者有其余思考请分割小编删除,致谢。

6月每周四晚8点,【冬哥有话说】开心一“夏”。公众号留言“回放”可获取视频会看地址

  • 0603 无敌哥 《IDCF人才成长地图与5P》(《端到端DevOps继续交付(5P)精品课》第1课)
  • 0610 冬哥 《带你玩转翻新设计思维》
  • 0617 无敌哥 《麻利项目管理到底是个啥》
  • 0624 冬哥 《VUCA时代的麻利领导力》