Práticas recomendadas de FinOps para computação

Este artigo descreve uma coleção de práticas comprovadas de FinOps para serviços de computação. Ele fornece diretrizes sobre como otimizar custos, melhorar a eficiência e obter insights sobre seus recursos de computação no Azure. As práticas são categorizadas com base no tipo de serviço de computação, como VMs (máquinas virtuais), AKS (Serviço de Kubernetes do Azure) e Azure Functions.


Serviço de Kubernetes do Azure

AKS (Serviço de Kubernetes do Azure) simplifica a implantação e o gerenciamento de aplicativos em contêineres. Ele oferece Kubernetes sem servidor, uma experiência de CI/CD integrada e segurança e governança de nível empresarial.

Recursos relacionados:

Consulta: detalhes do cluster AKS

Essa consulta ARG recupera informações detalhadas sobre clusters do AKS em seu ambiente do Azure.

Categoria

Gerenciamento de recursos

Consulta

resources
| where type == "microsoft.containerservice/managedclusters"
| extend AgentPoolProfiles = properties.agentPoolProfiles
| mvexpand AgentPoolProfiles
| project
    id,
    ProfileName = tostring(AgentPoolProfiles.name),
    Sku = tostring(sku.name),
    Tier = tostring(sku.tier),
    mode = AgentPoolProfiles.mode,
    AutoScaleEnabled = AgentPoolProfiles.enableAutoScaling,
    SpotVM = AgentPoolProfiles.scaleSetPriority,
    VMSize = tostring(AgentPoolProfiles.vmSize),
    nodeCount = tostring(AgentPoolProfiles.['count']),
    minCount = tostring(AgentPoolProfiles.minCount),
    maxCount = tostring(AgentPoolProfiles.maxCount),
    location,
    resourceGroup,
    subscriptionId,
    AKSname = name

Use VMs Spot para clusters do AKS

Recomendação: use VMs Spot nos pools de agentes do AKS para reduzir os custos de computação de cargas de trabalho tolerantes a falhas e interruptíveis.

Sobre VMs spot no AKS

Spot VMs aproveitam a capacidade de Azure não utilizada a um custo significativamente reduzido. Quando o Azure precisa da capacidade de volta, a infraestrutura do Azure expulsa as VMs Spot. As VMs spot são úteis para cargas de trabalho que podem lidar com interrupções, como trabalhos de processamento em lote, ambientes de desenvolvimento/teste e cargas de trabalho de computação grandes.

Os clusters do AKS que usam o dimensionamento automático, mas não aproveitam as VMs spot, podem estar pagando mais do que o necessário. Ao habilitar VMs spot para cargas de trabalho interruptíveis, você pode reduzir significativamente os custos de computação. Essa recomendação só se aplica a clusters que executam cargas de trabalho que podem tolerar interrupções. Nem todas as cargas de trabalho são apropriadas para VMs Spot.

Note

Os hubs de FinOps podem identificar automaticamente clusters do AKS sem VMs Spot como uma recomendação opcional. Saiba mais.

Consulta: clusters do AKS sem VMs Spot

Use a consulta ARG a seguir para identificar clusters do AKS com dimensionamento automático habilitado que não estão usando VMs spot.

Categoria

Optimization

Consulta

resources
| where type == 'microsoft.containerservice/managedclusters'
| mvexpand AgentPoolProfiles = properties.agentPoolProfiles
| where AgentPoolProfiles.enableAutoScaling == true
    and isnull(AgentPoolProfiles.scaleSetPriority)
| project
    ResourceId = id,
    AKSName = name,
    ProfileName = tostring(AgentPoolProfiles.name),
    VMSize = tostring(AgentPoolProfiles.vmSize),
    NodeCount = tostring(AgentPoolProfiles.['count']),
    MinCount = tostring(AgentPoolProfiles.minCount),
    MaxCount = tostring(AgentPoolProfiles.maxCount),
    Region = location,
    ResourceGroupName = resourceGroup,
    SubscriptionId = subscriptionId

Máquinas virtuais

As VMs (máquinas virtuais) do Azure são um dos vários tipos de recursos de computação sob demanda e escalonáveis que o Azure oferece. Normalmente, você escolhe uma VM quando precisa de mais controle sobre o ambiente de computação do que as outras opções oferecem.

Uma VM do Azure oferece a flexibilidade da virtualização sem a necessidade de comprar e manter o hardware físico que a executa. No entanto, você ainda precisa manter a VM executando tarefas, como configurar, aplicar patch e instalar o software que é executado nela.

