consul配置信息迁移2种方式
一,使用快照命令snapshot
在原consul 容器中导出快照:
1,进入原有consul镜像中
2,执行 consul snapshot save --http-addr=http://localhost:8500 -token=password consul-state-v2.snap
3,然后退出当前容器,复制容器中的快照到宿主机
docker cp game-consul:/consul-state-v2.snap .
根据old镜像主密码生成consul容器:
4,宿主机新建一个目录比如config(方便挂载到consul容器的/consul/config目录),目录中新建acl.hcl 主配置文件(跟原有镜像的一样,特别是密码)
acl = {
enabled = true
default_policy = "deny"
enable_token_persistence = true
tokens = {
master = "old镜像password一致"
}
}
5,编写docker-compose.yml
version: '3.0'
services:
test-consul:
image: consul:latest
container_name: consul.test
restart: always
command: agent -server -bootstrap -ui -client=0.0.0.0
volumes:
- /opt/config:/consul/config
ports:
- 18500:8500
- 18300:8300
- 18600:8600/udp
在新生成consul容器中导入快照:
6,进入镜像consul.test执行导入快照命令
consul snapshot restore --http-addr=http://localhost:8500 -token=acl.hcl文件的密码 consul-state-v2.snap"
或者不进入镜像consul.test里面,在宿主机执行docker exec -it consul.test /bin/sh -c "consul snapshot restore --http-addr=http://localhost:8500 -token=acl.hcl文件的密码 consul-state-v2.snap"
是一样的导入方法
7,登录consul UI 使用acl.hcl文件的密码 登录 就会看到与原来的consul 配置(我这里主要对比了k/v,token,policies,roles 的设置信息)一样了
二,根据k/v,token,policies,roles 配置信息执行API接口
导出原有consul容器的k/v:
1,导出k/v
consul kv export --http-addr=http://localhost:8500 -token=acl.hcl密码 '' >kv.json
2,将容器中的kv.json 复制到宿主机
docker cp game-consul:/kv.json .
3,将方法一的4,5步骤执行,生成新的consul.test 容器
执行policies,roles,token 新建API:
4,进入consul.test容器,执行policies,roles,token 新建API
可以参考consul官网https://www.consul.io/api-docs/acl/tokens
4.1,创建policy.json
{
"Name": "test",
"Description": "Grants read access to all node information",
"Rules": "node_prefix \"\" { policy = \"write\" } service_prefix \"\" { policy = \"write\" } key_prefix \"\" { policy = \"write\" }",
"Datacenters": ["dc1"]
}
curl --request PUT \
--data @payload.json \ http://127.0.0.1:8500/v1/acl/policy?token=old镜像password一致
4.2,创建role.json
{
"Name": "game",
"Description": "Showcases all input parameters",
"Policies": [
{
"ID": "ecf51e3f-8ff3-eec9-6aa6-2376f046eee8" #上面一步返回的ID
},
{
"Name": "test" #policy.json中的name
}
],
#以下配置看自己原有镜像是否有
"ServiceIdentities": [
{
"ServiceName": "web"
},
{
"ServiceName": "db",
"Datacenters": ["dc1"]
}
],
"NodeIdentities": [
{
"NodeName": "node-1",
"Datacenter": "dc2"
}
]
}
curl --request PUT \
--data @role.json \
http://127.0.0.1:8500/v1/acl/role?token=old镜像password一致
4.3,创建token.json
{
"Description": "Agent token for 'game'",
"Policies": [
{
"ID": "ecf51e3f-8ff3-eec9-6aa6-2376f046eee8" #上面一步返回的ID
},
{
"Name": "test"
}
],
"Local": false
}
curl --request PUT \
--data @token.json \
http://127.0.0.1:8500/v1/acl/token?token=old镜像password一致
导入kv.json:
5,进入容器导入kv.json
consul kv import --http-addr=http://localhost:8500 -token=可以是client-token(上面图生成的SecretID)也可以是master-token @kv.json
6,登陆ip:18500 可以看到配置信息都已生成。