Traefik с Service Fabric - не удалось подключиться к серверу Service Fabric - PullRequest
0 голосов
/ 17 сентября 2018

Я развернул Traefik в моем кластере Azure Service Fabric со следующей конфигурацией:

# 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 имеет сертификат SSL, подписанный доверенным центром сертификации: Service Fabric management portal

Как я могу решить эту проблему?


Редактировать 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

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Благодаря комментарию Диего (под моим вопросом) мне удалось решить эту проблему со следующими дополнениями.

В чем была проблема?

  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)


InsecureSkipVerify

Конфигурация Traefik SF (см. Выше) включает настройку под названием InsecureSkipVerify

  • InsecureSkipVerify - Если установлено значение false, Traefik будет отклонять соединение с конечной точкой управления, если только используемый сертификат SSL не подписан доверенным центром сертификации.
  • Это может быть проблемой, если сертификат подписан для удаленного адреса, в то время как 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"

Еще раз спасибо, Диего, за то, что дал мне подсказку, которая заставила меня понять и поделиться приведенным выше объяснением.

0 голосов
/ 13 июня 2019

Я знаю, что это старый пост, но мы столкнулись именно с такой ситуацией, и это единственное место, где я видел упомянутые настройки клиента. Это раздел провайдера, который, кажется, наконец-то сработал для нас:

################################################################
# 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


0 голосов
/ 19 сентября 2018

Для аутентификации в API ServiceFabric вы должны использовать сертификат, в вашей конфигурации вы упускаете эту деталь.

В настройках 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/

...