consul注册中心

consul

作用与zookeeper一样,提供服务注册、服务发现、配置中心
每个运行consul的节点为一个agent,可以是client或server模式,每个数据中心必须拥有至少一台server来保存consul集群状态信息,建议在生产环境
使用systemd启动时,需设置为Type=notify

官方文档:https://developer.hashicorp.com/consul/docs

端口:

  • 8300 服务端口
  • 8301 lan(广域网)网络通信端口
  • 8302 van(局域网)网络通信端口
  • 8500 web UI的端口,客户端访问端口
  • 8501 https端口,默认关闭
  • 8502 grpc端口,默认关闭
  • 8600 作为dns服务器时使用的端口

特征

  • 服务发现: Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。
  • 健康检测: Consul的Client提供了健康检查的机制,可以通过用来避免流量被转发到有故障的服务上。
  • Key/Value 存储: 应用程序可以根据自己的需要使用Consul提供的Key/Value 存储。Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
  • 多数据中心: Consul支持开箱即用的多数据中心.这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域

角色:

  • client: 无状态,将http和dns接口请求转发给内部的客户端集群
  • server: 保存配置信息、高可用集群

服务发现以及注册工作原理:

  • A微服务启动后把自己的ip、port注册进consul的client,B微服务启动后在consul的server找A的可用列表,拿到A地址后,进行通信
  • consul默认每隔10s像A发起健康检测

模式:

单节点开发模式:

单台主机就行

集群模式:

一个consul集群包含client端和server端
server之间进行选举,建议一个或多个client对应一个server,提高效率,一个client对应多个server,可能有瓶颈
server必须3台及以上,client随意

client:

  • 无状态的
  • 负责接收外部请求,然后转发给server
  • 负责把server处理完的信息,发出去

seever:

  • leader负责同步注册信息给其他从serv er和节点检测
  • 处理client发过来的请求,各个server之间进行数据同步
  • 把处理后的请求返回给client

consul命令:

子命令:

agent		开启代理功能
config		命令行配置consul
connect
debug
exec		在node节点执行命令
force-leave		强制离线server
join		加入集群
keygen		生成key,可用于集群间加密通信
members		查看集群节点数量
monitor
leave		从集群中移除节点
reload		重载配置
services	注册服务
info		查看节点信息
snapshot	数据备份,做快照,与etcd一样
tls			创建ca和相关证书
troubleshoot	服务网格做问题跟踪
validate		验证配置文件和目录
watch		监控consul变动

agent选项:

consul agent [选项]

-auto-reload-config 
-alt-domain 		此标志允许 Consul 响应除主域之外的备用域中的 DNS 查询。如果未设置,则不使用备用域
-max-query-time 600				默认600s查询
-advertise  '{{ GetInterfaceIP "eth0" }}'		广播通告ip,默认等于-bind地址				
-advertise-wan				设置在WAN上广播的地址,跨网段时使用,数据中心不再一个机房时要用
-allow-write-http-from        只允许来自给定网络的写入端点调用。CIDR格式,可以多次指定
-bootstrap  此标志用于控制服务器是否处于“引导”模式。在此模式下,每个数据中心运行的服务器不得超过一台,这一点很重要。从技术上讲,允许处于引导模式的服务器自行选择作为 Raft 领导者。重要的是,只有一个节点处于此模式;否则,由于多个节点能够自选,因此无法保证一致性。不建议在引导集群后使用此标志
-bootstrap-expect 3				指定相同的值,或者在所有服务器上根本不指定任何值。只有指定值的服务器才会尝试引导群集
-client '{{ GetPrivateInterfaces | exclude "type" "ipv6" | exclude "name" "br.*" | join "address" " " }} {{ GetAllInterfaces | include "flags" "loopback" | join "address" " " }}'			允许哪些客户端访问
-bind 				默认0.0.0.0
	'{{ GetPrivateInterfaces | include "network" "10.0.0.0/8" | attr "address" }}'	使用网段
	'{{ GetInterfaceIP "eth0" }}'		绑定网卡
	'{{ GetAllInterfaces | include "name" "^eth" | include "flags" "forwardable|up" | attr "address"  | exclude "name" "br.*" }}'		可转发数据、可用的网卡
