蓝色/绿色部署是通过运行两个版本的相同服务(“蓝色”和“绿色”版本)实现零停机时间的方法,并且有负载均衡器在两个版本之间进行切换。
蓝色/绿色部署允许您拥有两个完全缩放的服务版本。如果一个出现错误,您可以通过调整负载均衡器快速切换到另一个。
使用案例:服务升级
web-server
服务有“蓝色”和“绿色”版本正在运行,负载均衡器将流量成功路由到“蓝色”版本。- Edge-LB 配置已更新,将流量路由到“绿色”版本,“绿色”服务的日志中开始发生错误。
- 通过将 Edge-LB 恢复到原始配置,可使部署快速回滚。
先决条件
-
Edge-LB CLI 已安装。
dcos package install edgelb --cli
-
对于两个完全部署的服务,DC/OS 集群上的容量足够。
部署示例
以下是最小的 Edge-LB 配置、sample-minimal.json
,可负载均衡“svc-blue”。
{
"apiVersion": "V2",
"name": "sample-config",
"count": 1,
"haproxy": {
"frontends": [{
"bindPort": 80,
"protocol": "HTTP",
"linkBackend": {
"defaultBackend": "svc"
}
}],
"backends": [{
"name": "svc",
"protocol": "HTTP",
"services": [{
"marathon": {
"serviceID": "/svc-blue"
},
"endpoint": {
"portName": "web"
}
}]
}]
}
}
复制示例服务并将其命名为 svc-blue.json
。
{
"id": "/svc-blue",
"cmd": "/start $PORT0",
"instances": 1,
"cpus": 0.1,
"mem": 32,
"container": {
"type": "DOCKER",
"docker": {
"image": "mesosphere/httpd"
}
},
"portDefinitions": [
{
"name": "web",
"protocol": "tcp",
"port": 0
}
],
"healthChecks": [
{
"portIndex": 0,
"path": "/",
"protocol": "HTTP"
}
]
}
再复制一份示例服务并将其命名为 svc-green.json
。
{
"id": "/svc-green",
"cmd": "/start $PORT0",
"instances": 1,
"cpus": 0.1,
"mem": 32,
"container": {
"type": "DOCKER",
"docker": {
"image": "mesosphere/httpd"
}
},
"portDefinitions": [
{
"name": "web",
"protocol": "tcp",
"port": 0
}
],
"healthChecks": [
{
"portIndex": 0,
"path": "/",
"protocol": "HTTP"
}
]
}
-
将配置上传到 Edge-LB。
dcos edgelb create sample-minimal.json
-
启动服务“svc-blue”。
dcos marathon app add svc-blue.json
-
现在,“svc-blue” 暴露在
http://<public-ip>/
. -
通过部署“svc-green”,启动蓝色/绿色部署。
dcos marathon app add svc-green.json
-
如果
svc-green
启动并且健康运行,则通过更改以下内容来修改 Edge-LB 配置以指向svc-green
:{ ... "haproxy": { "backends": [{ ... "services": [{ "marathon": { "serviceID": "/svc-blue" }, ... }] }] } }
至:
{
...
"haproxy": {
"backends": [{
...
"services": [{
"marathon": {
"serviceID": "/svc-green"
},
...
}]
}]
}
}
-
将修改的配置上传到 Edge-LB。
dcos edgelb update sample-minimal.json
-
现在,“svc-green” 暴露在
http://<public-ip>/
.