在Consul中创建代理策略

62次阅读
没有评论

问题描述

正在尝试设置一个Consul 1.3.1服务器集群,但遇到了困难。他已经成功地设置了一个单节点,看起来正常运行。他在配置文件中使用acl_master_token来完成这个操作。然而,当他添加另一个节点作为服务器但没有引导时,他遇到了一系列问题。其中一些主要问题与加入集群相关(无法加入,会出现403错误),根据他的了解,这可能意味着需要使用acl_agent_token。然而,即使他在配置文件中设置了这个值,他仍然得到403错误。

他猜测他可能需要创建一个策略,然后将这个策略应用到他的令牌上。但他不确定如何在Ruby脚本中实现这一点。由于他必须使用Ruby脚本进行设置(因为一些遗留内容在其中,并且不能将Consul的设置手动更改为手动操作,因为所有内容都是Chef Cookbook的一部分)。

下面是他的配置文件,除了使用consul agent命令在两个节点上启动Consul服务之外,他没有其他配置:

consul agent -data-dir /work-disk/consul_data -config-file /work-disk/consul/conf.json -bind 10.7.1.5

conf.json:

{
  "bootstrap_expect": 2,
  "client_addr": "0.0.0.0",
  "datacenter": "<%= @datacenter %>",
  "acl_datacenter": "<%= @datacenter %>",
  "acl_default_policy": "deny",
  "acl_down_policy": "deny",
  "acl_master_token": "<%= @acl_master_token %>",
  "acl_agent_token": "<%= @acl_agent_token %>",
  "data_dir": "<%= @consul_data_dir %>",
  "domain": "consul",
  "enable_script_checks": true,
  "dns_config": {
    "enable_truncate": true,
    "only_passing": true
  },
  "enable_syslog": true,
  "encrypt": "<%= @consul_encryption_key %>",
  "leave_on_terminate": true,
  "log_level": "INFO",
  "rejoin_after_leave": true,
  "server": true
}

请注意,上述配置文件中的<%= @datacenter %>, <%= @acl_master_token %>, <%= @acl_agent_token %>, <%= @consul_data_dir %>, 以及 <%= @consul_encryption_key %> 是Chef模板中的变量。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

使用ACL策略控制Consul令牌

在Consul中,你可以通过使用ACL(Access Control List)策略来控制令牌的访问权限。以下是在你的情况下创建代理策略并将其应用于令牌的步骤:

  1. 创建ACL策略:
    首先,你需要创建一个ACL策略,以定义该策略允许的操作和权限。你可以通过HTTP API或Consul命令行工具来创建策略。下面是一个例子,你可以根据实际需求进行修改:
    shell
    consul acl policy create -name "agent-policy" -rules 'node_prefix "" { policy = "write" }'

    上述命令创建了一个名为”agent-policy”的策略,允许对所有节点进行写操作。

  2. 获取策略ID:
    创建策略后,会生成一个策略ID。你可以通过Consul命令行工具或HTTP API来获取策略ID。

  3. 将策略应用于令牌:
    在你的配置文件conf.json中,你可以通过将策略ID分配给acl_agent_token来将策略应用于令牌。以下是如何在配置文件中设置:
    json
    "acl_agent_token": {
    "secret_id": "<%= @acl_agent_token %>",
    "policies": ["agent-policy"]
    }

    请注意,这里的<%= @acl_agent_token %>是你的令牌的秘密ID。

通过上述步骤,你可以将创建的ACL策略应用于你的令牌,以控制其在Consul集群中的访问权限。

节点IP获取和配置

如果你的节点IP获取方式存在问题,可以尝试以下方法来获取正确的节点IP,并将其配置到Consul的join参数中:

  1. 通过主机名解析获取IP:
    在你的Ruby脚本中,可以使用主机名解析来获取节点的IP地址。例如,你可以使用Socket库来实现:
    ruby
    require 'socket'
    node_ip = Socket.getaddrinfo('node_hostname', nil)[0][3]

  2. 将IP配置到Consul的join参数:
    获取正确的节点IP后,你可以将其配置到Consul的join参数中,这可以在你的配置文件conf.json中完成:
    json
    "retry_join": ["node_ip1", "node_ip2"]

    在上述配置中,将实际的节点IP替换为node_ip1node_ip2

通过上述方法,你可以确保Consul节点的IP正确配置,从而正常加入集群。

性能监控权限问题

对于你在执行consul monitor命令时遇到的403权限错误,这可能与策略设置有关。请确保你的ACL策略允许了适当的权限,以便能够执行监控操作。

总结

在Consul中,通过使用ACL策略,你可以控制令牌的访问权限。你可以创建一个ACL策略并将其应用于令牌,从而限制

正文完