Предоставление нескольких сервисов в Service Fabric Mesh - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь представить две службы (Web API и Chat Bot), которые открывают одни и те же порты внутри через Service Fabric Mesh Сетевой контроллер входа.

Выполнение приведенного ниже определения всегда приводит к сбою одного из двух сервисов.

Что мне неясно:

  1. Это потому, что они оба открывают одни и те же порты (80 и 443) внутренне?
  2. Это вообще плохая идея, и я должен использовать обратный прокси, такой как NGINX?
  3. Могу ли я получить два разных IP-адреса для двух сервисов?

Файл:

{
  "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "apiVersion": "2018-07-01-preview",
      "name": "contosomaintenance",
      "type": "Microsoft.ServiceFabricMesh/applications",
      "location": "westeurope",
      "dependsOn": [
        "Microsoft.ServiceFabricMesh/networks/contosomaintenance-network"
      ],
      "properties": {
        "services": [
          {
            "name": "contosomaintenance-api",
            "properties": {
              "description": "Contoso Maintenance REST API",
              "osType": "Linux",
              "codePackages": [
                {
                  "name": "contosomaintenance-api",
                  "image": "robinmanuelthiel/contosomaintenance-api:latest",
                  "endpoints": [
                    {
                      "name": "http",
                      "port": 80
                    },
                    {
                      "name": "https",
                      "port": 443
                    }
                  ],
                  "resources": {
                    "requests": {
                      "cpu": "0.5",
                      "memoryInGB": "1"
                    }
                  }
                }
              ],
              "replicaCount": "1",
              "networkRefs": [
                {
                  "name": "[resourceId('Microsoft.ServiceFabricMesh/networks', 'contosomaintenance-network')]"
                }
              ]
            }
          },
          {
            "name": "contosomaintenance-bot",
            "properties": {
              "description": "Contoso Maintenance Chat Bot",
              "osType": "Linux",
              "codePackages": [
                {
                  "name": "contosomaintenance-bot",
                  "image": "robinmanuelthiel/contosomaintenance-bot:latest",
                  "endpoints": [
                    {
                      "name": "http",
                      "port": 80
                    },
                    {
                      "name": "https",
                      "port": 443
                    }
                  ],
                  "resources": {
                    "requests": {
                      "cpu": "0.5",
                      "memoryInGB": "1"
                    }
                  }
                }
              ],
              "replicaCount": "1",
              "networkRefs": [
                {
                  "name": "[resourceId('Microsoft.ServiceFabricMesh/networks', 'contosomaintenance-network')]"
                }
              ]
            }
          }
        ]
      }
    },
    {
      "apiVersion": "2018-07-01-preview",
      "name": "contosomaintenance-network",
      "type": "Microsoft.ServiceFabricMesh/networks",
      "location": "westeurope",
      "dependsOn": [],
      "properties": {
        "description": "Contoso Maintenance Network",
        "addressPrefix": "10.0.0.0/22",
        "ingressConfig": {
          "layer4": [
            {
              "name": "contosomaintenance-api-ingress-http",
              "publicPort": "20001",
              "applicationName": "contosomaintenance",
              "serviceName": "contosomaintenance-api",
              "endpointName": "http"
            },
            {
              "name": "contosomaintenance-api-ingress-bot",
              "publicPort": "20002",
              "applicationName": "contosomaintenance",
              "serviceName": "contosomaintenance-bot",
              "endpointName": "http"
            }
          ]
        }
      }
    }
  ]
}

1 Ответ

0 голосов
/ 05 декабря 2018

Обновление 2018-12-10

Выпущен новый ApiVersion (просмотр 2018-09-01), и новый способ предоставления Сервисов - использование ресурса Gateway.Дополнительную информацию можно найти в этом потоке github и этом документах.

Это фрагмент шлюза (только), который предоставляет две службы в одном приложении:

{
  "apiVersion": "2018-09-01-preview",
  "name": "helloWorldGateway",
  "type": "Microsoft.ServiceFabricMesh/gateways",
  "location": "[parameters('location')]",
  "dependsOn": [
    "Microsoft.ServiceFabricMesh/networks/helloWorldNetwork"
  ],
  "properties": {
    "description": "Service Fabric Mesh Gateway for HelloWorld sample.",
    "sourceNetwork": {
      "name": "Open"
    },
    "destinationNetwork": {
      "name": "[resourceId('Microsoft.ServiceFabricMesh/networks', 'helloWorldNetwork')]"
    },
    "http": [
      {
        "name": "web",
        "port": 81,
        "hosts": [
          {
            "name": "*",
            "routes": [
              {
                "name":  "helloRoute",
                "match": {
                  "path": {
                    "value": "/",
                    "rewrite": "/",
                    "type": "Prefix"
                  }
                },
                "destination": {
                  "applicationName": "helloWorldApp",
                  "serviceName": "helloWorldService",
                  "endpointName": "helloWorldListener"
                }
              }
            ]
          }
        ]
      },
      {
        "name": "kuard",
        "port": 82,
        "hosts": [
          {
            "name": "*",
            "routes": [
              {
                "name":  "kuardRoute",
                "match": {
                  "path": {
                    "value": "/",
                    "rewrite": "/",
                    "type": "Prefix"
                  }
                },
                "destination": {
                  "applicationName": "helloWorldApp",
                  "serviceName": "kuardService",
                  "endpointName": "kuardListener"
                }
              }
            ]
          }
        ]
      }
    ],
    "tcp": [
      {
        "name": "web",
        "port": 80,
        "destination": {
          "applicationName": "helloWorldApp",
          "serviceName": "helloWorldService",
          "endpointName": "helloWorldListener"
        }
      },
      {
        "name": "kuard",
        "port": 8080,
        "destination": {
          "applicationName": "helloWorldApp",
          "serviceName": "kuardService",
          "endpointName": "kuardListener"
        }
      }
    ]
  }
}

Примечания:

  • Приложение то же самое helloWorld образец с дополнительным сервисом
  • Шлюз был изменен для предоставления различныхпорты через TCP и HTTP
  • Невозможно предоставлять услуги через сеть (как отмечено в исходном ответе)

Оригинальный ответ

В настоящее время существуют две большие ограничения для сетей:

  • Одна сеть на приложение : Вы не можете иметь одно приложение в двух сетях. source
  • Один вход в сеть на службу : если вы определяете вход с несколькими правилами, ориентированными на несколько сервисов, только один из них будет работать правильно, даже если развертывание выполнено успешнов большинстве случаев без предупреждения. source

Это публичные ограничения на предварительный просмотр, которые могут быть установлены на GA.

В этом случае, если вам необходимо предоставить две службы, вы можете выбрать следующие варианты:

  • Создание двух сетей и двух приложений : каждое приложение с отдельными службами развертывается в своих собственных сетях, каждая служба будет иметь разные IP-адреса.
  • Создатьпрокси-сервис : использование таких решений, как NGINX, для получения всех соединений и внутренней маршрутизации запросов к соответствующим службам.
  • Использование gateway resource : SF Mesh выпуститскоро служба шлюза, основанная на посланнике, когда станет доступной, станет лучшим решением для этого сценария, она будет работать очень похоже на подход NGINX, описанный выше, но под управлением Azure она пока недоступна, но скоро будет выпущена.
...