Consul集群环境搭建+ACL配置

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

Consul集群环境搭建

1. 环境准备

  • consul版本:1.6.3
  • 机器信息
机器IP 占用端口 Agent类型 节点名称
172.16.173.128 8500 server consul-server1
172.16.173.130 8500 server consul-server2
172.16.173.133 8500 server consul-server3
172.16.173.134 7110 client consul-client
  • Consul安装路径:/usr/local/consul
  • Consul配置文件存放路径:/usr/local/consul/config

2. 配置文件

配置信息详情见最后

  • consul-server1

consul-server1.json

{
    "node_name": "consul-server1",
    "bootstrap_expect": 3,
    "encrypt": "qV5WVLHhFnwEle8l/Edi/Q==",
    "data_dir": "/usr/local/consul/data",
    "bind_addr": "172.16.173.128",
    "server": true,
    "enable_script_checks": true,
    "log_file":"/usr/local/consul/log/",
    "log_level":"INFO",
    "log_rotate_bytes":100000000,
    "log_rotate_duration":"24h",
    "start_join":[
        "172.16.173.128",
        "172.16.173.130",
        "172.16.173.133"
    ],
    "retry_join":[
        "172.16.173.128",
        "172.16.173.130",
        "172.16.173.133"
   ],
    "retry_interval": "30s",
    "acl":{
        "enabled":true,
        "default_policy":"deny",
        "enable_token_persistence":true,
        "tokens":{
            "master":"hello"
        }
    }
}
复制代码
  • consul-server2

consul-server2.json

{
    "node_name": "consul-server2",
    "bootstrap_expect": 3,
    "encrypt": "qV5WVLHhFnwEle8l/Edi/Q==",
    "data_dir": "/usr/local/consul/data",
    "bind_addr": "172.16.173.130",
    "server": true,
    "enable_script_checks": true,
    "log_file":"/usr/local/consul/log/",
    "log_level":"INFO",
    "log_rotate_bytes":100000000,
    "log_rotate_duration":"24h",
    "start_join":[
        "172.16.173.128",
        "172.16.173.130",
        "172.16.173.133"
    ],
    "retry_join":[
        "172.16.173.128",
        "172.16.173.130",
        "172.16.173.133"
   ],
    "retry_interval": "30s",
    "acl":{
        "enabled":true,
        "default_policy":"deny",
        "enable_token_persistence":true,
        "tokens":{
        "master":"hello"
	}
    }
}
复制代码
  • consul-server3

consul-server3.json

{
    "node_name": "consul-server3",
    "bootstrap_expect": 3,
    "encrypt": "qV5WVLHhFnwEle8l/Edi/Q==",
    "data_dir": "/usr/local/consul/data",
    "bind_addr": "172.16.173.133",
    "server": true,
    "enable_script_checks": true,
    "log_file":"/usr/local/consul/log/",
    "log_level":"INFO",
    "log_rotate_bytes":100000000,
    "log_rotate_duration":"24h",
    "start_join":[
        "172.16.173.128",
        "172.16.173.130",
        "172.16.173.133"
    ],
    "retry_join":[
        "172.16.173.128",
        "172.16.173.130",
        "172.16.173.133"
   ],
    "retry_interval": "30s",
    "acl":{
        "enabled":true,
        "default_policy":"deny",
        "enable_token_persistence":true,
        "tokens":{
	    "master":"hello"
        }
    }
}
复制代码

启动服务:

1. 依次启动Consul服务

nohup ./consul agent -config-dir=/usr/local/consul/config & 
复制代码

consul日志会打印Coordinate update blocked by ACLs

image.png 此时需要设置一个agent-token

2. 在任意一个节点上执行下面的请求用于生成agent-token

这里header的"X-Consul-Token: hello"需要设置成自己配置文件中的master-token

curl \
    --request PUT \
    --header "X-Consul-Token: hello" \
    --data \
'{
  "Name": "Agent Token",
  "Type": "client",
  "Rules": "node \"\" { policy = \"write\" } service \"\" { policy = \"read\" }"
}' http://127.0.0.1:8500/v1/acl/create
复制代码

image.png

{"ID":"b80f6da8-6636-c7ad-3576-ea81d84fbb3b"}
复制代码

将生成的token添加到acl节点中(每个节点都需要添加) 依次重新启动Consul服务。

"acl":{
        "enabled":true,
        "default_policy":"deny",
        "enable_token_persistence":true,
        "tokens":{
        "master":"hello",
	    "agent":"b80f6da8-6636-c7ad-3576-ea81d84fbb3b"
        }
    }
复制代码

配置consul-client

扫描二维码关注公众号,回复: 14267969 查看本文章
  • consul-client

consul-client.json

