Modos de rede de contêiner do Service Fabric
Um cluster do Azure Service Fabric para serviços de contêiner usa o modo de rede nat por padrão. Quando mais de um serviço de contêiner está escutando na mesma porta e o modo nat está sendo usado, erros de implantação podem ocorrer. Para oferecer suporte a vários serviços de contêiner escutando na mesma porta, o Service Fabric oferece o modo de rede aberta (versões 5.7 e posteriores). No modo aberto, cada serviço de contêiner tem um endereço IP interno atribuído dinamicamente que suporta vários serviços escutando na mesma porta.
Se você tiver um serviço de contêiner com um ponto de extremidade estático em seu manifesto de serviço, poderá criar e excluir novos serviços usando o modo Aberto sem erros de implantação. O mesmo arquivo docker-compose.yml também pode ser usado com mapeamentos de porta estática para criar vários serviços.
Quando um serviço de contêiner é reiniciado ou se move para outro nó no cluster, o endereço IP é alterado. Por esse motivo, não recomendamos o uso do endereço IP atribuído dinamicamente para descobrir serviços de contêiner. Somente o Serviço de Nomenclatura do Service Fabric ou o Serviço DNS deve ser usado para a descoberta do serviço.
Aviso
O Azure permite um total de 65.356 IPs por rede virtual. A soma do número de nós e o número de instâncias de serviço de contêiner (que estão usando o modo Aberto) não pode exceder 65.356 IPs em uma rede virtual. Para cenários de alta densidade, recomendamos o modo de rede nat. Além disso, outras dependências, como o balanceador de carga, terão outras limitações a serem consideradas. Atualmente, até 50 IPs por nó foram testados e provaram ser estáveis.
Configurar o modo de rede aberta
Configure o modelo do Azure Resource Manager. Na seção fabricSettings do recurso Cluster, habilite o Serviço DNS e o Provedor IP:
"fabricSettings": [ { "name": "DnsService", "parameters": [ { "name": "IsEnabled", "value": "true" } ] }, { "name": "Hosting", "parameters": [ { "name": "IPProviderEnabled", "value": "true" } ] }, { "name": "Setup", "parameters": [ { "name": "ContainerNetworkSetup", "value": "true" } ] } ],
Configure a seção de perfil de rede do recurso Conjunto de Escala de Máquina Virtual. Isso permite que vários endereços IP sejam configurados em cada nó do cluster. O exemplo a seguir configura cinco endereços IP por nó para um cluster do Windows/Linux Service Fabric. Você pode ter cinco instâncias de serviço escutando na porta em cada nó. Para que os cinco IPs estejam acessíveis a partir do Balanceador de Carga do Azure, inscreva os cinco IPs no Pool de Endereços de Back-end do Balanceador de Carga do Azure, conforme mostrado abaixo. Você também precisará adicionar as variáveis à parte superior do seu modelo na seção de variáveis.
Adicione esta seção a Variáveis:
"variables": { "nicName": "NIC", "vmName": "vm", "virtualNetworkName": "VNet", "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('virtualNetworkName'))]", "vmNodeType0Name": "[toLower(concat('NT1', variables('vmName')))]", "subnet0Name": "Subnet-0", "subnet0Prefix": "10.0.0.0/24", "subnet0Ref": "[concat(variables('vnetID'),'/subnets/',variables('subnet0Name'))]", "lbID0": "[resourceId('Microsoft.Network/loadBalancers',concat('LB','-', parameters('clusterName'),'-',variables('vmNodeType0Name')))]", "lbIPConfig0": "[concat(variables('lbID0'),'/frontendIPConfigurations/LoadBalancerIPConfig')]", "lbPoolID0": "[concat(variables('lbID0'),'/backendAddressPools/LoadBalancerBEAddressPool')]", "lbProbeID0": "[concat(variables('lbID0'),'/probes/FabricGatewayProbe')]", "lbHttpProbeID0": "[concat(variables('lbID0'),'/probes/FabricHttpGatewayProbe')]", "lbNatPoolID0": "[concat(variables('lbID0'),'/inboundNatPools/LoadBalancerBEAddressNatPool')]" }
Adicione esta seção ao recurso Conjunto de Dimensionamento de Máquina Virtual:
"networkProfile": { "networkInterfaceConfigurations": [ { "name": "[concat(parameters('nicName'), '-0')]", "properties": { "ipConfigurations": [ { "name": "[concat(parameters('nicName'),'-',0)]", "properties": { "primary": "true", "loadBalancerBackendAddressPools": [ { "id": "[variables('lbPoolID0')]" } ], "loadBalancerInboundNatPools": [ { "id": "[variables('lbNatPoolID0')]" } ], "subnet": { "id": "[variables('subnet0Ref')]" } } }, { "name": "[concat(parameters('nicName'),'-', 1)]", "properties": { "primary": "false", "loadBalancerBackendAddressPools": [ { "id": "[variables('lbPoolID0')]" } ], "subnet": { "id": "[variables('subnet0Ref')]" } } }, { "name": "[concat(parameters('nicName'),'-', 2)]", "properties": { "primary": "false", "loadBalancerBackendAddressPools": [ { "id": "[variables('lbPoolID0')]" } ], "subnet": { "id": "[variables('subnet0Ref')]" } } }, { "name": "[concat(parameters('nicName'),'-', 3)]", "properties": { "primary": "false", "loadBalancerBackendAddressPools": [ { "id": "[variables('lbPoolID0')]" } ], "subnet": { "id": "[variables('subnet0Ref')]" } } }, { "name": "[concat(parameters('nicName'),'-', 4)]", "properties": { "primary": "false", "loadBalancerBackendAddressPools": [ { "id": "[variables('lbPoolID0')]" } ], "subnet": { "id": "[variables('subnet0Ref')]" } } }, { "name": "[concat(parameters('nicName'),'-', 5)]", "properties": { "primary": "false", "loadBalancerBackendAddressPools": [ { "id": "[variables('lbPoolID0')]" } ], "subnet": { "id": "[variables('subnet0Ref')]" } } } ], "primary": true } } ] }
Somente para clusters do Windows, configure uma regra NSG (Grupo de Segurança de Rede) do Azure que abra a porta UDP/53 para a rede virtual com os seguintes valores:
Definição Value Prioridade 2000 Nome Custom_Dns Origem VirtualNetwork Destino VirtualNetwork Serviço DNS (UDP/53) Ação Permitir Especifique o modo de rede no manifesto do aplicativo para cada serviço:
<NetworkConfig NetworkType="Open">
. O modo de rede aberta faz com que o serviço obtenha um endereço IP dedicado. Se um modo não for especificado, o serviço assume como padrão o modo nat . No exemplo de manifesto a seguir, osNodeContainerServicePackage1
eNodeContainerServicePackage2
serviços podem escutar cada um na mesma porta (ambos os serviços estão escutando emEndpoint1
). Quando o modo de rede aberta é especificado,PortBinding
as configurações não podem ser especificadas.<?xml version="1.0" encoding="UTF-8"?> <ApplicationManifest ApplicationTypeName="NodeJsApp" ApplicationTypeVersion="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"> <Description>Calculator Application</Description> <Parameters> <Parameter Name="ServiceInstanceCount" DefaultValue="3"></Parameter> <Parameter Name="MyCpuShares" DefaultValue="3"></Parameter> </Parameters> <ServiceManifestImport> <ServiceManifestRef ServiceManifestName="NodeContainerServicePackage1" ServiceManifestVersion="1.0"/> <Policies> <ContainerHostPolicies CodePackageRef="NodeContainerService1.Code" Isolation="hyperv"> <NetworkConfig NetworkType="Open"/> </ContainerHostPolicies> </Policies> </ServiceManifestImport> <ServiceManifestImport> <ServiceManifestRef ServiceManifestName="NodeContainerServicePackage2" ServiceManifestVersion="1.0"/> <Policies> <ContainerHostPolicies CodePackageRef="NodeContainerService2.Code" Isolation="default"> <NetworkConfig NetworkType="Open"/> </ContainerHostPolicies> </Policies> </ServiceManifestImport> </ApplicationManifest>
Você pode misturar e combinar diferentes modos de rede entre serviços dentro de um aplicativo para um cluster do Windows. Alguns serviços podem usar o modo aberto, enquanto outros usam o modo nat. Quando um serviço é configurado para usar o modo nat, a porta na qual o serviço está escutando deve ser exclusiva.
Nota
Em clusters Linux, não há suporte para a mistura de modos de rede para diferentes serviços.
Quando o modo Aberto é selecionado, a definição de Ponto de Extremidade no manifesto de serviço deve apontar explicitamente para o pacote de código correspondente ao ponto de extremidade, mesmo que o pacote de serviço tenha apenas um pacote de código.
<Resources> <Endpoints> <Endpoint Name="ServiceEndpoint" Protocol="http" Port="80" CodePackageRef="Code"/> </Endpoints> </Resources>
Para o Windows, uma reinicialização da VM fará com que a rede aberta seja recriada. Isso é para mitigar um problema subjacente na pilha de rede. O comportamento padrão é recriar a rede. Se esse comportamento precisar ser desativado, a configuração a seguir pode ser usada seguida por uma atualização de configuração.
"fabricSettings": [
{
"name": "Setup",
"parameters": [
{
"name": "SkipContainerNetworkResetOnReboot",
"value": "true"
}
]
}
],
Próximos passos
- Understand the Service Fabric application model (Compreender o modelo de aplicações do Service Fabric)
- Saiba mais sobre os recursos de manifesto de serviço do Service Fabric
- Implantar um contêiner do Windows no Service Fabric no Windows Server 2016
- Implantar um contêiner do Docker no Service Fabric no Linux