hivemq/hivemq-dns-cluster-discovery-extension
GitHub: hivemq/hivemq-dns-cluster-discovery-extension
为 HiveMQ 提供基于 DNS 的集群节点自动发现能力,使其能在 Kubernetes、OpenShift 等容器编排平台中实现弹性动态组网。
Stars: 11 | Forks: 3
:hivemq-link: https://www.hivemq.com
:hivemq-support: {hivemq-link}/support/
:round-robin: https://en.wikipedia.org/wiki/Round-robin_DNS
:hivemq-docker-image: https://github.com/hivemq/hivemq4-docker-images
:dns-discovery-image: {hivemq-docker-image}#hivemq-dns-discovery-image
:docker-swarm: {hivemq-docker-image}#local-cluster-with-docker-swarm
= HiveMQ DNS 集群发现扩展
image:https://img.shields.io/badge/Extension_Type-Integration-orange?style=for-the-badge[Extension Type]
image:https://img.shields.io/github/v/release/hivemq/hivemq-dns-cluster-discovery-extension?style=for-the-badge[GitHub release (latest by date),link=https://github.com/hivemq/hivemq-dns-cluster-discovery-extension/releases/latest]
image:https://img.shields.io/github/license/hivemq/hivemq-dns-cluster-discovery-extension?style=for-the-badge&color=brightgreen[GitHub,link=LICENSE]
image:https://img.shields.io/github/actions/workflow/status/hivemq/hivemq-dns-cluster-discovery-extension/check.yml?branch=master&style=for-the-badge[GitHub Workflow Status,link=https://github.com/hivemq/hivemq-dns-cluster-discovery-extension/actions/workflows/check.yml?query=branch%3Amaster]
== 目的
此 HiveMQ 扩展使您能够使用容器编排平台(Kubernetes、Openshift)以及云环境来运行弹性 HiveMQ 集群。
它使用 DNS 作为集群发现机制,这对于动态扩缩容的环境非常理想。
只要 HiveMQ 实例通过 DNS 变得可用,就会在运行时动态添加或移除它们。
此扩展通常与 {hivemq-docker-image}[Docker] 和容器编排平台结合使用。
只要云环境 / 容器编排环境支持使用 {round-robin}[round-robin^] DNS A 记录进行服务发现,就可以使用此扩展。
== 安装说明
必须解压该扩展,并将完整的扩展文件夹放入 extensions 文件夹中。
完成此操作后,请按照“配置”章节中的说明,根据您的需求调整属性。
== 配置
应使用以下环境变量或属性键来自定义发现参数。
如果提供了属性文件(`conf/` 文件夹中的 `config.properties`
),扩展将使用此文件中的键值对,并在文件更改时重新加载这些值。
扩展将首先尝试加载属性文件。
如果文件不存在,扩展将不会尝试重新加载属性,而是尝试在每次迭代时从环境变量中读取,直到 broker 关闭。
*配置选项:*
|=======================================================================
|环境变量 |默认值 |属性键 |含义
|HIVEMQ_DNS_DISCOVERY_ADDRESS |- |discoveryAddress |提供 A 记录的地址,用作集群节点地址
|HIVEMQ_DNS_DISCOVERY_TIMEOUT |30 |resolutionTimeout |等待 DNS 解析完成的超时时间
|HIVEMQ_DNS_RELOAD_INTERVAL | 30 | reloadInterval | 用于更新所有 HiveMQ 集群节点地址的重载间隔。 |
|=======================================================================
== Metrics
DNS 集群发现扩展提供了一组指标,可用于在仪表盘中监控其行为。
以下是可以使用的指标:
这两个计数器指标指示了为接收集群成员的 IP 地址而进行的 DNS 查询尝试是成功还是失败:
## com.hivemq.dns-cluster-discovery-extension.query.success.count
com.hivemq.dns-cluster-discovery-extension.query.failed.count
此 gauge 显示了在上一次 DNS 查询期间接收到的当前已找到的集群成员 IP 地址数量:
## com.hivemq.dns-cluster-discovery-extension.resolved-addresses
[[sample-dns-record]]
== DNS 记录示例
以下列表展示了扩展期望并解析的 round-robin A 记录示例:
....
$ dig tasks.hivemq
; <<>> DiG 9.10.3-P4-Debian <<>> tasks.hivemq
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21767
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;tasks.hivemq. IN A
;; ANSWER SECTION:
tasks.hivemq. 600 IN A 10.0.0.6
tasks.hivemq. 600 IN A 10.0.0.5
tasks.hivemq. 600 IN A 10.0.0.4
tasks.hivemq. 600 IN A 10.0.0.7
tasks.hivemq. 600 IN A 10.0.0.3
....
此记录代表 overlay 网络上的一个 5 节点集群。
[[first-steps]]
== 初始步骤
此图展示了 DNS 发现在容器引擎上通常是如何实现的。
如果在容器引擎之外使用 DNS 发现,相关组件会有所不同。
例如,当与 DNSaaS 解决方案结合使用时,DNS 条目将由所使用的编排解决方案来创建。
image::dns-discovery-diagram.png[DNS 发现可视化]
容器引擎为容器/pod 提供了 DNS 服务器,以改善 DNS 查询的缓存,并提供服务发现和容器主机名等附加功能。
此 DNS 服务器是 DNS 发现扩展与之通信的主要 endpoint。
DNS 服务器响应由编排引擎创建的预定义记录。
该记录包含集群中的容器/pod 列表,HiveMQ 随后将使用这些信息来发现其他节点。
[[usage]]
== 容器环境使用
大多数容器编排环境都支持此类发现方式。
请参阅以下列表以获取一些示例:
* https://kubernetes.io/docs/concepts/services-networking/service/#headless-services[Kubernetes^]
* https://docs.docker.com/docker-cloud/apps/service-links/#discovering-containers-on-the-same-service-or-stack[Docker Swarm^]
* https://mesosphere.github.io/mesos-dns/[Mesos^]
* https://docs.openshift.com/container-platform/3.6/architecture/core_concepts/pods_and_services.html#headless-services[Openshift^]
有关使用上述发现机制的更多信息,请参阅 {dns-discovery-image}[DNS 发现镜像 README^]
要实现您自己的此类发现机制解决方案,您必须为您的 HiveMQ 部署提供以下任一条件:
* 在您的云提供商的 DNS 服务上提供自定义 DNS 记录,其中包含您的 HiveMQ 实例的地址。
* 在部署中包含一个备用 DNS 服务器,它为 HiveMQ 实例提供常规 DNS 服务,并同时提供服务发现记录。
=== Kubernetes
要在 Kubernetes 上使用 DNS 发现,您通常需要一个指向 HiveMQ 部署的 headless service,类似于以下配置:
## [source]
## kind: Service
apiVersion: v1
metadata:
name: hivemq-discovery
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
selector:
app: hivemq-cluster1
ports:
- protocol: TCP
port: 1883
targetPort: 1883
clusterIP: None
NOTE: service 的 selector 和 name 非常重要。
selector 定义了在生成的 DNS 记录中会列出哪些 pod。
NOTE: name 将决定生成的 DNS 记录的 `service-name`,其格式通常为 `..svc.`。
=== Docker Swarm
Docker swarm 默认为服务发现提供 DNS 条目。
您只需创建一个服务即可,如 {docker-swarm}[DNS 发现镜像 README^] 所示。
== 需要帮助?
如果您遇到任何问题,我们很乐意提供帮助。
联系我们最好的地方是我们的 {hivemq-support}[支持]。
== 贡献
如果您想为 HiveMQ DNS Cluster Discovery Extension 做贡献,请参阅 link:CONTRIBUTING.md[贡献指南]。
== 许可证
HiveMQ DNS Cluster Discovery Extension 是在 `APACHE LICENSE, VERSION 2.0` 下授权的。
可以 link:LICENSE[在此处]找到该许可证的副本。
标签:HiveMQ, JS文件枚举, 中间件, 域名枚举, 子域名突变, 容器编排, 物联网, 请求拦截, 集群发现