【问题标题】:Traefik with Service Fabric -- failed to connect to Service Fabric server使用 Service Fabric 的 Traefik - 无法连接到 Service Fabric 服务器
【发布时间】:2019-02-21 19:16:11
【问题描述】:

我已经在我的 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

【问题讨论】:

  • 如果您的集群配置为使用证书连接,您必须设置UseCertificateAuth: true 并指定证书所在的位置
  • 哪个文档页面指定了这一点?我应该使用什么属性来指定证书?我可以指定证书内联吗?还是必须是文件路径?
  • @johni 您如何查看日志?

标签: azure cloud reverse-proxy azure-service-fabric traefik


【解决方案1】:

我知道这是一篇旧帖子,但我们刚刚遇到了这种确切的情况,这是我看到提到的客户端设置的唯一地方。这是最终似乎对我们有用的提供程序部分:

################################################################
# Service Fabric provider
################################################################

# Enable Service Fabric configuration backend
[servicefabric]

# Service Fabric Management Endpoint
clustermanagementurl = "https://localhost:19080"
# Note: use "https://localhost:19080" if you're using a secure cluster

# Service Fabric Management Endpoint API Version
apiversion = "3.0"

# Enable TLS connection.
#
# Optional
#
[serviceFabric.tls]
  cert               = "certs/servicefabric.crt"
  key                = "certs/servicefabric.key"
  insecureskipverify = true

UseCertificateAuth    =  true
ClientCertFilePath    = "certs/traefik.crt"
ClientCertKeyFilePath = "certs/traefik.key"
InsecureSkipVerify    =  true


【讨论】:

  • UseCertificateAuth = true 为我解决了问题。但是你有不同的crt和key文件有什么原因吗?
  • servicefabric.crt 是我们的 Digicert/CA 服务器证书,traefik.crt 是客户端身份验证证书。我们在服务结构中的节点和客户端身份验证之间运行 gMSA 安全性以实现访问安全性。
  • @ScottMcCollough 只是为了确认 - 是 servicefabric.crt & key 引用了ServerCertificateCommonNames 下 ClusterConfig 中的密钥,并且是 traefik.crt & key 引用了 ClientCertificateCommonNames 下 ClusterConfig 中的一个密钥(使用管理员设置为假?)
【解决方案2】:

感谢 Diego 的评论(根据我的问题),我通过以下补充成功解决了这个问题。

出了什么问题?

  1. 我的 SF 集群是安全的,需要客户端证书才能登录 -- Traefik TOML 文件中没有指定。 (希望记录的错误信息更丰富)
  2. 查看 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://&lt;hidden&gt;.eastus.cloudapp.azure.com:19080"

再次感谢 Diego 给我的提示,让我理解并分享上述解释。

【讨论】:

  • johni - 你能澄清你用来最终让它工作的设置吗?我不清楚您是否正在设置 serviceFabric.tls 设置(证书、密钥、insecureskipverify)以及其他一些设置“UseCertificateAuth”、“ClientCertFilePath”、“ClientCertKeyFilePath”。我与 traefik 搏斗的时间最长,在我的一生中,我无法连接。
【解决方案3】:

要对 ServiceFabric API 进行身份验证,您必须使用证书,在您的配置中您会错过此详细信息。

在 Traefik 设置中,您应该有这样的内容:

# [serviceFabric.tls]
cert = "certs/servicefabric.crt"
key = "certs/servicefabric.key"
insecureskipverify = true

下面的帖子一步一步地描述它

https://blog.techfabric.io/using-traefik-reverse-proxy-for-securing-microservices-on-azure-service-fabric/

【讨论】:

  • 这不起作用 Diego(至少在最新的 Traefik 版本上不起作用),原因是:failed to connect to Service Fabric server Get https://localhost:19080/Applications/?api-version=3.0: x509: certificate is valid for &lt;hidden&gt;.eastus.cloudapp.azure.com, not localhost。但是,由于您的原始评论,我设法让它工作,并添加了设置 ClientCertKeyFilePathClientCertFilePath 设置。
  • 如错误提示,失败是因为ClusterManagementURL : https://localhost:19080应该是你集群的url,本地集群默认没有安全性
猜你喜欢
  • 1970-01-01
  • 2020-01-12
  • 2018-07-03
  • 2017-03-19
  • 2020-01-23
  • 2018-07-19
  • 2018-09-09
  • 2016-09-28
  • 1970-01-01
相关资源
最近更新 更多