Usar um endereço IP público estático e um rótulo DNS com o balanceador de carga do Serviço Kubernetes do Azure (AKS)
Quando você cria um recurso de balanceador de carga em um cluster do Serviço Kubernetes do Azure (AKS), o endereço IP público atribuído a ele só é válido para a vida útil desse recurso. Se eliminar o serviço Kubernetes, o balanceador de carga e o endereço IP associados também serão eliminados. Se quiser atribuir um endereço IP específico ou reter um endereço IP para os serviços do Kubernetes reimplementados, poderá criar e utilizar 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 seu serviço Kubernetes.
Antes de começar
- Você precisa da CLI do Azure versão 2.0.59 ou posterior instalada e configurada. Executar
az --version
para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI). - Este artigo aborda o uso de um IP de SKU padrão com um balanceador de carga de SKU padrão . Para obter mais informações, consulte Tipos de endereço IP e métodos de alocação no Azure.
Criar um cluster do AKS
Crie um grupo de recursos do Azure usando o
az group create
comando.az group create --name myNetworkResourceGroup --location eastus
Crie um cluster AKS usando o
az aks create
comando.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 e consulte
az aks show
anodeResourceGroup
propriedade.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ó usando o
az network public ip create
comando.az network public-ip create \ --resource-group <node resource group name> \ --name myAKSPublicIP \ --sku Standard \ --allocation-method static
Nota
Se você estiver usando um balanceador de carga Basic SKU em seu cluster AKS, use Basic para o
--sku
parâmetro ao definir um IP público. Apenas IPs de SKU Básicos funcionam com o balanceador de carga de SKU Básico e apenas IPs de SKU Padrão funcionam com balanceadores de carga de SKU Padrão .Obtenha o endereço IP público estático usando o
az network public-ip list
comando. 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 que tipo de identidade gerenciada seu cluster AKS está usando, atribuída pelo sistema ou atribuída pelo usuário. Se não tiver certeza, chame o comando az aks show e consulte a propriedade type 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 type será SystemAssigned ou UserAssigned.
Se o cluster estiver usando uma entidade de serviço, o valor da propriedade type será null. Considere atualizar seu cluster para usar uma identidade gerenciada.
Se o cluster AKS usar uma identidade gerenciada atribuída ao sistema, consulte o ID principal 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 AKS usar uma identidade gerenciada atribuída pelo usuário, o ID principal será nulo. Em vez disso, consulte o 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 AKS para o grupo de recursos do IP público chamando o
az role assignment create
comando.# 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 nomeado
load-balancer-service.yaml
e copie o conteúdo do seguinte arquivo YAML, fornecendo seu próprio endereço IP público criado na etapa anterior e o nome do grupo de recursos do nó.Importante
Adicionar a
loadBalancerIP
propriedade ao manifesto YAML do balanceador de carga está substituindo o Kubernetes upstream. Embora o uso atual permaneça o mesmo e se espere que os serviços existentes funcionem sem modificações, é 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 nome IP público ou usarservice.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 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
Nota
Adicionar a
service.beta.kubernetes.io/azure-pip-name
anotação garante a criação mais eficiente do LoadBalancer e é altamente recomendado para evitar possíveis limitações.Defina um rótulo DNS voltado para o público para o serviço usando a anotação de
service.beta.kubernetes.io/azure-dns-label-name
serviço. Isso publica um nome de domínio totalmente qualificado (FQDN) para seu serviço usando os servidores DNS públicos e o domínio de nível superior do Azure. O valor da anotação deve ser exclusivo dentro do local do Azure, portanto, recomendamos que você use um rótulo suficientemente qualificado. O Azure acrescenta automaticamente um sufixo padrão no local selecionado, como<location>.cloudapp.azure.com
, ao nome fornecido, criando o FQDN.Nota
Se você quiser publicar o serviço em seu próprio domínio, consulte DNS do Azure e o projeto de DNS externo.
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
kubectl apply
comando.kubectl apply -f load-balancer-service.yaml
Para ver o rótulo DNS do seu balanceador de carga, use o
kubectl describe service
comando.kubectl describe service azure-load-balancer
O rótulo DNS será listado sob o
Annotations
, conforme mostrado na seguinte saída de exemplo condensado:Name: azure-load-balancer Namespace: default Labels: <none> Annotations: service.beta.kuberenetes.io/azure-dns-label-name: <unique-service-label>
Resolver problemas
Se o endereço IP estático definido na loadBalancerIP
propriedade do manifesto do serviço 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 do balanceador de carga falhará. Para solucionar problemas, revise os eventos de criação de serviço usando o kubectl describe
comando. 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 informações sobre o recurso de serviço Kubernetes. O exemplo de saída a seguir mostra um Warning
no Events
: "user supplied IP address was not found
." Nesse cenário, verifique se você criou o endereço IP público estático no grupo de recursos do nó e se o endereço IP especificado no manifesto do serviço 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óximos passos
Para obter mais controle sobre o tráfego de rede para seus aplicativos, use o complemento de roteamento de aplicativos para AKS. Para obter mais informações sobre o complemento de roteamento de aplicativo, consulte Ingresso NGINX gerenciado com o complemento de roteamento de aplicativo.
Azure Kubernetes Service