Een interne load balancer gebruiken met Azure Kubernetes Service (AKS)

U kunt een interne load balancer maken en gebruiken om de toegang tot uw toepassingen in Azure Kubernetes Service (AKS) te beperken. Een interne load balancer heeft geen openbaar IP-adres en maakt een Kubernetes-service alleen toegankelijk voor toepassingen die het privé-IP-adres kunnen bereiken. Deze toepassingen kunnen zich binnen hetzelfde VNET of in een ander VNET bevinden via VNET-peering. In dit artikel leest u hoe u een interne load balancer maakt en gebruikt met AKS.

Notitie

Azure Load Balancer is beschikbaar in twee SKU's: Basic en Standard. De standard-SKU wordt standaard gebruikt wanneer u een AKS-cluster maakt. Wanneer u een LoadBalancer-servicetype maakt, krijgt u hetzelfde type load balancer als bij het inrichten van het cluster. Zie Vergelijking van Azure Load Balancer-SKU's voor meer informatie.

Voordat u begint

Een interne load balancer maken

  1. Maak een servicemanifest met de naam internal-lb.yaml van het servicetype LoadBalancer en de azure-load-balancer-internal aantekening.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. Implementeer de interne load balancer met behulp van de kubectl apply opdracht. Met deze opdracht maakt u een Azure Load Balancer in de knooppuntresourcegroep die is verbonden met hetzelfde virtuele netwerk als uw AKS-cluster.

    kubectl apply -f internal-lb.yaml
    
  3. Bekijk de servicedetails met behulp van de kubectl get service opdracht.

    kubectl get service internal-app
    

    Het IP-adres van de interne load balancer wordt weergegeven in de EXTERNAL-IP kolom, zoals wordt weergegeven in de volgende voorbeelduitvoer. In deze context verwijst Extern naar de externe interface van de load balancer. Het betekent niet dat het een openbaar, extern IP-adres ontvangt. Dit IP-adres wordt dynamisch toegewezen vanuit hetzelfde subnet als het AKS-cluster.

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.248.59   10.240.0.7    80:30555/TCP   2m
    

Een IP-adres opgeven

Wanneer u een IP-adres voor de load balancer opgeeft, moet het opgegeven IP-adres zich in hetzelfde subnet bevinden als het AKS-cluster, maar kan het nog niet worden toegewezen aan een resource. U moet bijvoorbeeld geen IP-adres gebruiken in het bereik dat is aangewezen voor het Kubernetes-subnet in het AKS-cluster.

U kunt de az network vnet subnet list Azure CLI-opdracht of de Get-AzVirtualNetworkSubnetConfig PowerShell-cmdlet gebruiken om de subnetten in uw virtuele netwerk op te halen.

Zie Een knooppuntgroep met een uniek subnet toevoegen voor meer informatie over subnetten.

Als u een specifiek IP-adres met de load balancer wilt gebruiken, hebt u twee opties: serviceaantekeningen instellen of de eigenschap LoadBalancerIP toevoegen aan het YAML-manifest van de load balancer.

Belangrijk

Het toevoegen van de eigenschap LoadBalancerIP aan het YAML-manifest van de load balancer wordt afgeschaft na upstream Kubernetes. Hoewel het huidige gebruik hetzelfde blijft en bestaande services naar verwachting zonder aanpassingen werken, raden we u ten zeerste aan serviceaantekeningen in te stellen.

  1. Serviceaantekeningen instellen die worden gebruikt service.beta.kubernetes.io/azure-load-balancer-ipv4 voor een IPv4-adres en service.beta.kubernetes.io/azure-load-balancer-ipv6 voor een IPv6-adres.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-ipv4: 10.240.0.25
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  1. Bekijk de servicedetails met behulp van de kubectl get service opdracht.

    kubectl get service internal-app
    

    Het IP-adres in de EXTERNAL-IP kolom moet overeenkomen met het opgegeven IP-adres, zoals wordt weergegeven in de volgende voorbeelduitvoer:

    NAME           TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.184.168   10.240.0.25   80:30225/TCP   4m
    

Zie Een ander subnet opgeven voor meer informatie over het configureren van uw load balancer in een ander subnet

