Uso de una dirección IP pública estática y una etiqueta DNS con el equilibrador de carga de Azure Kubernetes Service (AKS)
Cuando se crea un recurso de equilibrador de carga en un clúster de Azure Kubernetes Service (AKS), la dirección IP pública asignada a él solo es válida durante la duración de ese recurso. Si elimina el servicio de Kubernetes, el equilibrador de carga asociado y la dirección IP también se eliminan. Si quiere asignar una dirección IP específica o conservar una dirección IP para los servicios de Kubernetes reimplementados, puede crear y usar una dirección IP pública estática.
En este artículo se muestra cómo crear una dirección IP pública estática y asignarla al servicio de Kubernetes.
Antes de empezar
- Es preciso que esté instalada y configurada la versión 2.0.59 o posterior de la CLI de Azure, o cualquier otra posterior. Ejecute
az --version
para encontrar la versión. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure. - En este artículo se describe el uso de una dirección IP de SKU Estándar con un equilibrador de carga de SKU Estándar. Para más información, consulte Tipos de direcciones IP y métodos de asignación en Azure.
Creación de un clúster de AKS
Cree un grupo de recursos de Azure con el comando
az group create
.az group create --name myNetworkResourceGroup --location eastus
Cree un clúster de AKS con el comando
az aks create
.az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
Crear una dirección IP estática
Obtenga el nombre del grupo de recursos del nodo mediante el comando
az aks show
y la consulta de la propiedadnodeResourceGroup
.az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
Cree una dirección IP pública estática en el grupo de recursos del nodo con el comando
az network public ip create
.az network public-ip create \ --resource-group <node resource group name> \ --name myAKSPublicIP \ --sku Standard \ --allocation-method static
Nota:
Si usa un equilibrador de carga de SKU Básico en el clúster de AKS, use Básico para el parámetro
--sku
al definir una dirección IP pública. Solo las direcciones IP de SKU Básicas funcionan con el equilibrador de carga de SKU Básico y solo las IP de SKU Estándar funcionan con los equilibradores de carga de SKU Estándar.Use el comando
az network public-ip list
para obtener una dirección IP pública estática. Especifique el nombre del grupo de recursos del nodo y la dirección IP pública que ha creado y envíe una consulta paraipAddress
.az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
Crear un servicio mediante la dirección IP estática
En primer lugar, determine qué tipo de identidad administrada usa el clúster de AKS, asignado por el sistema o asignado por el usuario. Si no está seguro, ejecute el comando az aks show y consulte la propiedad type de la identidad.
az aks show \ --name myAKSCluster \ --resource-group myResourceGroup \ --query identity.type \ --output tsv
Si el clúster usa una identidad administrada, el valor de la propiedad type será SystemAssigned o UserAssigned.
Si el clúster está utilizando una entidad de servicio, el valor de la propiedad type será null. Considere la posibilidad de actualizar el clúster para usar una identidad administrada.
Si el clúster de AKS usa una identidad administrada asignada por el sistema, consulte el identificador de entidad de seguridad de la identidad administrada de la siguiente manera:
# 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)
Si su clúster AKS utiliza una identidad administrada asignada por el usuario, el id. de entidad de seguridad será null. En su lugar, consulta el id. de cliente de la identidad administrada asignada al usuario:
# 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
Asigne permisos delegados para la identidad administrada que usa el clúster de AKS para el grupo de recursos de la dirección IP pública llamando al 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
Si ha personalizado la dirección IP de salida, asegúrese de que la identidad del clúster tenga permisos tanto para la dirección IP pública de salida como para la dirección IP pública de entrada.
Cree un archivo denominado
load-balancer-service.yaml
y copie en el contenido del siguiente archivo YAML, proporcionando su propia dirección IP pública creada en el paso anterior y el nombre del grupo de recursos del nodo.Importante
La adición de la propiedad
loadBalancerIP
al manifiesto YAML del equilibrador de carga está en desuso después de Kubernetes ascendente. Aunque se espera que el uso actual siga siendo el mismo y los servicios existentes funcionen sin modificaciones, se recomienda encarecidamente establecer anotaciones de servicio en su lugar. Para establecer anotaciones de servicio, puede usarservice.beta.kubernetes.io/azure-pip-name
para un nombre de IP pública oservice.beta.kubernetes.io/azure-load-balancer-ipv4
para una dirección IPv4 yservice.beta.kubernetes.io/azure-load-balancer-ipv6
para una dirección IPv6, como se muestra en el ejemplo 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
Nota:
Agregar la anotación
service.beta.kubernetes.io/azure-pip-name
garantiza la creación de LoadBalancer más eficaz y es muy recomendable para evitar posibles limitaciones.Establezca una etiqueta DNS orientada al público en el servicio mediante la anotación de servicio
service.beta.kubernetes.io/azure-dns-label-name
. Esta acción publica un nombre de dominio completo (FQDN) para el servicio mediante los servidores DNS públicos de Azure y el dominio de nivel superior. El valor de la anotación debe ser único dentro de la ubicación de Azure, por lo que se recomienda usar una etiqueta suficientemente calificada. Azure anexa automáticamente un sufijo predeterminado en la ubicación seleccionada, como<location>.cloudapp.azure.com
, al nombre que proporcione y crea el FQDN.Nota:
Si quiere publicar el servicio en su propio dominio, consulte Azure DNS y el proyecto 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
Cree el servicio y la implementación con el comando
kubectl apply
.kubectl apply -f load-balancer-service.yaml
Para ver la etiqueta DNS del equilibrador de carga, use el comando
kubectl describe service
:kubectl describe service azure-load-balancer
La etiqueta DNS se mostrará en
Annotations
, como se muestra en la siguiente salida de ejemplo condensada:Name: azure-load-balancer Namespace: default Labels: <none> Annotations: service.beta.kuberenetes.io/azure-dns-label-name: <unique-service-label>
Solución de problemas
Si la dirección IP estática definida en la propiedad loadBalancerIP
del manifiesto de servicio de Kubernetes no existe o no se ha creado en el grupo de recursos del nodo y no se han configurado delegaciones adicionales, se produce un error en la creación del servicio del equilibrador de carga. Para solucionar este problema, revise los eventos de creación del servicio con el comando kubectl describe
. Indique el nombre del servicio especificado en el manifiesto de YAML, como se muestra en este ejemplo:
kubectl describe service azure-load-balancer
La salida le muestra información sobre el recurso de servicio de Kubernetes. En la salida de ejemplo siguiente se muestra una Warning
en el Events
: "user supplied IP address was not found
". En este escenario, asegúrese de que ha creado la dirección IP pública estática en el grupo de recursos del nodo y de que la dirección IP especificada en el manifiesto de servicio de Kubernetes es correcta.
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
Pasos siguientes
Para controlar mejor el tráfico de red de las aplicaciones, use el complemento de enrutamiento de aplicaciones para AKS. Para obtener más información sobre el complemento de enrutamiento de aplicaciones, consulte Entrada NGINX administrada con el complemento de enrutamiento de aplicaciones.
Azure Kubernetes Service