Recursos relacionados:

Desalocar máquinas virtuais

Recomendação: desaloque VMs para evitar encargos de computação não utilizados. Evite parar VMs sem desalocá-las.

Sobre VMs inativas

As VMs têm dois estados inativos: parado e desalocado.

As VMs paradas foram desligadas de dentro do sistema operacional (por exemplo, usando o comando Desligar ). As VMs paradas são desligadas, mas o Azure ainda reserva recursos de computação, como CPU e memória. Como os recursos de computação são reservados e não estão disponíveis para uso com outras VMs, essas VMs continuam a incorrer em encargos de computação.

As VMs desalocadas são interrompidas por meio de APIs de gerenciamento de nuvem no portal do Azure, CLI, PowerShell ou outra ferramenta de cliente. Quando uma VM é desalocada, o Azure libera os recursos de computação correspondentes. Como os recursos de computação são liberados, essas VMs não incorrem em encargos de computação; no entanto, é importante observar que as VMs paradas e desalocadas continuam a incorrer em encargos não relacionados à computação, como encargos de armazenamento de discos.

Note

Os hubs FinOps podem identificar automaticamente VMs paradas que não estão desalocadas. Saiba mais.

Identificar VMs paradas

Use a seguinte consulta do ARG (Azure Resource Graph) para identificar VMs paradas que não estão desalocadas. Elas recuperam detalhes sobre seu estado de energia, localização, grupo de recursos e ID de assinatura.

resources
| where type =~ 'microsoft.compute/virtualmachines'
| extend PowerState = tostring(properties.extended.instanceView.powerState.displayStatus)
| where PowerState !in =('VM deallocated', 'VM running')
| project
    ResourceId = id,
    PowerState,
    Region = location,
    ResourceGroupName = resourceGroup,
    SubscriptionId = subscriptionId

Usar descontos de compromisso

Recomendação: use descontos de compromisso para economizar até 72% em comparação com os custos de lista.

Sobre descontos de compromisso

Os descontos de compromisso são incentivos financeiros oferecidos a organizações que se comprometem a usar os serviços do Azure por um período ou período especificado, normalmente um ou três anos. Ao concordar com uma quantidade fixa de uso ou gasto (custo) para o período, as organizações podem se beneficiar de descontos significativos (até 72%) em comparação com os preços de tabela. Os descontos são aplicados a recursos qualificados, ajudando as organizações a economizar em seus custos de nuvem, proporcionando flexibilidade e previsibilidade em seu orçamento.

Para saber mais sobre descontos de compromisso, consulte a funcionalidade de otimização de taxa.

Medir a cobertura do desconto de compromisso de máquina virtual

Use a consulta do hub FinOps a seguir para medir a cobertura geral do desconto de compromisso de VM.

Costs
| where ResourceType =~ 'Virtual machine'
| where x_SkuMeterCategory startswith 'Virtual Machines'
//
// Join with prices to filter out ineligible SKUs
| extend tmp_MeterKey = strcat(substring(ChargePeriodStart, 0, 7), x_SkuMeterId)
| project tmp_MeterKey, EffectiveCost, PricingCategory, CommitmentDiscountCategory, ResourceName, x_ResourceGroupName, SubAccountName, BillingCurrency
| join kind=leftouter (
    Prices
    | where x_SkuMeterCategory startswith 'Virtual Machines'
    | summarize sp = countif(x_SkuPriceType == 'SavingsPlan'), ri = countif(x_SkuPriceType == 'ReservedInstance')
        by tmp_MeterKey = strcat(substring(x_EffectivePeriodStart, 0, 7), x_SkuMeterId)
    | project tmp_MeterKey, x_CommitmentDiscountSpendEligibility = iff(sp == 0, 'Not Eligible', 'Eligible'), x_CommitmentDiscountUsageEligibility = iff(ri == 0, 'Not Eligible', 'Eligible')
) on tmp_MeterKey
| extend x_CommitmentDiscountUsageEligibility = iff(isempty(x_CommitmentDiscountUsageEligibility), '(missing prices)', x_CommitmentDiscountUsageEligibility)
| extend x_CommitmentDiscountSpendEligibility = iff(isempty(x_CommitmentDiscountSpendEligibility), '(missing prices)', x_CommitmentDiscountSpendEligibility)
//
// Sum costs
| summarize
    TotalCost = sum(EffectiveCost),
    OnDemandCost = sumif(EffectiveCost, PricingCategory == 'Standard'),
    SpotCost = sumif(EffectiveCost, PricingCategory == 'Dynamic'),
    CommittedCost = sumif(EffectiveCost, PricingCategory == 'Committed'),
    CommittedSpendCost = sumif(EffectiveCost, CommitmentDiscountCategory == 'Spend'),
    CommittedUsageCost = sumif(EffectiveCost, CommitmentDiscountCategory == 'Usage')
    by x_CommitmentDiscountUsageEligibility, x_CommitmentDiscountSpendEligibility, BillingCurrency
