Usar um endereço IP público estático e um rótulo de DNS com o balanceador de carga do AKS (Serviço de Kubernetes do Azure)
Quando você cria um recurso do balanceador de carga em um cluster do Serviço de Kubernetes do Azure (AKS), o endereço IP público atribuído a ele é válido apenas durante a vida útil desse recurso. Se você excluir o serviço de Kubernetes, o balanceador de carga e o endereço IP associados também serão excluídos. Se você quiser atribuir um endereço IP específico ou manter um endereço IP para serviços de Kubernetes reimplantados, crie e use um endereço IP público estático.
Este artigo mostra como criar um endereço IP público estático e atribuí-lo ao serviço de Kubernetes.
Antes de começar
- Será necessária a CLI do Azure versão 2.0.59 ou posterior instalada e configurada. Execute
az --version
para encontrar a versão. Se você precisa instalar ou atualizar, consulte Instalar a CLI do Azure. - Este artigo aborda o uso de um IP de SKU Standard com um balanceador de carga de SKU Standard. Para obter mais informações, confira Tipos de endereço IP e métodos de alocação no Azure.
Criar um cluster AKS
Crie um grupo de recursos do Azure usando o comando
az group create
.az group create --name myNetworkResourceGroup --location eastus
Crie um cluster do AKS usando o comando
az aks create
.az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
Criar um endereço IP estático
Obtenha o nome do grupo de recursos do nó usando o comando
az aks show
e a consulta para a propriedadenodeResourceGroup
.az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
Crie um endereço IP público estático no grupo de recursos do nó utilizando o comando
az network public ip create
.az network public-ip create \ --resource-group <node resource group name> \ --name myAKSPublicIP \ --sku Standard \ --allocation-method static
Observação
Se você estiver usando um balanceador de carga de SKU Básico no seu cluster do AKS, use Básico no parâmetro
--sku
ao definir um IP público. Somente os IPs de SKU Básico funcionam com o balanceador de carga de SKU Básico e somente os IPs de SKU Standard funcionam com os balanceadores de carga de SKU Standard.Obtenha o endereço IP público estático usando o comando
az network public-ip list
. Especifique o nome do grupo de recursos do nó e o endereço IP público que você criou e consulte oipAddress
.az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
Criar um serviço usando o endereço IP estático
Primeiro, determine qual tipo de identidade gerenciada o cluster do AKS está usando – atribuída pelo sistema ou atribuída pelo usuário. Se você não tiver certeza, chame o comando az aks show e consulte a propriedade de tipo da identidade.
az aks show \ --name myAKSCluster \ --resource-group myResourceGroup \ --query identity.type \ --output tsv
Se o cluster estiver usando uma identidade gerenciada, o valor da propriedade tipo será SystemAssigned ou UserAssigned.
Se o cluster estiver usando uma entidade de serviço, o valor da propriedade tipo será nulo. Considere atualizar o cluster para usar uma identidade gerenciada.
Se o cluster do AKS usar uma identidade gerenciada atribuída pelo sistema, consulte a ID da entidade de segurança da identidade gerenciada da seguinte maneira:
# Get the principal ID for a system-assigned managed identity. CLIENT_ID=$(az aks show \ --name myAKSCluster \ --resource-group myNetworkResourceGroup \ --query identity.principalId \ --output tsv)
Se o cluster do AKS usar uma identidade gerenciada atribuída pelo usuário, a ID da entidade de segurança será nula. Em vez disso, consulte a ID do cliente da identidade gerenciada atribuída pelo usuário:
# Get the client ID for a user-assigned managed identity. CLIENT_ID=$(az aks show \ --name myAKSCluster \ --resource-group myNetworkResourceGroup \ --query identity.userAssignedIdentities.*.clientId \ --output tsv
Atribua permissões delegadas para a identidade gerenciada usada pelo cluster do AKS para o grupo de recursos do IP público chamando o comando
az role assignment create
.# Get the resource ID for the node resource group. RG_SCOPE=$(az group show \ --name <node resource group> \ --query id \ --output tsv) # Assign the Network Contributor role to the managed identity, # scoped to the node resource group. az role assignment create \ --assignee ${CLIENT_ID} \ --role "Network Contributor" \ --scope ${RG_SCOPE}
Importante
Se você personalizou seu IP de saída, verifique se a identidade do cluster tem permissões para o IP público de saída e para o IP público de entrada.
Crie um arquivo com o nome
load-balancer-service.yaml
e copie o conteúdo do arquivo YAML a seguir, fornecendo seu próprio endereço IP público criado na etapa anterior e o nome do grupo de recursos do nó.Importante
A adição da propriedade
loadBalancerIP
ao manifesto YAML do balanceador de carga está substituindo o upstream Kubernetes a seguir. Embora o uso atual permaneça o mesmo e os serviços existentes funcionem sem modificação, é altamente recomendável definir anotações de serviço. Para definir anotações de serviço, você pode usarservice.beta.kubernetes.io/azure-pip-name
para o nome IP público ouservice.beta.kubernetes.io/azure-load-balancer-ipv4
para um endereço IPv4 eservice.beta.kubernetes.io/azure-load-balancer-ipv6
para um endereço IPv6, conforme mostrado no exemplo de YAML.apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name> service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP name: azure-load-balancer spec: type: LoadBalancer ports: - port: 80 selector: app: azure-load-balancer
Observação
Adicionar a anotação
service.beta.kubernetes.io/azure-pip-name
garante a criação mais eficiente do LoadBalancer e é altamente recomendável para evitar possíveis limitações.Defina um rótulo DNS voltado ao público para o serviço usando a anotação de serviço
service.beta.kubernetes.io/azure-dns-label-name
. Isso publica um nome de domínio totalmente qualificado (FQDN) para seu serviço usando os servidores DNS públicos do Azure e um domínio de nível superior. O valor da anotação precisa ser exclusivo no local do Azure, por isso recomendamos que você use um rótulo suficientemente qualificado. O Azure adiciona automaticamente um sufixo padrão no local selecionado, como<location>.cloudapp.azure.com
, ao nome fornecido, criando o FQDN.Observação
Se desejar publicar o serviço no seu próprio domínio, consulte DNS do Azure e o projeto external-DNS.
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name> service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label> name: azure-load-balancer spec: type: LoadBalancer ports: - port: 80 selector: app: azure-load-balancer
Crie o serviço e a implantação usando o comando
kubectl apply
.kubectl apply -f load-balancer-service.yaml
Para ver o rótulo DNS do balanceador de carga, use o comando
kubectl describe service
.kubectl describe service azure-load-balancer
O rótulo DNS será listado em
Annotations
, como mostrado na saída de exemplo condensado a seguir:Name: azure-load-balancer Namespace: default Labels: <none> Annotations: service.beta.kuberenetes.io/azure-dns-label-name: <unique-service-label>
Solucionar problemas
Se o endereço IP estático definido na propriedade loadBalancerIP
do manifesto do serviço do Kubernetes não existir ou não tiver sido criado no grupo de recursos do nó e não houver outras delegações configuradas, a criação do serviço de balanceador de carga falhará. Para solucionar problemas, revise os eventos de criação do serviço usando o comando kubectl describe
. Forneça o nome do serviço especificado no manifesto YAML, conforme mostrado no exemplo a seguir:
kubectl describe service azure-load-balancer
A saída mostra as informações sobre o recurso do serviço do Kubernetes. A saída de exemplo a seguir mostra um Warning
no Events
: "user supplied IP address was not found
". Nesse cenário, certifique-se de criar o endereço IP público estático no grupo de recursos de nó e se o endereço IP especificado no manifesto do serviço do Kubernetes está correto.
Name: azure-load-balancer
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=azure-load-balancer
Type: LoadBalancer
IP: 10.0.18.125
IP: 40.121.183.52
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32582/TCP
Endpoints: <none>
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CreatingLoadBalancer 7s (x2 over 22s) service-controller Creating load balancer
Warning CreatingLoadBalancerFailed 6s (x2 over 12s) service-controller Error creating load balancer (will retry): Failed to create load balancer for service default/azure-load-balancer: user supplied IP Address 40.121.183.52 was not found
Próximas etapas
Para ter mais controle sobre o tráfego de rede para os seus aplicativos, utilize o complemento de roteamento de aplicativos para AKS. Para obter mais informações sobre o complemento de roteamento de aplicativos, confira Entrada NGINX gerenciada com o complemento de roteamento de aplicativos.
Azure Kubernetes Service