{
    "datacenter":"dc1",
    "primary_datacenter":"dc1",
    "advertise_addr": "172.16.173.134",
    "start_join":[
        "172.16.173.128",
        "172.16.173.130",
        "172.16.173.133"
    ],
    "retry_join":[
        "172.16.173.128",
        "172.16.173.130",
        "172.16.173.133"
   ],
    "bind_addr":"172.16.173.134",
    "node_name":"consul-client1",
    "client_addr":"0.0.0.0",
    "connect":{
        "enabled":true
    },
    "data_dir":"/opt/consul/data/",
    "log_file":"/opt/consul/log/",
    "log_level":"info",
    "log_rotate_bytes":100000000,
    "log_rotate_duration":"24h",
    "encrypt":"qV5WVLHhFnwEle8l/Edi/Q==",
    "ui":true,
    "enable_script_checks":false,
    "enable_local_script_checks":true,
    "disable_remote_exec":true,
    "ports":{
        "http":7110
    },
    "acl":{
        "enabled":true,
        "default_policy":"deny",
        "enable_token_persistence":true,
        "tokens":{
	    "agent":"b80f6da8-6636-c7ad-3576-ea81d84fbb3b"
        }
    }
}
复制代码

浏览器访问Consul 172.16.173.134:7110

image.png 此时的consul已经不再是裸奔,需要登录才能进行操作。

  1. 输入生成的agent-token。

image.png 此时也可以查看集群节点信息了

image.png

  1. 此时还不能对k-v进行编辑

image.png

  1. 输入master-token,在master-token下可以对token和角色,权限进行管理

image.png

附录:

  1. Consul配置信息说明:
属性 说明
datacenter 此标志表示代理运行的数据中心。如果未提供,则默认为“dc1”。 Consul拥有对多个数据中心的一流支持,但它依赖于正确的配置。同一数据中心中的节点应在同一个局域网内。
primary_datacenter 这指定了对ACL信息具有权威性的数据中心。必须提供它才能启用ACL
bootstrap_expect Consul将等待指定数量的服务器可用,然后才会引导群集。这允许自动选择初始领导者。
start_join 一个字符串数组,指定是其他的consul server agent的地址。这里这样配置,会在启动时,尝试将consul-server2,consul-server3这两个节点加进来,形成一个集群。
retry_join 允许start_join时失败时,继续重新连接。重试的时间间隔,可以用retry_interval设置,默认是30s;重试的最大次数,可以用retry_max设置,默认是0,也就是无限次重试。关于retry_interval和retry_max,这里都是用的默认值。
bind_addr 内部群集通信绑定的地址。这是群集中所有其他节点都应该可以访问的IP地址。默认情况下,这是“0.0.0.0”,这意味着Consul将绑定到本地计算机上的所有地址,并将第一个可用的私有IPv4地址通告给群集的其余部分。如果有多个私有IPv4地址可用,Consul将在启动时退出并显示错误。如果指定“[::]”,Consul将通告第一个可用的公共IPv6地址。如果有多个可用的公共IPv6地址,Consul将在启动时退出并显示错误。 Consul同时使用TCP和UDP,并且两者使用相同的端口。如果您有防火墙,请务必同时允许这两种协议。
advertise_addr 更改我们向群集中其他节点通告的地址。默认情况下,会使用-bind参数指定的地址。
server 是否是server agent节点。
connect.enabled 是否启动Consul Connect,这里是启用的。
node_name 节点名称。
data_dir agent存储状态的目录。
enable_script_checks 是否在此代理上启用执行脚本的健康检查。有安全漏洞,默认值就是false,这里单独提示下。
enable_local_script_checks: 与enable_script_checks类似,但只有在本地配置文件中定义它们时才启用它们。仍然不允许在HTTP API注册中定义的脚本检查。
log-file 将所有Consul Agent日志消息重定向到文件。这里指定的是/opt/consul/log/目录。
log_rotate_bytes 指定在需要轮换之前应写入日志的字节数。除非指定,否则可以写入日志文件的字节数没有限制
log_rotate_duration:指定在需要旋转日志之前应写入日志的最长持续时间。除非另有说明,否则日志会每天轮换(24小时。单位可以是"ns", “us” (or “µs”), “ms”, “s”, “m”, “h”, 比如设置值为24h
encrypt 用于加密Consul Gossip 协议交换的数据。在启动各个server之前,配置成同一个UUID值就行,或者你用命令行consul keygen 命令来生成也可以。
acl.enabled 是否启用acl.
acl.default_policy “allow”或“deny”; 默认为“allow”,但这将在未来的主要版本中更改。当没有匹配规则时,默认策略控制令牌的行为。在“allow”模式下,ACL是黑名单:允许任何未明确禁止的操作。在“deny”模式下,ACL是白名单:阻止任何未明确允许的操作.
acl.enable_token_persistence 可能值为true或者false。值为true时,API使用的令牌集合将被保存到磁盘,并且当代理重新启动时会重新加载。
acl.tokens.master 具有全局管理的权限,也就是最大的权限。它允许操作员使用众所周知的令牌密钥ID来引导ACL系统。需要在所有的server agent上设置同一个值,可以设置为一个随机的UUID。这个值权限最大,注意保管好。
acl.tokens.agent 用于客户端和服务器执行内部操作.比如catalog api的更新,反熵同步等。
  1. 参考文章:

猜你喜欢

转载自juejin.im/post/7108363456075530248