| extend OnDemandPercent = round(OnDemandCost / TotalCost * 100, 2)
| extend CoveragePercent = round(CommittedCost / TotalCost * 100, 2)
| extend CoverageUsagePercent = round(CommittedUsageCost / TotalCost * 100, 2)
| extend CoverageSpendPercent = round(CommittedSpendCost / TotalCost * 100, 2)
| order by CoveragePercent desc

Use a consulta a seguir para medir a divisão de custos por VM, incluindo a cobertura de descontos de compromisso.

Costs
| where ResourceType =~ 'Virtual machine'
| where x_SkuMeterCategory startswith 'Virtual Machines'
//
// Join with prices to filter out ineligible SKUs
| extend tmp_MeterKey = strcat(substring(ChargePeriodStart, 0, 7), x_SkuMeterId)
| project tmp_MeterKey, EffectiveCost, PricingCategory, CommitmentDiscountCategory, ResourceName, x_ResourceGroupName, SubAccountName, BillingCurrency
| join kind=leftouter (
    Prices
    | where x_SkuMeterCategory startswith 'Virtual Machines'
    | summarize sp = countif(x_SkuPriceType == 'SavingsPlan'), ri = countif(x_SkuPriceType == 'ReservedInstance')
        by tmp_MeterKey = strcat(substring(x_EffectivePeriodStart, 0, 7), x_SkuMeterId)
    | project tmp_MeterKey, x_CommitmentDiscountSpendEligibility = iff(sp == 0, 'Not Eligible', 'Eligible'), x_CommitmentDiscountUsageEligibility = iff(ri == 0, 'Not Eligible', 'Eligible')
) on tmp_MeterKey
| extend x_CommitmentDiscountUsageEligibility = iff(isempty(x_CommitmentDiscountUsageEligibility), '(missing prices)', x_CommitmentDiscountUsageEligibility)
| extend x_CommitmentDiscountSpendEligibility = iff(isempty(x_CommitmentDiscountSpendEligibility), '(missing prices)', x_CommitmentDiscountSpendEligibility)
//
// Sum costs by resource
| summarize
    TotalCost = sum(EffectiveCost),
    OnDemandCost = sumif(EffectiveCost, PricingCategory == 'Standard'),
    SpotCost = sumif(EffectiveCost, PricingCategory == 'Dynamic'),
    CommittedCost = sumif(EffectiveCost, PricingCategory == 'Committed'),
    CommittedSpendCost = sumif(EffectiveCost, CommitmentDiscountCategory == 'Spend'),
    CommittedUsageCost = sumif(EffectiveCost, CommitmentDiscountCategory == 'Usage')
    by ResourceName, x_ResourceGroupName, SubAccountName, x_CommitmentDiscountUsageEligibility, x_CommitmentDiscountSpendEligibility, BillingCurrency
| extend OnDemandPercent = round(OnDemandCost / TotalCost * 100, 2)
| extend CoveragePercent = round(CommittedCost / TotalCost * 100, 2)
| extend CoverageUsagePercent = round(CommittedUsageCost / TotalCost * 100, 2)
| extend CoverageSpendPercent = round(CommittedSpendCost / TotalCost * 100, 2)
| order by CoveragePercent desc

Para saber mais sobre hubs FinOps, consulte os hubs FinOps.

Consulta: Detalhes do conjunto de dimensionamento de máquinas virtuais

Essa consulta analisa os Conjuntos de Dimensionamento de Máquinas Virtuais em seu ambiente do Azure com base em sua SKU, prioridade de VM spot e política de combinação de prioridade. Ele fornece insights para otimização de custos e estratégias de gerenciamento de recursos.

Categoria

Gerenciamento de recursos

Consulta