-config-dir /opt/consul/conf.d 
-data-dir  /opt/consul/data				600权限
-dev
-datacenter d1 
-default-query-time 300 		默认300s查询超时
-disable-host-node-id false			不使用随机生成节点名
-dns-port 8600
-domain consul.				默认响应“consul.”域中的 DNS 查询。此标志可用于更改该域。假定此域中的所有查询都由 Consul 处理,并且不会递归解析
-enable-local-script-checks 健康检查脚本
-encrypt 密钥				Base64 编码的 32 个字节,可直接用consul keygen生成,群集中的所有节点必须共享相同的加密密钥才能进行通信。提供的密钥会自动保存到数据目录中,并在代理重新启动时自动加载。这意味着要加密 Consul 的八卦协议,只需在每个代理的初始启动序列上提供一次此选项。如果在使用 Consul 初始化加密密钥后提供,则提供的密钥将被忽略,并显示警告
-grpc-port				默认-1禁用
-http-port 8500
-https-port				默认-1禁用
-log-file				日志文件
-log-rotate-bytes 字节			日志轮转时文件必须大于此才能轮转
-log-rotate-duration 24h		日志轮转时间,默认24h
-log-level 级别				"trace", "debug", "info", "warn", and "error"。跟踪”、“调试”、“信息”、“警告”和“错误
-log-json				json格式输出日志,做日志收集时再开
-log-rotate-max-files 5          最大保留日志文件数
-node node3               集群中唯一,会用dns解析该主机名,可加hosts文件中
-primary-gateway 网关      主数据中心的网关地址,用于在启动时引导WAN联邦,启用重试。可以多次指定
-recursor dns服务器				指定上级dns地址,可指定自建dns解析公司内部域名
-retry-join ip或域名			可多次指定
	"consul.domain.internal"
-retry-join-wan				启动时要加入的另一个 WAN 代理的地址
-rejoin					重启后自动加入
-retry-max 0              0为无限次
-retry-max-wan
-syslog				输出到系统日志
-serf-lan-allowed-cidrs 网段		允许集群内网地址来自多个网段
-serf-lan-port 8301 			集群内网通信端口
-serf-wan-allowed-cidrs wan网段
-serf-wan-port 8302
-server-port 8300
-ui

tls选项:

consul tls [ca | cert] create [选项]

-additional-dnsname 域名   	提供额外的解析域名。localhost总是包含在内。这个标志可以提供多次。
-additional-ipaddress ip      提供额外的解析ip。127.0.0.1总是包含在内。这个标志可以提供多次。
-ca ca证书      ca路径。默认为:顶级域-agent-ca.pem,也就是:consul-agent-ca.pem
-cli          生成cli证书
-client       生成客户端证书
-days int     提供证书的有效天数。默认为 1 年。 (默认为 365 天)
-dc string        	提供数据中心。只对 -server 证书有影响。默认为 "dc1"
-domain 顶级域      提供顶级域。只对 -server 证书有影响。 默认为 ".consul",也就是解析为: server.数据中心.consul
-key ca私钥       ca的key路径。默认为:DOMAIN-agent-ca-key.pem
-node string      当生成服务器证书并设置此项时,会包含形式为 <node>.server.<datacenter>.<domain> 的额外 dns 名称。
-server           生成服务器证书

snapshot使用:

consul snapshot save /tmp/consul-data-`date +%F`.snap		备份
consul snapshot restore /tmp/consul-data-`date +%F`.snap	恢复
consul snapshot inspect /tmp/consul-data-`date +%F`.snap	查看信息

标准配置文件:

主配置

