consul agent -dev -ui
退出
Ctrl^c
或者
kill -INT consul-pid
这种情况下, 节点会通知集群自己即将离开集群。
也可以强制退出
kill -9 consul-pid
加入集群
通过join
命令或者通过配置文件自动join.
命令行配置
Consul的配置可以通过配置文件和命令行来指定,配置文件可以有多个,加载配置文件的顺序是字典序的, 后面的会覆盖前面的, 并且命令行的参数会覆盖配置文件里的参数。
Consul的配置可通过SIGHUP
信号或reload
命令来重新加载。
命令行参数:
下面是我认为的一些比较重要的命令行参数
-bootstrap
: 用来指定agent以"bootstrap" 模式启动, 一个集群里只能有一个服务器以"bootstrap"模式启动 , 因为以bootstrap模式启动的会自动称为集群的leader, 而集群的leader只能有一个。
-bootstrap-expect
: 指定期望启动的以server模式启动的agent。只有当指定的server启动之后集群才开始启动。
-bind
: 指定集群内部通信的地址, 默认是0.0.0.0
,如果有多个地址consul会报错。另外Consul中tcp和udp使用同一个端口。
-client
: Consul绑定的客户端接口地址, 包括HTTP服务器和DNS服务器。默认是127.0.0.1
。
-config-file
: 配置文件地址, 可指定多次, 后面覆盖前面
-config-dir
: 配置文件目录, 会读取里面的所有以.json
和.hcl
结尾的配置文件。此选项可指定多次。
-data-dir
: Consul客户端用来存储数据的目录
-dev
: 启用开发模式。在此模式下, 客户端不会启用持久化, 所有数据都保存在内存中。Connect也是关闭的。
-domain
: 指定域名, 默认是consul.
。
-join
: 指定需要加入的另一个客户端的地址, 可以多次指定不同的地址。 如果Consul join失败客户端会启动失败。
-retry-join
: 类似于-join
, 不过会在第一次失败的时候重试。可以指定IPv4, IPv6和DNS地址。可以指定多次, 如果指定多次, 则Consul按照顺序依次尝试, 直到第一次成功。另外从0.9.1版本开始, consul支持加入各个云服务提供商的集群, 具体见https://www.consul.io/docs/agent/cloud-auto-join.html。
配置文件
配置文件可以用来设置Consul客户端, 提供check和service定义。
示例配置文件如下:
{
"datacenter": "east-aws",
"data_dir": "/opt/consul",
"log_level": "INFO",
"node_name": "foobar",
"server": true,
"watches": [
{
"type": "checks",
"handler": "/usr/bin/health-check-handler.sh"
}
],
"telemetry": {
"statsite_address": "127.0.0.1:2180"
}
}
Consul默认不会对HTTP API启用TLS, 除非https
配置项被指定。
常用配置项:
acl: 配置ACL的各种参数。
bootstrap: 等同于-bootstrap
bootstrap_expect: 等同于-bootstrap-expect
bind_addr: 等同于-bind
verify_incoming: 如果设为true, 要求所有进来的连接都使用TLS。
verify_outgoing: 如果设为true, 要求所有出去的连接都使用TLS。
verify_server_hostname: 如果设为true,会验证所有出去的使用TLS的的连接的证书的域名匹配当前客户端的域名。
connect: Connect的各项配置
watches: 一个watcher的列表, 当被watch的数据变化的时候, 会自动调用指定的外部应用。
配置项
配置项用来提供集群里的各种默认配置, 可以通过CLI和API来配置, 也可以内嵌在配置文件中。每个配置项都有两个属性:Kind
和Name
。
示例:
Kind = "<supported kind>"
Name = "<name of entry>"
支持的Kind
类型有这几s种:
service-router
: 基于HTTP层路由请求
service-splitter
: 转发路由到一个服务的示例不同子集中
service-rosolver
: 根据不同规则匹配实例
service-defaults
: 配置一个服务所有服务的默认配置
proxy-defaults
: 配置代理
另外, 每个配置项中都可以配置ACL访问规则
以下是常见命令:
列出服务默认配置
consul config list -kind service-defaults
读取一个服务的配置
consul config read -kind service-defaults -name web
根据配置文件修改默认配置
consul config write proxy-defaults.hcl
删除配置
consul config delete -kind service-defaults -name web
服务注册
通过Consul客户端可以定义一个service, 可选地也可以定义一个和service关联的健康检查。
服务可以在配置文件中定义,或者在运行时通过通过HTTP接口注册。
官方文档中一个完整的服务注册配置如下:
{
"service": {
"id": "redis",
"name": "redis",
"tags": ["primary"],
"address": "",
"meta": {
"meta": "for my service"
},
"tagged_addresses": {
"lan": {
"address": "192.168.0.55",
"port": 8000,
},
"wan": {
"address": "198.18.0.23",
"port": 80
}
},
"port": 8000,
"enable_tag_override": false,
"checks": [
{
"args": ["/usr/local/bin/check_redis.py"],
"interval": "10s"
}
],
"kind": "connect-proxy",
"proxy_destination": "redis", // Deprecated
"proxy": {
"destination_service_name": "redis",
"destination_service_id": "redis1",
"local_service_address": "127.0.0.1",
"local_service_port": 9090,
"config": {},
"upstreams": [],
"mesh_gateway": {
"mode": "local"
},
"expose": {
"checks": true,
"paths": [
{
"path": "/healthz",
"local_path_port": 8080,
"listener_port": 21500,
"protocol": "http2"
}
]
}
},
"connect": {
"native": false,
"sidecar_service": {}
"proxy": { // Deprecated
"command": [],
"config": {}
}
},
"weights": {
"passing": 5,
"warning": 1
},
"token": "233b604b-b92e-48c8-a253-5f11514e4b50",
"namespace": "foo"
}
}
一个service必须包含一个name, 以及可选的id, tags, address, meta, port, enable_tag_override以及check。
id不填的话默认是name的值。
tags主要是用来区别不同的节点, 不同的服务版本等等。
meta提供元数据信息。
Connect:
当kind为connect-proxy
时, 这个服务被标记为connect代理实例, 此时destination_service_name`是必填的。
Connect也可以和service共存在一台服务器上,通过设置native
为true, 或者native
为false, 设置sidecar_serice
属性。
也可以通过services
配置多个service。