美文网首页程序员
微服务注册中心Consul部署

微服务注册中心Consul部署

作者: 唯米天空 | 来源:发表于2020-05-28 21:42 被阅读0次

    目录

    • 部署节点
    • 部署设计
    • 依赖
    • 安装与运行
    • 维护

    1. 部署节点

    主机名  | 应用IP 
    ---|---|---
    registry01-consul | 192.168.0.11 
    registry02-consul | 192.168.0.12 
    registry03-consul | 192.168.0.13 
    

    2. 部署设计

    2.1 高可用

    Consul集群的访问链条如下:

    application->local consul client->consul server

    consul server采用三节点集群部署方式,角色为Leader, Follower, Follower。允许1个consul server出现故障。

    在需要访问consul服务的服务器上安装consul client,应用访问访问位于本地服务器的consul client,即127.0.0.1。

    consul client负责与consul server之间的通信。

    2.2 各节点角色及部署软件列表

    节点 IP 软件 角色
    registry01-consul 192.168.0.11 consul_1.7.2 server
    registry02-consul 192.168.0.12 consul_1.7.2 server
    registry03-consul 192.168.0.13 consul_1.7.2 server

    2.3 端口设计

    用途 详细说明 默认端口
    DNS服务 解析DNS请求 8600(tcp/udp)
    HTTP API 响应HTTP接口请求 8500(tcp)
    HTTPs API 默认关闭。响应HTTP接口请求 8501(tcp)
    gRPC API 默认关闭。xDS API to Envoy proxies 8502(tcp)
    LAN Serf 处理LAN gossip报文 8301(tcp/udp)
    Wan Serf 处理WAN gossip报文 8302(tcp/udp)
    RPC 响应来自其他agent的RPC请求 8300(tcp)
    Sidecar 包含该值, sidecar proxy 自动分配的最小端口 21000(tcp)
    Sidecar 包含该值, sidecar proxy 自动分配的最大端口 21255(tcp)

    3 软件准备

    3.1 consul

    consul官网

    https://www.consul.io/downloads

    4. 优化系统参数

    使用root用户

    4.1 修改limit

    在/etc/security/limits.d/目录下,新建102-consuluserres.conf资源限制配置文件,填入以下内容:

    consuluser       soft    nproc     102400
    consuluser       soft    nofile     1024000
    consuluser       hard    nofile     1024000
    consuluser soft memlock unlimited 
    consuluser hard memlock unlimited 
    

    最终效果:

    [consuluser@registry01-consul software]$ cat /etc/security/limits.d/102-consuluserres.conf 
    consuluser       soft    nproc     102400
    consuluser       soft    nofile     1024000
    consuluser       hard    nofile     1024000
    consuluser soft memlock unlimited 
    consuluser hard memlock unlimited 
    

    4.2 修改系统内核参数

    该步暂且不做,待运行后再根据实际情况调整。

    4.3 增加本地/etc/hosts

    为避免DNS故障,在本地/etc/hosts中添加Consul集群内所有节点的主机名。

    192.168.0.11  registry01-consul
    192.168.0.12  registry03-consul
    192.168.0.13  registry03-consul
    

    5. 依赖

    consul是个静态编译的,谁都不依赖。ldd查看结果:

    [consuluser@registry02-consul consul]$ ldd consul 
        不是动态可执行文件
    

    6. consul server部署步骤

    以下在3个节点操作。

    6.1 创建运行用户和组consuluser以及必要目录

    使用root用户

    为每台服务器创建consuluser账号(含用户和组)

    groupadd -g 500 consuluser && useradd -g 500 -u 500 consuluser && passwd consuluser
    

    创建consuluser家目录下的基本目录

    mkdir /opt/consuluser/{application,run,etc,software}
    

    创建consuluser数据目录

    mkdir /data/consuluser -p && chown -R consuluser:consuluser /data/consuluser
    

    使用consuluser用户

    创建consul程序、数据、运行和日志相关的目录

    mkdir -p $HOME/{application,etc,run}/consul
    mkdir /{data,logs}/consuluser/consul
    

    6.2 下载consul软件包

    wget https://releases.hashicorp.com/consul/1.7.2/consul_1.7.2_linux_amd64.zip -O $HOME/software/consul_1.7.2_linux_amd64.zip
    
    unzip $HOME/software/consul_1.7.2_linux_amd64.zip -d $HOME/application/consul/
    

    6.3 设置环境变量

    编辑$HOME/.bash_profile,增加以下内容:

    CONSUL_HOME=/opt/consuluser/application/consul
    PATH=$CONSUL_HOME:$PATH
    export PATH
    

    可以使用无交互命令直接追加。

    cat<<EOF>>$HOME/.bash_profile
    
    ####consul config#####
    
    CONSUL_HOME=$HOME/application/consul
    PATH=$CONSUL_HOME:$PATH
    
    export PATH
    EOF
    

    完成.bash_profile内容追加后,执行以下命令来使环境变量生效。

    source $HOME/.bash_profile
    

    6.4 准备配置文件

    6.4.1 配置加载说明

    consul提供了命令行启动参数、环境变量、配置文件3种配置手段来配置参数,配置的加载顺序依次为命令行启动参数、环境变量、配置文件。

    大多数配置参数都可以通过这3种手段进行配置。有2个关键参数只能在命令行启动参数中配置:进程ID和配置文件路径。

    本文主要采用配置文件方式进行参数配置。

    在命令行启动参数中指定配置文件或目录位置,使配置文件生效。

    如果使用配置目录,配置文件需要以.hcl或者.json为后缀命名才能被加载,加载顺序遵循配置文件名称在字母表中的顺序,譬如aaa.json要早于bbb.json加载。本文选用json格式。

    除了设置agent,配置文件也可以提供check和service定义。本文的consul,不在配置文件中定义check和service,交由程序和UI去控制。

    在consul配置文件的组织上,可以使用1个配置文件,也可以使用多个配置文件。本文的consul是按照功能进行了文件拆分,对应关系为:

    consul进程,consul.json
    consul日志,log.json
    consul服务,server.json
    consul网络,network.json
    consul访问控制,acl.json

    consul配置文件在$HOME/etc/consul中,新建consul.json, log.json, server.json, network.json, acl.json 5个配置文件,内容见以下章节。

    6.4.2 consul.json
    {
      "datacenter": "china-center",
      "data_dir": "/data/consuluser/consul",
      "encrypt": "xxxxxxxxxxxxxxxxxxx==",
      "node_name": "registry01-consul"
    }
    

    部署Consul集群时,本文件中node_name参数需要修改为各节点自己的节点名称。

    配置项解释

    datacenter: agent所属的数据中心名称。默认为dc1。属于同一个datacenter的agent应该在同一局域网LAN内。

    data_dir: consul数据目录,consul进程的所有数据存放在此参数指定的目录中。该目录要设置为600权限。

    encrypt: Consul集群内gossip通信使用的secret key, 32字节的 Base64 编码字符串。只有该字段相同的consul节点,才可以加入consul集群。同一集群内的consul节点该值必须一样,才能通信。这个值只需要节点第一次初始化启动的时候需要,会自动保存到data目录,下次启动时agent会自动加载。

    node_name: 集群中节点名称,集群内唯一,默认为主机名hostname。

    6.4.3 log.json
    {
      "log_file": "/logs/consuluser/consul/",
      "log_level": "info",
      "log_rotate_duration": "24h",
      "log_rotate_max_files": 33,
      "log_json": false
    }
    

    配置项解释

    log_file, 日志路径,如果不提供文件名,默认为consul-{timestamp}.log。

    log_level, 日志级别,默认为"info"。可选值为 "trace", "debug", "info", "warn", and "err"。

    log_rotate_duration,日志滚动周期。默认值为24h,表示24小时。

    log_rotate_max_files, 日志数量,默认为0,即不删除。可以设置为30,保留30天日志。本文设置为33.

    log_json,日志是否输出为json格式。

    6.4.4 server.json
    {
      "server": true,
      "ui": true,
      "bootstrap_expect": 3,
      "retry_join": [
        "registry01-consul",
        "registry02-consul",
        "registry03-consul"
      ],
      "performance": {
        "raft_multiplier": 1
      }
    }
    

    配置项解释

    server,指定agent以server模式运行。

    bootstrap_expect(-bootstrap-expect), 同一datacenter内期望的server节点数量。满足该参数指定数量的server可用后,集群开始启动bootstrap。

    ui(-ui),是否启用web界面。默认为否。

    retry_join(-retry-join),加入某节点。如果加入失败,会继续重试。一旦加入成功,就不会再次尝试。

    6.4.5 network.json

    大多数情况下,只需要指定以下两个参数。

    {
      "bind_addr": "192.168.0.11",
      "client_addr": "0.0.0.0"
    }
    

    部署Consul集群时,本文件中bind_addr参数需要修改为各节点本身的IP。

    配置项解释

    bind_addr(-bind), 集群内部通信地址,该IP必须与其他节点互通可达。默认为0.0.0.0,即在所有网络接口上bind,但是如果是多个IP地址,Consul会在启动时报错退出。在本文环境中,必须指定为bond1应用网卡IP。

    client_addr (-client), 面向客户端的本地网络接口的IP,默认是127.0.0.1,即只允许本地client访问,设置为0.0.0.0即可。

    6.4.6 acl.json
    {
      "acl":{
        "enabled": true,
        "default_policy": "deny",
        "down_policy": "extend-cache",
        "enable_token_persistence": true,
        "tokens": {
           "agent": "12345678-1234-1234-1234-123456781234"
        }
      }
    }
    

    配置项解释

    enabled,是否启用ACL。

    default_policy, 默认ACL策略,可选值为"allow"和"deny",默认为"allow"。

    enable_token_persistence, 可选值为true和false, 默认为true。设置为true,表示使用API设置了agent的token,该token会自动保存到磁盘,下次agent重启会重载该token。反之,不保存。

    tokens,agent所使用的token。

    6.5 firewalld/iptables防火墙规则

    修改/etc/firewalld目录下的文件,加入防火墙规则。

    6.5.1 IP地址列表定义文件

    /etc/firewalld/ipsets/consul_nodes.xml

    <?xml version="1.0" encoding="utf-8"?>
    <ipset type="hash:net">
      <entry>192.168.0.11</entry>
      <entry>192.168.0.12</entry>
      <entry>192.168.0.13</entry>
    </ipset>
    
    6.5.2 Service服务定义文件

    /etc/firewalld/services/consul.xml

    <?xml version="1.0" encoding="utf-8"?>
    <service>
    <short>consul</short>
    <description>consul</description>
    <port protocol="tcp" port="8500"/>
    <port protocol="tcp" port="8600"/>
    </service>
    
    6.5.3 安全策略文件

    /etc/firewalld/zones/public.xml

    <service name="consul"/>
    <rule family="ipv4">
        <source ipset="consul_nodes"/>
        <accept/>
    </rule>
    
    6.5.4 重载firewalld

    重新加载配置文件。

    systemctl restart firewalld

    systemctl reload firewalld

    6.6 加入systemd/init系统服务

    systemd启动文件consul.service内容:

    [Unit]
    Description="HashiCorp Consul - A service mesh solution"
    Documentation=https://www.consul.io/
    Requires=network-online.target
    After=network-online.target
    ConditionFileNotEmpty=/opt/consuluser/etc/consul/consul.json
    
    [Service]
    User=consuluser
    Group=consuluser
    ExecStart=/opt/consuluser/application/consul/consul agent -config-dir=/opt/consuluser/etc/consul/ -pid-file=/opt/consuluser/run/consul/consul.pid
    ExecReload=/opt/consuluser/application/consul/consul reload
    KillMode=process
    Restart=on-failure
    LimitNOFILE=102400
    
    [Install]
    WantedBy=multi-user.target
    

    6.7 启动

    6.7.1 首次启动consul

    以下均使用consuluser账户。

    acl.json

    {
      "acl":{
        "enabled": true,
        "default_policy": "deny",
        "down_policy": "extend-cache",
        "enable_token_persistence": true
      }
    }
    

    使用以下命令依次启动3个节点的consul server。

    /opt/consuluser/application/consul/consul agent -config-dir=/opt/consuluser/etc/consul/ -pid-file=/opt/consuluser/run/consul/consul.pid
    

    加入acl.json,重启consul server

    6.7.2 创建bootstrap token
    [consuluser@registry03-consul consul]$ consul acl bootstrap
    AccessorID:       12345678-1234-1234-1234-123456781234
    SecretID:         12345678-1234-1234-1234-123456781234
    Description:      Bootstrap Token (Global Management)
    Local:            false
    Create Time:      2020-05-28 18:36:29.632420315 +0800 CST
    Policies:
       12345678-1234-1234-1234-123456781234 - global-management
    

    使用该token,查看members, 响应正常表示token生成成功。

    [consuluser@registry01-consul ~]$ consul members -token "12345678-1234-1234-1234-123456781234"
    Node                                      Address             Status  Type    Build  Protocol  DC           Segment
    registry01-consul  192.168.0.11:8301  alive   server  1.7.2  2         china-center  <all>
    registry02-consul  192.168.0.12:8301  alive   server  1.7.2  2         china-center  <all>
    registry03-consul  192.168.0.13:8301  alive   server  1.7.2  2         china-center  <all>
    
    6.7.3 创建agent policy和token

    和 token 相关的 policy 和 token create 的脚本和配置文件,均存放在以下目录,便于直接修改使用。

    $HOME/data/consul/agent-token
    

    其中agent-token目录为agent token使用,ui-token目录为ui token使用。

    在每一个节点上执行以下操作,创建token。

    1. 设置master token环境变量

      export CONSUL_HTTP_TOKEN=12345678-1234-1234-1234-123456781234

    2. 创建policy配置文件agent-policy.hcl,对node可写,对service可读。node_prefix的值替换为每一个节点的node_name。

    新建agent-policy.hcl文件。

    vi agent-policy.hcl
    

    填入以下内容,保存退出。

    # agent-policy.hcl contains the following:
    node_prefix "" {
       policy = "write"
    }
    service_prefix "" {
       policy = "read"
    }
    
    1. 创建policy

    执行以下命令

    consul acl policy create -name "agent-policy" -rules @agent-policy.hcl
    

    返回以下内容

    ID:           12345678-1234-1234-1234-123456781234
    Name:         agent-policy
    Description:  
    Datacenters:  
    Rules:
    node_prefix "registry01-consul" {
      policy = "write"
    }
    service_prefix "" {
       policy = "read"
    }
    
    1. 创建token

    执行创建token的命令

    consul acl token create -description "Agent Token" -policy-name agent-policy
    

    返回以下内容

    AccessorID:       12345678-1234-1234-1234-123456781234
    SecretID:         12345678-1234-1234-1234-123456781234
    Description:      Agent Token
    Local:            false
    Create Time:      2020-05-28 19:10:20.010578858 +0800 CST
    Policies:
       12345678-1234-1234-1234-123456781234 - agent-policy
    
    1. 如果需要创建和原数据中心一样的token,执行以下命令。(没必要,但是可以作为双中心service的token生成的命令参考)

    执行以下命令

    consul acl token create -description "Agent Token" -policy-name agent-policy -secret=12345678-1234-1234-1234-123456781234 -accessor=12345678-1234-1234-1234-123456781234
    

    返回以下内容

    AccessorID:       12345678-1234-1234-1234-123456781234
    SecretID:         12345678-1234-1234-1234-123456781234
    Description:      Agent Token
    Local:            false
    Create Time:      2020-05-28 19:17:18.456733101 +0800 CST
    Policies:
       12345678-1234-1234-1234-123456781234 - agent-policy
    
    6.7.4 修改Consul配置文件并重启Consul

    修改各节点的acl.json配置文件,添加tokens信息,并依次重启consul。

    registry01-consul

    acl.json

    [consuluser@registry01-consul consul]$ cat acl.json 
    {
      "acl":{
        "enabled": true,
        "default_policy": "deny",
        "down_policy": "extend-cache",
        "enable_token_persistence": true,
        "tokens": {
           "agent": "12345678-1234-1234-1234-123456781234"
        }
      }
    }
    

    使用consuluser用户执行以下命令关闭consul。

    [consuluser@registry01-consul consul]$ consul leave
    Graceful leave complete
    

    切换到root用户下,使用systemd启动consul。

    [consuluser@registry01-consul consul]$ su -
    密码:
    上一次登录:四 5月 28 17:36:42 CST 2020pts/0 上
    最后一次失败的登录:四 5月 28 20:06:06 CST 2020pts/1 上
    最有一次成功登录后有 2 次失败的登录尝试。
    [root@registry01-consul ~]# systemctl start consul
    

    可以使用systemctl status consul查看服务状态。

    registry02-consul

    acl.json

    [consuluser@registry02-consul consul]$ cat acl.json 
    {
      "acl":{
        "enabled": true,
        "default_policy": "deny",
        "down_policy": "extend-cache",
        "enable_token_persistence": true,
        "tokens": {
           "agent": "12345678-1234-1234-1234-123456781234"
        }
      }
    }
    

    使用consuluser用户执行以下命令关闭consul。

    [consuluser@registry02-consul consul]$ consul leave
    Graceful leave complete
    

    切换到root用户下,使用systemd启动consul。

    [root@registry02-consul ~]# systemctl start consul
    

    可以使用systemctl status consul查看服务状态。

    registry03-consul

    acl.json

    [consuluser@registry03-consul consul]$ cat acl.json 
    {
      "acl":{
        "enabled": true,
        "default_policy": "deny",
        "down_policy": "extend-cache",
        "enable_token_persistence": true,
        "tokens": {
           "agent": "12345678-1234-1234-1234-123456781234"
        }
      }
    }
    

    使用consuluser用户执行以下命令关闭consul。

    [consuluser@registry03-consul consul]$ consul leave
    Graceful leave complete
    

    切换到root用户下,使用systemd启动consul。

    [root@registry03-consul ~]# systemctl start consul
    

    可以使用systemctl status consul查看服务状态。

    6.7.5 添加UI Token (可选)

    可以添加UI Token,赋予所有node/server/kv的只读权限,用于在UI中查看节点/服务/KV。

    在任意节点上执行以下操作,创建UI Policy和UI Token。

    1. 设置master token环境变量

      export CONSUL_HTTP_TOKEN=12345678-1234-1234-1234-123456781234

    2. 创建policy配置文件ui-policy.hcl,对所有node/service/kv可读。

    新建ui-policy.hcl文件。

    vi ui-policy.hcl
    

    填入以下内容,保存退出。

    # ui-policy.hcl contains the following:
    node_prefix "" {
       policy = "read"
    }
    service_prefix "" {
       policy = "read"
    }
    kv_prefix "" {
       policy = "read"
    }
    
    1. 创建policy

    执行以下命令

    consul acl policy create -name "ui-policy" -rules @ui-policy.hcl
    

    返回以下内容

    ID:           12345678-1234-1234-1234-123456781234
    Name:         ui-policy
    Description:  
    Datacenters:  
    Rules:
    service_prefix "" {
      policy = "read"
    }
    key_prefix "" {
      policy = "read"
    }
    node_prefix "" {
      policy = "read"
    }
    
    1. 创建token

    执行创建token的命令

    consul acl token create -description "Token for UI" -policy-name ui-policy
    

    返回以下内容

    AccessorID:       12345678-1234-1234-1234-123456781234
    SecretID:         12345678-1234-1234-1234-123456781234
    Description:      Token for UI
    Local:            false
    Create Time:      2020-05-28 20:31:08.116028351 +0800 CST
    Policies:
       12345678-1234-1234-1234-123456781234 - ui-policy
    
    6.7.6 访问UI

    打开浏览器,输入以下地址访问consul ui。

    http://192.168.0.11:8500/ui
    

    在ACL标签面板中,填入上一步创建的UI Token,即可查看所有节点、服务和KV的情况。

    也可以填入ACL Bootstrap阶段创建的Master Token,用于在UI上管理ACL、节点、服务和KV等。

    7. 维护

    7.1 启动和停止

    启动:

    systemctl start consul
    

    停止:

    systemctl stop consul
    

    状态:

    systemctl status consul
    

    7.2 日志查看

    日志保存在/logs/consuluser/consul中,可以直接查看。

    相关文章

      网友评论

        本文标题:微服务注册中心Consul部署

        本文链接:https://www.haomeiwen.com/subject/nvuzahtx.html