resources
| where type =~ 'microsoft.compute/virtualmachinescalesets'
| extend SpotVMs = tostring(properties.virtualMachineProfile.priority)
| extend SpotPriorityMix = tostring(properties.priorityMixPolicy)
| extend SKU = tostring(sku.name)
| extend resourceGroup = strcat('/subscriptions/', subscriptionId, '/resourceGroups/', resourceGroup)
| project id, SKU, SpotVMs, SpotPriorityMix, subscriptionId, resourceGroup, location

Migrar para discos gerenciados

Recomendação: migre VMs usando discos não gerenciados para discos gerenciados para melhorar a confiabilidade, simplificar o gerenciamento e preparar-se para a desativação de discos não gerenciados.

Sobre discos não gerenciados

Discos não gerenciados armazenam arquivos VHD como blobs de páginas em contas de Armazenamento do Azure, o que exige que você mesmo gerencie a capacidade, o desempenho e a segurança da conta de armazenamento. Os discos gerenciados simplificam o gerenciamento de discos ao cuidar do gerenciamento da conta de armazenamento para você, oferecendo maior confiabilidade com os conjuntos de disponibilidade, controle de acesso mais granular e suporte a recursos mais recentes, como criptografia de disco e rajadas. Microsoft anunciou a desativação de discos não gerenciados, portanto, a migração para discos gerenciados é uma otimização de custo e uma etapa de conformidade.

Note

Os hubs FinOps podem identificar automaticamente VMs usando discos não gerenciados. Saiba mais.

Identificar VMs com discos não gerenciados

Use a consulta ARG a seguir para identificar VMs que ainda estão usando discos não gerenciados.

resources
| where type =~ 'microsoft.compute/virtualmachines'
| where isnull(properties.storageProfile.osDisk.managedDisk)
| project
    ResourceId = tolower(id),
    ResourceName = name,
    OsDiskVhd = tostring(properties.storageProfile.osDisk.vhd.uri),
    Region = location,
    ResourceGroupName = resourceGroup,
    SubscriptionId = subscriptionId

Consulta: Análise de tipo de processador de máquina virtual

Essa consulta identifica o tipo de processador (ARM, AMD ou Intel) usado pelas VMs em seu ambiente do Azure. Ele ajuda a entender a distribuição de VMs em diferentes arquiteturas de processador, o que é útil para otimizar o desempenho da carga de trabalho e a eficiência de custos.

Categoria

Gerenciamento de recursos

Consulta

resources
| where type == 'microsoft.compute/virtualmachines'
| extend vmSize = properties.hardwareProfile.vmSize
| extend processorType = case(
    // ARM Processors
    vmSize has "Epsv5"
        or vmSize has "Epdsv5"
        or vmSize has "Dpsv5"
        or vmSize has "Dpdsv", "ARM",
    // AMD Processors
    vmSize has "Standard_D2a"
        or vmSize has "Standard_D4a"
        or vmSize has "Standard_D8a"
        or vmSize has "Standard_D16a"
        or vmSize has "Standard_D32a"
        or vmSize has "Standard_D48a"
        or vmSize has "Standard_D64a"
        or vmSize has "Standard_D96a"
        or vmSize has "Standard_D2as"
        or vmSize has "Standard_D4as"
        or vmSize has "Standard_D8as"
        or vmSize has "Standard_D16as"
        or vmSize has "Standard_D32as"
        or vmSize has "Standard_D48as"
        or vmSize has "Standard_D64as"
        or vmSize has "Standard_D96as", "AMD",
    "Intel"
)
| project vmName = name, processorType, vmSize, resourceGroup

Usar o Benefício Híbrido do Azure para VMs do Windows

Recomendação: habilite o Benefício Híbrido do Azure para VMs do Windows para reduzir os custos de licenciamento usando licenças locais existentes do Windows Server.

Sobre Benefício Híbrido do Azure para Windows

Benefício Híbrido do Azure permite que você use suas licenças de Windows Server locais com Software Assurance ou assinatura Windows Server para executar Windows VMs em Azure a um custo reduzido. Em vez de pagar uma licença de Windows Server completa com cada VM, você pode trazer suas licenças existentes e pagar apenas pelo custo de computação base. Essa recomendação só se aplica se sua organização tiver licenças de Windows Server locais qualificadas.

Note

Os hubs de FinOps podem identificar automaticamente VMs do Windows que não usam o Benefício Híbrido do Azure como uma recomendação opcional. Saiba mais.

Consulta: VMs do Windows sem Benefício Híbrido do Azure

