gpt4 book ai didi

docker - DNS解析时如何利用服务端口

转载 作者:行者123 更新时间:2023-12-02 18:06:12 26 4
gpt4 key购买 nike

我有 consulregistrator 正在运行。我可以在 docker 容器中启动服务:

docker run -d -P --name=redis redis

正如预期的那样, registrator 能够在 consul 中注册服务:
http http://localhost:8500/v1/catalog/service/redis

HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Length: 308
Content-Type: application/json
Date: Fri, 04 May 2018 11:33:50 GMT
Vary: Accept-Encoding
X-Consul-Effective-Consistency: leader
X-Consul-Index: 34
X-Consul-Knownleader: true
X-Consul-Lastcontact: 0

[
{
"Address": "127.0.0.1",
"CreateIndex": 34,
"Datacenter": "dc1",
"ID": "48b6c821-3b93-dbf4-394e-5024123ea7df",
"ModifyIndex": 34,
"Node": "863e97e527c3",
"NodeMeta": {
"consul-network-segment": ""
},
"ServiceAddress": "",
"ServiceEnableTagOverride": false,
"ServiceID": "polyphemus.wavilon.net:redis:6379",
"ServiceMeta": {},
"ServiceName": "redis",
"ServicePort": 32769,
"ServiceTags": [],
"TaggedAddresses": {
"lan": "127.0.0.1",
"wan": "127.0.0.1"
}
}
]

然后我可以使用 consul DNS 服务:
» dig @127.0.0.1 -p 8600 redis.service.consul

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @127.0.0.1 -p 8600 redis.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62382
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;redis.service.consul. IN A

;; ANSWER SECTION:
redis.service.consul. 0 IN A 127.0.0.1

;; Query time: 0 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Fri May 04 13:31:21 CEST 2018
;; MSG SIZE rcvd: 65

这一切都很好。这基本上意味着我可以开始使用 consul 来定位我的服务,这样的事情是这样的:
curl -X GET http://myservice.service.consul

可以在我的容器内工作。但是……这里缺少一件: registrator 知道 IP 是运行服务的端口。我可以通过一个特殊的 dns SRV 请求来检查:
» dig @127.0.0.1 -p 8600 redis.service.consul SRV

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @127.0.0.1 -p 8600 redis.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52758
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;redis.service.consul. IN SRV

;; ANSWER SECTION:
redis.service.consul. 0 IN SRV 1 1 32769 863e97e527c3.node.dc1.consul.

;; ADDITIONAL SECTION:
863e97e527c3.node.dc1.consul. 0 IN A 127.0.0.1
863e97e527c3.node.dc1.consul. 0 IN TXT "consul-network-segment="

;; Query time: 0 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Fri May 04 13:36:02 CEST 2018
;; MSG SIZE rcvd: 149

我的问题是:如何将其集成到我的应用程序中?假设我正在使用 python 编写一个 requests 应用程序。 DNS 解析将如何定位和使用服务公开的端口?

需要明确的是:信息已正确注册在 consul 中,我如何使用应用程序中的这些信息?

我看到不同的选项:
  • 在我的应用程序(作为库)中实现了一个“consul DNS 解析”层,它向 consul 发出 SRV DNS(或 API)请求以定位 IP 和端口。
  • 强制容器总是暴露端口 80(我做的是 http REST 服务),这样 DNS 解析就不需要关心端口了。

  • 第一个选项意味着对应用程序进行一些重构,我想避免这种情况。第二个选项意味着我需要摆弄所有服务配置。

    有更好的选择吗?在进行名称解析时,是否有一种透明的方式来集成 SRV DNS 请求,并自动使用端口而不是使用端口 80 (或 443 )?

    我看不出这对于 python requestscurl 或任何其他工具是如何可行的:我们总是需要在使用这些库/工具时手动指定端口。

    还有一个相关的问题:何时/如何使用 SRV DNS 请求?似乎那些提供了我需要的信息,但正常的 DNS 解析并没有使用它:客户端总是对服务运行的端口做出假设( 80 表示 http443 表示 https 等等)而不是询问DNS 服务器,其中包含信息。

    最佳答案

    我们处理这个问题的几种方法:

  • 使用 docker 覆盖网络进行容器到容器通信。在这种情况下,您的端口可以是静态的(在容器级别),并且您可以在建立连接时假定端口号
  • 使用“consul-template”生成一个配置文件,其中包含从 consul 读取的 IP 和端口信息。这个 consul-template 命令通常会作为您的 docker 入口点运行,并反过来启动您的实际应用程序。每当 consul 发生变化时,consul-template 都会重新生成文件,并且可以配置为重新加载/重启您的应用

  • 谢谢,
    阿鲁

    关于docker - DNS解析时如何利用服务端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50174204/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com