azure - 使用 Service Fabric 的 Traefik - 无法连接到 Service Fabric 服务器
问题描述
我已经在我的 Azure Service Fabric 集群上部署了 Traefik,配置如下:
# Enable Service Fabric configuration backend
[servicefabric]
# Service Fabric Management Endpoint
clustermanagementurl = "https://localhost:19080"
# Service Fabric Management Endpoint API Version
apiversion = "3.0"
insecureSkipVerify = true
但是,当打开 Traefik 仪表板时,我得到一个空白屏幕,因为它无法映射我所有的 Fabric 应用程序。
查看我的一个虚拟机上的 Traefik 日志,我反复看到此错误:
level=error msg="failed to connect to Service Fabric server Get https://localhost:19080/Applications/?api-version=3.0: x509: certificate is valid for <hidden>.eastus.cloudapp.azure.com, not localhost on https://localhost:19080/Applications/?api-version=3.0"
我的 Azure Service Fabric 群集具有由受信任的 CA 签名的 SSL 证书:
我该如何解决这个问题?
编辑1:
如果有帮助,这是 Traefik 加载的配置(根据日志):
{
"LifeCycle": {
"RequestAcceptGraceTimeout": 0,
"GraceTimeOut": 0
},
"GraceTimeOut": 0,
"Debug": true,
"CheckNewVersion": true,
"AccessLogsFile": "",
"AccessLog": null,
"TraefikLogsFile": "",
"TraefikLog": null,
"LogLevel": "DEBUG",
"EntryPoints": {
"http": {
"Network": "",
"Address": ":80",
"TLS": null,
"Redirect": null,
"Auth": null,
"WhitelistSourceRange": null,
"Compress": false,
"ProxyProtocol": null,
"ForwardedHeaders": {
"Insecure": true,
"TrustedIPs": null
}
}
},
"Cluster": null,
"Constraints": [],
"ACME": null,
"DefaultEntryPoints": [
"http"
],
"ProvidersThrottleDuration": 2000000000,
"MaxIdleConnsPerHost": 200,
"IdleTimeout": 0,
"InsecureSkipVerify": true,
"RootCAs": null,
"Retry": null,
"HealthCheck": {
"Interval": 30000000000
},
"RespondingTimeouts": null,
"ForwardingTimeouts": null,
"Docker": null,
"File": null,
"Web": {
"Address": ":9000",
"CertFile": "",
"KeyFile": "",
"ReadOnly": false,
"Statistics": null,
"Metrics": null,
"Path": "/",
"Auth": null,
"Debug": false,
"CurrentConfigurations": null,
"Stats": null,
"StatsRecorder": null
},
"Marathon": null,
"Consul": null,
"ConsulCatalog": null,
"Etcd": null,
"Zookeeper": null,
"Boltdb": null,
"Kubernetes": null,
"Mesos": null,
"Eureka": null,
"ECS": null,
"Rancher": null,
"DynamoDB": null,
"ServiceFabric": {
"Watch": false,
"Filename": "",
"Constraints": null,
"Trace": false,
"DebugLogGeneratedTemplate": false,
"ClusterManagementURL": "https://localhost:19080",
"APIVersion": "3.0",
"UseCertificateAuth": false,
"ClientCertFilePath": "",
"ClientCertKeyFilePath": "",
"InsecureSkipVerify": true
}
}
编辑2:
有人建议使用我的集群的远程地址而不是localhost
,这样做会导致另一个错误:
Provider connection error: failed to connect to Service Fabric server Get https://<hidden>.eastus.cloudapp.azure.com:19080/Applications/?api-version=3.0: stream error: stream ID 1; HTTP_1_1_REQUIRED on https://<hidden>.eastus.cloudapp.azure.com:19080/Applications/?api-version=3.0; retrying in 656.765021ms
解决方案
感谢 Diego 的评论(根据我的问题),我通过以下添加成功解决了这个问题。
出了什么问题?
- 我的 SF 集群是安全的,需要客户端证书才能登录——这在 Traefik TOML 文件中没有指定。(希望记录的错误信息更多)
查看 Traefik 日志,特别是 SF 部分(查找以 开头的跟踪
Starting provider *servicefabric.Provider
:"Watch": false, "Filename": "", "Constraints": null, "Trace": false, "DebugLogGeneratedTemplate": false, "ClusterManagementURL": "https://localhost:19080", "APIVersion": "3.0", "UseCertificateAuth": false, <-------- Important "ClientCertFilePath": "", <-------- Important "ClientCertKeyFilePath": "", <-------- Important "InsecureSkipVerify": false
UseCertificateAuth
-- 表示 Traefik 查询集群管理端点时是否使用客户端证书。ClientCertFilePath
-- 包含客户端证书公钥的文件的路径。ClientCertKeyFilePath
-- 包含客户端证书私钥的文件的路径。
(两条路径都应该相对于traefik.exe
)
不安全的跳过验证
Traefik 的 SF 配置(上图)包括一个名为InsecureSkipVerify
InsecureSkipVerify
-- 如果设置为false
,则 Traefik 将拒绝与管理端点的连接,除非使用的 SSL 证书由受信任的 CA 签名。- 如果证书是为远程地址签名的,而 Traefik
https://localhost
用作集群的端点,这可能是一个问题——因为 Traefik 会打印出类似于以下内容的错误:
无法连接到 Service Fabric 服务器获取https://localhost:19080/Applications/?api-version=3.0:x509:证书对 .eastus.cloudapp.azure.com 有效,而不是 localhost
要克服这一点,您可以
- 设置
InsecureSkipVerify = true
和重新部署 - 将管理端点设置为远程地址:
clustermanagementurl = "https://<hidden>.eastus.cloudapp.azure.com:19080"
再次感谢 Diego 给我的提示,让我理解并分享了上述解释。
推荐阅读
- python - 断言 True 中的奇数失败是 True
- kubernetes - 无法在 Kubernetes 中进行端口转发
- android - 我们可以将 SliverList 包装在像 Card 这样的 RenderBox 类型的小部件中吗?
- python - Python程序冻结没有错误
- python - MySQL 和 Python 编程错误:1064 (42000)
- unit-testing - 如何测试 Ninject Factory 在 RequestScope 中返回相同的实例
- testing - 执行测试时出错:ERROR 由于出现错误无法准备测试
- ios - Xcode 11 Beta 5 未显示 Swift 5.1
- javascript - 如何使用cheerio和express从instagram获取信息
- acumatica - 字段默认处理程序