Consul 简介
Consul 是 HashiCorp 公司旗下的一个服务网格解决方案,提供了一个功能齐全的控制平面,具有服务发现、配置和分段功能。这些功能中的每一项都可以根据需要单独使用,也可以一起使用来构建一个完整的服务网格。在微服务框架中,经常会使用 Consul 来实现服务注册和发现。
Consul 的服务注册和发现功能有以下特点:
基于 Agent,分为 Client 和 Server 两种角色
Server 支持分布式、高可用集群部署,支持多集群。集群采用 RAFT 算法,Gossip 协议
服务注册支持 Agent 和 HTTP API 两种方式
服务发现支持 DNS 和 HTTP API 两种方式
支持服务的健康检查
自带 Web UI
F5的 MSDA 和 MSRA 工具目前均已支持对接 Consul,接下来就介绍使用方法,后面要用到的 rpm 包可以在以下地址下载。
MSDA下载地址:
https://github.com/ChinaModer...
MSRA下载地址:
https://github.com/ChinaModer...
F5 对接 Consul 实现服务发现
我们先搭建一个简单的 Consul 注册中心,并注册一个 web 服务,当前该服务共注册有两个实例。
接下来我们在 F5 上安装 msda-consul 的 iApp.LX 安装包,在下图所示的位置导入 rpm 文件。
接下来使用安装包生成的模板新建一个 iApp.LX 应用。
输入一个 iApp.LX 应用名字,模板选择 msdaconsul。
点击 Next 后依次填入 Consul 服务器的地址、需要发现的服务名称,以及需要在 F5 上生成的 Pool 名称、负载均衡算法、健康检查方法。
这里我们选择刚才提到的 web 服务。
点击 Deploy,部署该 iApp.LX 应用,状态为绿色,代表部署正常完成。
此时可以在 LTM 配置中看到创建的 Pool,Pool member 已从 Consul 正确获取到。
接下来我们在 Consul 的 web 服务下注册一个新的实例。
一段时间后,F5的Pool中也自动添加了这个实例。目前F5与Consul通信的默认周期为30秒。
至此,我们就完成了一个F5服务发现的配置。
F5 对接 Consul 实现服务注册
接下来我们演示如何将 F5 上配置的一个虚拟服务(Virtual Server,简称 vs)注册到 Consul 上。
首先在 F5 上配置一个简单的负载均衡服务,vs 名字为 web_vs_onf5。
要实现服务注册,同样需要先安装 msra-consul 的 iApp.LX 安装包。
接下来新建一个 iApp.LX 应用,模板选择 msraconsul。
和刚才演示的服务发现一样,我们也可以点击 Next 并依次填入相关参数后进行 Deploy。
但其实 F5 的 iAPP 是支持 REST API 方式进行配置的,这次服务注册我们就通过 API 来进行。
API Endpoint:
https://
HTTP 方法为 POST,内容格式为 JSON,以下就是我们这次注册需要 POST 的内容,相关 value 就是在 Web UI 中需要我们输入的内容。请注意注册到 Consul 上的服务名字是 F5 vs 的名字,本例中就是 web_vs_onf5。
{
"name": "msraconsul_web_vs",
"inputProperties": [
{
"id": "consulEndpoint",
"type": "STRING",
"value": "http://10.1.10.227:8500",
"metaData": {
"description": "consul endpoint address",
"displayName": "consul endpoints",
"isRequired": true
}
},
{
"id": "node",
"type": "STRING",
"value": "bigip247",
"metaData": {
"description": "Node name to be registered in consul server",
"displayName": "Node name in consul server",
"isRequired": true
}
},
{
"id": "nodeIpAddr",
"type": "STRING",
"value": "10.1.10.247",
"metaData": {
"description": "Node IP address to be registered",
"displayName": "Node IP Address",
"isRequired": true
}
},
{
"id": "serviceName",
"type": "STRING",
"value": "web_vs_onf5",
"metaData": {
"description": "Service name to be registered, virtual server name in F5",
"displayName": "Service Name",
"isRequired": true
}
},
{
"id": "serviceIpAddr",
"type": "STRING",
"value": "10.1.10.132",
"metaData": {
"description": "Service IP address to be registered",
"displayName": "IP address",
"isRequired": true
}
},
{
"id": "servicePort",
"type": "NUMBER",
"value": 80,
"metaData": {
"description": "Service port to be registered",
"displayName": "Service Port",
"isRequired": true
}
}
],
"dataProperties": [
{
"id": "pollInterval",
"type": "NUMBER",
"value": 30,
"metaData": {
"description": "Interval of polling VIP status, 30s by default.",
"displayName": "Polling Invertal",
"isRequired": false
}
}
],
"configurationProcessorReference": {
"link": "https://localhost/mgmt/shared/iapp/processors/msraconsulConfig"
},
"auditProcessorReference": {
"link": "https://localhost/mgmt/shared/iapp/processors/msraconsulEnforceConfiguredAudit"
},
"audit": {
"intervalSeconds": 60,
"policy": "ENFORCE_CONFIGURED"
},
"configProcessorTimeoutSeconds": 30,
"statsProcessorTimeoutSeconds": 15,
"configProcessorAffinity": {
"processorPolicy": "LOAD_BALANCED",
"affinityProcessorReference": {
"link": "https://localhost/mgmt/shared/iapp/processors/affinity/load-balanced"
}
},
"state": "BINDING"
}
完成 POST 后,我们同样可以看到已经成功 Deploy 的 iApp.LX 应用。
然后在 Consul 中,就能看到 F5 注册的服务。
F5 注册的服务无需配置健康检查,因为 F5 上的 vs 本身已经配置了健康检查,F5 只会将健康的 vs 注册到 Consul,一旦 F5 上的 vs 健康检查异常,F5 就会把相关实例从 Consul 上移除,直到 vs 恢复健康后又再次注册。我们尝试把 vs 后端的服务关闭,让 vs 处于不健康状态。
可以看到F5会自动把vs从Consul中移除。
至此,我们就完成了一个F5服务注册的配置。