{
  "node_name": "consul-server",
  "server": true,
  "bootstrap_expect": "3",
  "datacenter": "dc1",
  "data_dir": "consul/data",
  "log_level": "INFO",
  "addresses": {
    "http": "0.0.0.0"
  },
  "ports": {
    "https": 8501
  },
  "bind_addr": "{{ GetPrivateIP }}",
  "client_addr": "{{ GetPrivateInterfaces | exclude \"type\" \"ipv6\" | join \"address\" \" \" }} {{ GetAllInterfaces | include \"flags\" \"loopback\" | join \"address\" \" \" }}",
  "advertise_addr": "{{ GetInterfaceIP \"en0\"}}",
  "retry_join": [
    "consul-server1", 
    "consul-server2"
  ],
  "ui_config": {
    "enabled": true,
  },
  "auto_encrypt": {
    "allow_tls": true,	#仅服务端使用,开启自动加密
    "tls": true			#仅客户端使用,启用自动加密,并让客户端节点自动从服务器节点获取 TLS 证书,还需要在服务器节点上启用connect选项
  },
  "connect": {
    "enabled": true,
    "ca_config": {		#客户端开启自动加密时,用此ca签发客户端证书,如果集群开启https,需要与集群间ca一致
      "private_key": ca私钥内容,
      "root_cert": ca证书
    }
  },
  "encrypt": "aPuGh+5UDskRAbkLaXRzFoSOcSM+5vAK+NEYOWHJH7w=",
  "tls": {
    "defaults": {
      "verify_incoming": false,		#http请求入栈检测tls
      "verify_outgoing": false,		#http请求出栈检测tls
      "ca_file": "/consul/config/certs/consul-agent-ca.pem",
      "cert_file": "/consul/config/certs/dc1-server-consul-0.pem",
      "key_file": "/consul/config/certs/dc1-server-consul-0-key.pem"
    },
    "internal_rpc": {
      "verify_server_hostname": false		#跳过主机和证书验证
    }
  },
  "service": {				#启动时注册服务,按需配置
    "id": "dns",
    "name": "dns",
    "tags": ["primary"],
    "address": "localhost",
    "port": 8600,
    "check": {
      "id": "dns",
      "name": "Consul DNS TCP on port 8600",
      "tcp": "localhost:8600",
      "interval": "10s",
      "timeout": "1s"
    }
  },
  "limits": {			#限速配置
    "http_max_conns_per_client": 400,
    "request_limits": { 
        mode = "permissive",
        read_rate = 1000.0,         #默认-1无限
        write_rate = 500.0
    },
    "rpc_max_conns_per_client": 200,
    "rpc_rate": 5000.0,
    "rpc_max_burst": 10000          #默认1000个
  },
  "telemetry": {			#指标数据传输
    "disable_hostname": true,			#停止将计算机的主机名预置为仪表类型指标,默认关闭
    "enable_host_metrics": true,		#显示主机节点的信息,默认关闭
    "prometheus_retention_time": "10s"		#必须在此处开启普罗米修斯的配置,普罗米修斯才能采集到consul数据,不然prom不会报错但一直不显示内容
  }
}

服务注册:

启动时注册:
#一个服务注册
{
  "service":    #注册单个服务用的关键词
  {
    "id": "node_exporter-node01",
    "name": "node01",
    "address": "172.29.1.11",
    "port": 9100,
    "tags": ["nodes", "linux"],
    "checks": [{
        "http": "http://172.29.1.11:9100/metrics",
        "interval": "5s"
    }]
  }
}


#多个服务注册
{
  "services": [	    #注册多个服务用的关键词
  {
    "id": "node_exporter-node01",	#注册的服务id号
    "name": "node01",	#服务名称
    "address": "2.2.2.43",	#服务地址
    "port": 9100,		#服务端口
    "tags": ["nodes"],	#加的标签
    "checks": [{		#状态检测
        "http": "http://2.2.2.43:9100/metrics",
        "interval": "5s"
    }]
  },
  {
    "id": "node_exporter-node02",
    "name": "node02",
    "address": "2.2.2.53",
    "port": 9100,
    "tags": ["nodes"],
    "checks": [{
        "http": "http://2.2.2.53:9100/metrics",
        "interval": "5s"
    }]
  },
  {
    "id": "node_exporter-node03",
    "name": "node03",
    "address": "2.2.2.63",
    "port": 9100,
    "tags": ["nodes"],
    "checks": [{
        "http": "http://2.2.2.63:9100/metrics",
        "interval": "5s"
    }]
  }]
}
api方式注册:
#json文件
{
	"id": "node_exporter-node01",
	"name": "node01",
	"address": "172.29.1.11",
	"port": 9100,
	"tags": ["nodes", "linux"],
	"checks": [{
          "http": "http://172.29.1.11:9100/-/healthy",
          "interval": "5s"
	}]
}

#注册服务
curl -X PUT --data @xx.json http://127.0.0.1:8500/v1/agent/service/register

#查看服务
consul  catalog services

#注销服务
curl -X PUT http://127.0.0.1:8500/v1/agent/service/deregister/node_exporter-node01

监控:

信号:

将指标输出到日志记录

kill -10 pid

api:

curl 2.2.2.35:8500/v1/agent/metrics
telemetry:

配置Consul将数据发送到远程监控系统,支持一下:

  • Statsd
  • dogstatsd
  • prometheus
  • circonus

普罗米修斯:

{
  "telemetry": {
    "disable_hostname": true,
    "enable_host_metrics": true,
    "prometheus_retention_time": "10s"
  }
}
posted @ 2023-11-06 18:12  suyanhj  阅读(602)  评论(0)    收藏  举报