Use a consulta ARG a seguir para identificar máquinas virtuais do Windows e conjuntos de dimensionamento que não estão utilizando o Benefício Híbrido do Azure. A consulta exclui assinaturas de desenvolvimento/teste, que já têm licenciamento com desconto.

Categoria

Optimization

Consulta

resourcecontainers
| where type =~ 'Microsoft.Resources/subscriptions'
| where tostring(properties.subscriptionPolicies.quotaId) !has 'MSDNDevTest_2014-09-01'
| project SubscriptionName = name, subscriptionId
| join (
    resources
    | where type =~ 'microsoft.compute/virtualmachines'
        or type =~ 'microsoft.compute/virtualMachineScaleSets'
    | where tostring(properties.storageProfile.osDisk.osType) == 'Windows'
        or tostring(properties.virtualMachineProfile.storageProfile.osDisk.osType) == 'Windows'
    | where tostring(properties.['licenseType']) !has 'Windows'
        and tostring(properties.virtualMachineProfile.['licenseType']) != 'Windows_Server'
    | project
        ResourceId = id,
        ResourceName = name,
        VMSize = tostring(properties.hardwareProfile.vmSize),
        LicenseType = tostring(properties.['licenseType']),
        Region = location,
        ResourceGroupName = resourceGroup,
        subscriptionId
) on subscriptionId
| project
    ResourceId,
    ResourceName,
    VMSize,
    LicenseType,
    Region,
    ResourceGroupName,
    SubscriptionName,
    SubscriptionId = subscriptionId

Use o Benefício Híbrido do Azure para máquinas virtuais SQL

Recomendação: habilite o Benefício Híbrido do Azure para VMs do SQL Server para reduzir os custos de licenciamento usando licenças locais existentes do SQL Server.

Sobre o Benefício Híbrido do Azure para VMs do SQL

Benefício Híbrido do Azure for SQL Server permite que você use suas licenças locais do SQL Server com Software Assurance para executar VMs do SQL Server no Azure a um custo reduzido. Esse benefício se aplica às edições Standard e Enterprise (as edições Developer e Express já são gratuitas e não precisam de Benefício Híbrido do Azure). Essa recomendação só se aplica se sua organização tiver licenças de SQL Server locais qualificadas com o Software Assurance.

Note

FinOps hubs podem identificar automaticamente VMs SQL sem Benefício Híbrido do Azure como uma recomendação opcional. Saiba mais.

Consulta: VMs de SQL sem Benefício Híbrido do Azure

Use a consulta ARG a seguir para identificar SQL Server VMs que não estão aproveitando Benefício Híbrido do Azure. A consulta exclui assinaturas de desenvolvimento/teste e edições developer/express.

Categoria

Optimization

Consulta

resourcecontainers
| where type =~ 'Microsoft.Resources/subscriptions'
| where tostring(properties.subscriptionPolicies.quotaId) !has 'MSDNDevTest_2014-09-01'
| project SubscriptionName = name, subscriptionId
| join (
    resources
    | where type =~ 'Microsoft.SqlVirtualMachine/SqlVirtualMachines'
        and tostring(properties.['sqlServerLicenseType']) != 'AHUB'
    | project
        ResourceId = id,
        ResourceName = name,
        LicenseType = tostring(properties.['sqlServerLicenseType']),
        SQLVersion = tostring(properties.['sqlImageOffer']),
        SQLSKU = tostring(properties.['sqlImageSku']),
        Region = location,
        ResourceGroupName = resourceGroup,
        subscriptionId
) on subscriptionId
| join (
    resources
    | where type =~ 'Microsoft.Compute/virtualMachines'
    | project
        ResourceName = tolower(name),
        VMSize = tostring(properties.hardwareProfile.vmSize),
        subscriptionId
) on ResourceName
| where SQLSKU != 'Developer' and SQLSKU != 'Express'
| project
    ResourceId,
    ResourceName,
    VMSize,
    LicenseType,
    SQLVersion,
    SQLSKU,
    Region,
    ResourceGroupName,
    SubscriptionName,
    SubscriptionId = subscriptionId

Envie comentários

Deixe-nos saber como estamos indo com uma avaliação rápida. Usamos essas revisões para melhorar e expandir ferramentas e recursos do FinOps.

Se você estiver procurando algo específico, vote em um existente ou crie uma ideia. Compartilhe ideias com outras pessoas para obter mais votos. Nos concentramos em ideias com a maioria dos votos.


Recursos relacionados:

Produtos relacionados:

Soluções relacionadas: