Qual é a maneira correta de atribuir a função de contribuidor de rede a um cluster AKS por meio do modelo ARM/Bicep?

Qual é a maneira correta de atribuir a função de contribuidor de rede a um cluster AKS por meio do modelo ARM/Bicep?

Estou tentando configurar um balanceador de carga para meu servidor AKS usando Bicep/ARM. Estou usando o NGinx Ingress Controller no kubernetes e parece funcionar, mas quando inicio as coisas pela primeira vez, encontro um erro.

Principalmente, estou me perguntando qual é o modelo ARM ou Bicep equivalente para esta etapa na documentação do Azure?

https://docs.microsoft.com/en-us/azure/aks/static-ip#create-a-service-using-the-static-ip-address

az role assignment create \
    --assignee <Client ID> \
    --role "Network Contributor" \
    --scope /subscriptions/<subscription id>/resourceGroups/<resource group name>

Estou usando o Bicep e criei meu servidor AKS assim, por exemplo:

resource ExampleKubernetes 'Microsoft.ContainerService/managedClusters@2021-07-01' = {
  // ...
}

Em seguida, estou adicionando uma atribuição de função à identidade do kubelet da seguinte forma:

var NetworkContibutor = '4d97b98b-1d4f-4787-a291-c67834d212e7'
resource AssignNetworkContributorToKubelet 'Microsoft.Authorization/roleAssignments@2020-08-01-preview' = {
  name: guid(resourceGroup().id, ExampleKubernetes.id, NetworkContibutor)
  dependsOn: [
    ExampleKubernetes
  ]
  properties: {
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', NetworkContibutor)
    principalType: 'ServicePrincipal'
    principalId: ExampleKubernetes.properties.identityProfile.kubeletidentity.objectId
  }
}

O que parece funcionar, posso ver a função atribuída ao principal gerenciado no painel... mas o serviço no kubernetes ainda parece falhar com um problema de permissão:

  Error syncing load balancer: failed to ensure load balancer: Retriable: false,
  RetryAfter: 0s, HTTPStatusCode: 403, RawError: Retriable: false, RetryAfter:
  0s, HTTPStatusCode: 403, RawError:
  {"error":{"code":"AuthorizationFailed","message":"The client
  '<some guid A>' with object id
  '<some buid A>' does not have authorization to perform
  action 'Microsoft.Network/publicIPAddresses/read' over scope
  '/subscriptions/<subid>/resourceGroups/example/providers/Microsoft.Network/publicIPAddresses/example'
  or the scope is invalid. If access was recently granted, please refresh your
  credentials."}}

O que é estranho é que mais tarde, em algum momento, parece funcionar magicamente. Esse erro diz "retriable false" e parece que o serviço não tenta novamente, mas uma implantação subsequente do NGinx no kubernetes iráentãofaça com que ele tente novamente e de repente aumente seu funcionamento.

Parece que a mensagem de erro está me dizendo que há algum atraso não determinístico na propagação da função... Então, minhas perguntas são:

  • Isso está certo? Na verdade, é apenas um atraso e meu código está basicamente correto?
  • Estou usando o principalId correto? Ou isso é realmente desnecessário?
  • Existe uma maneira de forçar a propagação dessas atualizações de função? Eu poderia ter uma etapa CLI intermediária, se precisasse. Como posso esperar para instalar meu controlador de ingresso que se conecta ao LB depois que as permissões estiverem prontas?

Responder1

Não sei por que a resposta anterior foi considerada correta. Você usou a identidade kubelet aqui. Isso é usado para autenticar comregistros de contêineres do Azure, mas no seu caso você deve usar a identidade do cluster (plano de controle) e não consigo encontrar uma maneira de atribuir uma identidade gerenciada pelo sistema. Acredito que a única maneira no momento é trazer o seu próprio.

1 Adicionar Identidade Gerenciadacriaçãoao seu modelo ARM:

resource managedidentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
  name: aksManIdentityName
  location: location
}

2 Atualize a propriedade de identidade do AKS:

  identity:{
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${managedidentity.id}': {}
    }
  }

3 Conceda permissões de contribuidor de rede

resource RBAC_Network_Contributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  scope: resourceGroup()
  name: guid(resourceGroup().id, '${aksClusterName}-NetworkContributor') 
  properties: {
    roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', '4d97b98b-1d4f-4787-a291-c67834d212e7')
    principalId: managedidentity.properties.principalId
    principalType: 'ServicePrincipal'
  }
}

Responder2

Sua pergunta (embora não diretamente) foi respondidaaqui.

O comportamento que você está descrevendo é discutido emesta seção. Como o Azure Resource Manager às vezes armazena em cache configurações e dados para melhorar o desempenho, às vezes pode levar até 30 minutos para que as alterações entrem em vigor quando você atribui funções ou remove atribuições de funções.

Utilizando o Azure CLI, pode forçar uma atualização das alterações de atribuição de funções,saindo e entrando.

informação relacionada