前言
继续部署 (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_LENGTH
、CPU_CORE
和CPU_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 Admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] withCredentials
Masking 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] node
Running on Jenkins in /var/jenkins_home/workspace/Chaos Pipeline
[Pipeline] {[Pipeline] script
[Pipeline] {[Pipeline] sh
Warning: 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] echo
View 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 Pipeline
Finished: SUCCESS
祝贺!当初已将混沌试验集成到 CI/CD 流水线中!
结束语
本文只是 CI/CD 流水线中启用混沌工程的第一步。
将来咱们可通过运行场景 (Scenario) 而不是攻打 (Attack) 来进一步扩大混沌工程实际,并验证试验的实现状况,应用状态查看在零碎不稳固时主动进行试验,或者在集成或负载测试中同时运行试验。如果有自动化负载或功能测试,请将它们与混沌试验一起运行,以确保零碎可能在压力下牢靠运行。
这些雷同的准则也可利用于其余继续部署工具,例如 Spinnaker、GitLab 或 CircleCI 等等。
起源:混沌工程实际
作者:阮如安
申明:文章取得作者受权在 IDCF 社区公众号(devopshub)转发。优质内容共享给思否平台的技术伙伴,如原作者有其余思考请分割小编删除,致谢。
6 月每周四晚 8 点,【冬哥有话说】开心一“夏”。公众号留言“回放”可获取视频会看地址
- 0603 无敌哥《IDCF 人才成长地图与 5P》(《端到端 DevOps 继续交付 (5P) 精品课》第 1 课)
- 0610 冬哥《带你玩转翻新设计思维》
- 0617 无敌哥《麻利项目管理到底是个啥》
- 0624 冬哥《VUCA 时代的麻利领导力》