Voordat u begint

  • U hebt Kubernetes versie 1.22.x of hoger nodig.
  • U hebt een bestaande resourcegroep met een VNet en subnet nodig. In deze resourcegroep maakt u het privé-eindpunt. Zie Een virtueel netwerk en subnet maken als u deze resources niet hebt.
  1. Maak een servicemanifest met de naam internal-lb-pls.yaml van het servicetype LoadBalancer en de azure-load-balancer-internal aantekeningen.azure-pls-create Raadpleeg het ontwerpdocument voor azure Private Link Service Integration voor meer opties.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
        service.beta.kubernetes.io/azure-pls-create: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. Implementeer de interne load balancer met behulp van de kubectl apply opdracht. Met deze opdracht maakt u een Azure Load Balancer in de knooppuntresourcegroep die is verbonden met hetzelfde virtuele netwerk als uw AKS-cluster. Er wordt ook een Private Link-serviceobject gemaakt dat verbinding maakt met de front-end-IP-configuratie van de load balancer die is gekoppeld aan de Kubernetes-service.

    kubectl apply -f internal-lb-pls.yaml
    
  3. Bekijk de servicedetails met behulp van de kubectl get service opdracht.

    kubectl get service internal-app
    

    Het IP-adres van de interne load balancer wordt weergegeven in de EXTERNAL-IP kolom, zoals wordt weergegeven in de volgende voorbeelduitvoer. In deze context verwijst Extern naar de externe interface van de load balancer. Het betekent niet dat het een openbaar, extern IP-adres ontvangt.

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.125.17.53  10.125.0.66   80:30430/TCP   64m
    
  4. Bekijk de details van het Private Link-serviceobject met behulp van de az network private-link-service list opdracht.

    # Create a variable for the node resource group
    
    AKS_MC_RG=$(az aks show -g myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)
    
    # View the details of the Private Link Service object
    
    az network private-link-service list -g $AKS_MC_RG --query "[].{Name:name,Alias:alias}" -o table
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    Name      Alias
    --------  -------------------------------------------------------------------------
    pls-xyz   pls-xyz.abc123-defg-4hij-56kl-789mnop.eastus2.azure.privatelinkservice
    

Met een privé-eindpunt kunt u privé verbinding maken met uw Kubernetes-serviceobject via de Private Link-service die u hebt gemaakt.

  • Maak het privé-eindpunt met behulp van de az network private-endpoint create opdracht.

    # Create a variable for the private link service
    
    AKS_PLS_ID=$(az network private-link-service list -g $AKS_MC_RG --query "[].id" -o tsv)
    
    # Create the private endpoint
    
    $ az network private-endpoint create \
        -g myOtherResourceGroup \
        --name myAKSServicePE \
        --vnet-name myOtherVNET \
        --subnet pe-subnet \
        --private-connection-resource-id $AKS_PLS_ID \
        --connection-name connectToMyK8sService
    

PLS-aanpassingen via aantekeningen

Hieronder vindt u aantekeningen die kunnen worden gebruikt om de PLS-resource aan te passen.

Aantekening Weergegeven als Beschrijving Vereist Standaardinstelling
service.beta.kubernetes.io/azure-pls-create "true" Booleaanse waarde die aangeeft of er een PLS moet worden gemaakt. Vereist
service.beta.kubernetes.io/azure-pls-name <PLS name> Tekenreeks die de naam opgeeft van de PLS-resource die moet worden gemaakt. Optioneel "pls-<LB frontend config name>"
service.beta.kubernetes.io/azure-pls-resource-group Resource Group name Tekenreeks die de naam opgeeft van de resourcegroep waarin de PLS-resource wordt gemaakt Optioneel MC_ resource
service.beta.kubernetes.io/azure-pls-ip-configuration-subnet <Subnet name> Tekenreeks die het subnet aangeeft waarop de PLS wordt geïmplementeerd. Dit subnet moet zich in hetzelfde VNET bevinden als de back-endpool. PLS NAT IP-adressen worden toegewezen binnen dit subnet. Optioneel Als service.beta.kubernetes.io/azure-load-balancer-internal-subnetdit ILB-subnet wordt gebruikt. Anders wordt het standaardsubnet van het configuratiebestand gebruikt.
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count [1-8] Totaal aantal privé-NAT-IP's dat moet worden toegewezen. Optioneel 1
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address "10.0.0.7 ... 10.0.0.10" Een door ruimte gescheiden lijst met statische IP-adressen van IPv4 die moeten worden toegewezen. (IPv6 wordt momenteel niet ondersteund.) Het totale aantal IP-adressen mag niet groter zijn dan het ip-aantal dat is opgegeven in service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count. Als er minder IP-adressen zijn opgegeven, worden de rest dynamisch toegewezen. Het eerste IP-adres in de lijst is ingesteld als Primary. Optioneel Alle IP-adressen worden dynamisch toegewezen.
service.beta.kubernetes.io/azure-pls-fqdns "fqdn1 fqdn2" Een door spaties gescheiden lijst met fqdns die zijn gekoppeld aan de PLS. Optioneel []
service.beta.kubernetes.io/azure-pls-proxy-protocol "true" of "false" Booleaanse waarde die aangeeft of het TCP PROXY-protocol moet worden ingeschakeld op de PLS om verbindingsgegevens door te geven, inclusief de koppelings-id en het bron-IP-adres. Houd er rekening mee dat de back-endservice het PROXY-protocol moet ondersteunen of dat de verbindingen mislukken. Optioneel false
service.beta.kubernetes.io/azure-pls-visibility "sub1 sub2 sub3 … subN" of "*" Een door spaties gescheiden lijst met Azure-abonnements-id's waarvoor de Private Link-service zichtbaar is. Gebruik "*" dit om de PLS beschikbaar te maken voor alle subs (minst beperkend). Optioneel Lege lijst [] die alleen op rollen gebaseerd toegangsbeheer aangeeft: deze private link-service is alleen beschikbaar voor personen met op rollen gebaseerd toegangsbeheermachtigingen in uw directory. (Meest beperkend)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" Een door spaties gescheiden lijst met Azure-abonnements-id's. Hierdoor kunnen PE-verbindingsaanvragen van de vermelde abonnementen naar de PLS automatisch worden goedgekeurd. Dit werkt alleen wanneer zichtbaarheid is ingesteld op '*'. Optioneel []

