首页 > 解决方案 > 使用 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 证书: Service Fabric 管理门户

我该如何解决这个问题?


编辑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

标签: azurecloudreverse-proxyazure-service-fabrictraefik

解决方案


感谢 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 签名。
  • 如果证书是为远程地址签名的,而 Traefikhttps://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 给我的提示,让我理解并分享了上述解释。


推荐阅读