Предоставление нескольких сервисов в Service Fabric Mesh

Я пытаюсь выставить две службы (Web API и Chat Bot), которые открывают одни и те же порты внутри через Ingress Controller сети 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 ответ

Решение

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

Новый ApiVersion был выпущен (2018-09-01-preview), и новый способ предоставления Сервисов - использование ресурса 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
  • Больше невозможно выставлять сервисы через сеть (как отмечено в оригинальном ответе)

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

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

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

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

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

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