Privénetwerken gebruiken

Wanneer u uw AKS-cluster maakt, kunt u geavanceerde netwerkinstellingen opgeven. Met deze instellingen kunt u het cluster implementeren in een bestaand virtueel Azure-netwerk en -subnetten. U kunt uw AKS-cluster bijvoorbeeld implementeren in een particulier netwerk dat is verbonden met uw on-premises omgeving en services uitvoeren die alleen intern toegankelijk zijn.

Zie Uw eigen subnetten voor virtuele netwerken configureren met Kubenet of met Azure CNI voor meer informatie.

U hoeft geen wijzigingen aan te brengen in de vorige stappen om een interne load balancer te implementeren die gebruikmaakt van een particulier netwerk in een AKS-cluster. De load balancer wordt gemaakt in dezelfde resourcegroep als uw AKS-cluster, maar is in plaats daarvan verbonden met uw particuliere virtuele netwerk en subnet, zoals wordt weergegeven in het volgende voorbeeld:

$ kubectl get service internal-app

NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
internal-app   LoadBalancer   10.1.15.188   10.0.0.35     80:31669/TCP   1m

Notitie

De clusteridentiteit die door het AKS-cluster wordt gebruikt, moet ten minste de rol Netwerkbijdrager hebben op de resource van het virtuele netwerk. U kunt de clusteridentiteit weergeven met behulp van de az aks show opdracht, zoals az aks show --resource-group <resource-group-name> --name <cluster-name> --query "identity". U kunt de rol Inzender voor netwerken toewijzen met behulp van de az role assignment create opdracht, zoals az role assignment create --assignee <identity-resource-id> --scope <virtual-network-resource-id> --role "Network Contributor".

Als u in plaats daarvan een aangepaste rol wilt definiëren, hebt u de volgende machtigingen nodig:

  • Microsoft.Network/virtualNetworks/subnets/join/action
  • Microsoft.Network/virtualNetworks/subnets/read

Zie Een subnet van een virtueel netwerk toevoegen, wijzigen of verwijderen voor meer informatie.

Een ander subnet opgeven

  • Voeg de azure-load-balancer-internal-subnet aantekening toe aan uw service om een subnet voor uw load balancer op te geven. Het opgegeven subnet moet zich in hetzelfde virtuele netwerk bevinden als uw AKS-cluster. Wanneer het is geïmplementeerd, maakt het load balancer-adres EXTERNAL-IP deel uit van het opgegeven subnet.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
        service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "apps-subnet"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    

De load balancer verwijderen

De load balancer wordt verwijderd wanneer alle services worden verwijderd.

Net als bij elke Kubernetes-resource kunt u rechtstreeks een service verwijderen, zoals kubectl delete service internal-app, waarmee ook de onderliggende Azure-load balancer wordt verwijderd.

Volgende stappen

Zie de Documentatie voor Kubernetes-services voor meer informatie over Kubernetes-services.