Delen via


Geavanceerde NGINX-ingresscontroller en configuraties voor ingress met de add-on voor applicatieroutering

De invoegtoepassing voor toepassingsroutering ondersteunt twee manieren om toegangsbeheerobjecten en inkomende objecten te configureren:

Vereisten

Een AKS-cluster met de invoegtoepassing voor toepassingsroutering.

Verbinding maken met uw AKS-cluster

Als u vanaf uw lokale computer verbinding wilt maken met het Kubernetes-cluster, gebruikt kubectlu de Kubernetes-opdrachtregelclient. U kunt deze lokaal installeren met behulp van de opdracht az aks install-cli . Als u Azure Cloud Shell gebruikt, is kubectl al geïnstalleerd.

Configureer kubectl om verbinding te maken met uw Kubernetes-cluster met behulp van de az aks get-credentials opdracht.

az aks get-credentials --resource-group <ResourceGroupName> --name <ClusterName>

Configuratie van de NGINX-ingangscontroller

De invoegtoepassing voor toepassingsroutering maakt gebruik van een aangepaste Kubernetes-resourcedefinitie (CRD) die wordt aangeroepen NginxIngressController om NGINX-ingangscontrollers te configureren. U kunt meer ingangscontrollers maken of bestaande configuratie wijzigen.

In deze tabel ziet u een overzicht van eigenschappen die u kunt instellen om een NginxIngressController te configureren.

Veld Typologie Beschrijving Verplicht Verstek
controllerNamePrefix touw Naam voor de beheerde NGINX Ingress Controller-bronnen. Ja nginx
customHTTPErrors array Matrix van foutcodes die moeten worden verzonden naar de standaardback-end in het geval van een fout. Nee.
defaultBackendService Voorwerp Service voor het routeren van niet-overeenkomend HTTP-verkeer. Bevat geneste eigenschappen: Nee.
name touw Servicenaam. Ja
namespace touw Servicenaamruimte. Ja
defaultSSLCertificate Voorwerp Bevat het standaardcertificaat voor toegang tot de standaardback-endservice. Bevat geneste eigenschappen: Nee.
forceSSLRedirect booleaan Dwingt HTTPS-omleiding af wanneer een certificaat is ingesteld. Nee. false
keyVaultURI touw URI voor een Key Vault-geheim dat het certificaat opslaat. Nee.
secret Voorwerp Bevat geheime informatie voor het standaard-SSL-certificaat. Bevat geneste eigenschappen: Nee.
  name touw Geheime naam. Ja
  namespace touw Geheime naamruimte. Ja
httpDisabled booleaan Vlag om HTTP-verkeer naar de controller uit te schakelen. Nee.
ingressClassName touw IngressClass-naam die door de controller wordt gebruikt. Ja nginx.approuting.kubernetes.azure.com
loadBalancerAnnotations Voorwerp Een kaart met aantekeningen om het gedrag van de service van de NGINX-ingangscontroller te beheren door load balancer-aantekeningen in te stellen. Nee.
scaling Voorwerp Configuratie voor het schalen van de controller. Bevat geneste eigenschappen: Nee.
maxReplicas geheel getal Bovengrens voor replica's. Nee. 100
minReplicas geheel getal Ondergrens voor replica's. Nee. 2
threshold touw Drempelwaarde die bepaalt hoe agressief geschaald moet worden. rapid schaalt snel voor plotselinge pieken, steady bevordert kosteneffectiviteit en balanced is een combinatie. Nee. balanced

Algemene configuraties

De standaardconfiguratie van de NGINX-ingangscontroller beheren

Wanneer u de invoegtoepassing voor toepassingsroutering inschakelt met NGINX, wordt er een ingangscontroller gemaakt die is aangeroepen default in de app-routing-namespace geconfigureerde met een openbare Azure Load Balancer. Deze ingress-controller maakt gebruik van een ingress-klasnaam van webapprouting.kubernetes.azure.com.

U kunt ook bepalen of de standaardinstelling een openbaar of intern IP-adres krijgt, of of deze helemaal wordt gemaakt bij het inschakelen van de invoegtoepassing.

Hier volgen de mogelijke configuratieopties:

  • None: De standaard Nginx-ingangscontroller wordt niet gemaakt en wordt niet verwijderd als deze al bestaat. Gebruikers moeten de standaard NginxIngressController aangepaste resource desgewenst handmatig verwijderen.
  • Internal: De standaard Nginx-ingangscontroller wordt gemaakt met een interne load balancer. Eventuele wijzigingen in aantekeningen in de NginxIngressController aangepaste resource om deze extern te maken, worden overschreven.
  • External: De standaard Nginx-ingangscontroller die is gemaakt met een externe load balancer. Eventuele wijzigingen in de aantekeningen van de NginxIngressController aangepaste resource als deze intern moet zijn, worden overschreven.
  • AnnotationControlled (standaard): De standaard Nginx-ingangscontroller wordt gemaakt met een externe load balancer. Gebruikers kunnen de standaard NginxIngressController aangepaste resource bewerken om aantekeningen van load balancers te configureren.

De standaardconfiguratie van de ingangscontroller beheren bij het maken van het cluster

Als u toepassingsroutering op een nieuw cluster wilt inschakelen, gebruikt u de az aks create opdracht, waarbij u de --enable-app-routing en de --app-routing-default-nginx-controller vlaggen opgeeft. U moet de <DefaultIngressControllerType> configuratieopties instellen die eerder zijn beschreven.

az aks create \
--resource-group <ResourceGroupName> \
--name <ClusterName> \
--location <Location> \
--enable-app-routing \
--app-routing-default-nginx-controller <DefaultIngressControllerType>

De standaardconfiguratie van de ingress-controller in een bestaand cluster bijwerken

Als u de standaardconfiguratie van de ingangscontroller voor toepassingsroutering op een bestaand cluster wilt bijwerken, gebruikt u de az aks approuting update opdracht en geeft u de --nginx vlag op. U moet de <DefaultIngressControllerType> configuratieopties instellen die eerder zijn beschreven.

az aks approuting update --resource-group <ResourceGroupName> --name <ClusterName> --nginx <DefaultIngressControllerType>

Een andere openbare NGINX-ingangscontroller maken

Een andere NGINX-ingangscontroller maken met een openbare Azure Load Balancer:

  1. Kopieer het volgende YAML-manifest naar een nieuw bestand met de naam nginx-public-controller.yaml en sla het bestand op uw lokale computer op.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-public
    spec:
      ingressClassName: nginx-public
      controllerNamePrefix: nginx-public
    
  2. Maak de NGINX-controllerbronnen voor inkomend verkeer met behulp van de kubectl apply opdracht.

    kubectl apply -f nginx-public-controller.yaml
    

    In de volgende voorbeelduitvoer ziet u de gemaakte resource:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-public created
    

Een interne NGINX-ingangscontroller maken met een privé-IP-adres

Een NGINX-ingangscontroller maken met een interne Azure Load Balancer met een privé-IP-adres:

  1. Kopieer het volgende YAML-manifest naar een nieuw bestand met de naam nginx-internal-controller.yaml en sla het bestand op uw lokale computer op.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-internal
    spec:
      ingressClassName: nginx-internal
      controllerNamePrefix: nginx-internal
      loadBalancerAnnotations: 
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    
  2. Maak de NGINX-controllerbronnen voor inkomend verkeer met behulp van de kubectl apply opdracht.

    kubectl apply -f nginx-internal-controller.yaml
    

    In de volgende voorbeelduitvoer ziet u de gemaakte resource:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
    

Een NGINX-ingangscontroller maken met een statisch IP-adres

Een NGINX-ingangscontroller maken met een statisch IP-adres op de Azure Load Balancer:

  1. Maak een Azure-resourcegroep met behulp van de az group create opdracht.

    az group create --name myNetworkResourceGroup --location eastus
    
  2. Maak een statisch openbaar IP-adres met behulp van de az network public ip create opdracht.

    az network public-ip create \
        --resource-group myNetworkResourceGroup \
        --name myIngressPublicIP \
        --sku Standard \
        --allocation-method static
    

    Notitie

    Als u een Basic SKU-load balancer in uw AKS-cluster gebruikt, gebruik u Basic voor de --sku parameter bij het definiëren van een openbaar IP-adres. Alleen Basic SKU-IP's werken met de Basic SKU-load balancer en alleen Standard SKU-IP's werken met Standard SKU-load balancers.

  3. Zorg ervoor dat de clusteridentiteit die door het AKS-cluster wordt gebruikt, gedelegeerde machtigingen heeft voor de resourcegroep van het openbare IP-adres met behulp van de az role assignment create opdracht.

    Notitie

    Werk <ClusterName> en <ClusterResourceGroup> bij met de naam en resourcegroepnaam van uw AKS-cluster.

    CLIENT_ID=$(az aks show --name <ClusterName> --resource-group <ClusterResourceGroup> --query identity.principalId -o tsv)
    RG_SCOPE=$(az group show --name myNetworkResourceGroup --query id -o tsv)
    az role assignment create \
        --assignee ${CLIENT_ID} \
        --role "Network Contributor" \
        --scope ${RG_SCOPE}
    
  4. Kopieer het volgende YAML-manifest naar een nieuw bestand met de naam nginx-staticip-controller.yaml en sla het bestand op uw lokale computer op.

    Notitie

    U kunt deze gebruiken service.beta.kubernetes.io/azure-pip-name voor een openbare IP-naam of voor service.beta.kubernetes.io/azure-load-balancer-ipv4 een IPv4-adres en service.beta.kubernetes.io/azure-load-balancer-ipv6 voor een IPv6-adres, zoals wordt weergegeven in het voorbeeld van YAML. Het toevoegen van de service.beta.kubernetes.io/azure-pip-name annotatie zorgt ervoor dat de meest efficiënte LoadBalancer wordt gemaakt en wordt ten zeerste aanbevolen om mogelijk throttlen te voorkomen.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-static
    spec:
      ingressClassName: nginx-static
      controllerNamePrefix: nginx-static
      loadBalancerAnnotations: 
        service.beta.kubernetes.io/azure-pip-name: "myIngressPublicIP"
        service.beta.kubernetes.io/azure-load-balancer-resource-group: "myNetworkResourceGroup"
    
  5. Maak de NGINX-controllerbronnen voor inkomend verkeer met behulp van de kubectl apply opdracht.

    kubectl apply -f nginx-staticip-controller.yaml
    

    In de volgende voorbeelduitvoer ziet u de gemaakte resource:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-static created
    

Controleren of de ingangscontroller is gemaakt

U kunt de status van de NGINX-ingangscontroller controleren met behulp van de kubectl get nginxingresscontroller opdracht.

Notitie

Werk <IngressControllerName> bij met de naam die u hebt gebruikt bij het maken van de `NginxIngressController`.

kubectl get nginxingresscontroller -n <IngressControllerName>

In de volgende voorbeelduitvoer ziet u de gemaakte resource. Het kan enkele minuten duren voordat de controller beschikbaar is:

NAME           INGRESSCLASS   CONTROLLERNAMEPREFIX   AVAILABLE
nginx-public   nginx-public   nginx                  True

U kunt ook de voorwaarden bekijken om eventuele problemen op te lossen:

kubectl get nginxingresscontroller -n <IngressControllerName> -o jsonpath='{range .items[*].status.conditions[*]}{.lastTransitionTime}{"\t"}{.status}{"\t"}{.type}{"\t"}{.message}{"\n"}{end}'

In de volgende voorbeelduitvoer ziet u de toestand van een gezonde ingresscontroller.

2023-11-29T19:59:24Z    True    IngressClassReady       Ingress Class is up-to-date
2023-11-29T19:59:50Z    True    Available               Controller Deployment has minimum availability and IngressClass is up-to-date
2023-11-29T19:59:50Z    True    ControllerAvailable     Controller Deployment is available
2023-11-29T19:59:25Z    True    Progressing             Controller Deployment has successfully progressed

De ingresscontroller gebruiken in een ingress

  1. Kopieer het volgende YAML-manifest naar een nieuw bestand met de naam ingress.yaml en sla het bestand op uw lokale computer op.

    Notitie

    Werk <Hostname> bij met uw DNS-hostnaam. Het <IngressClassName> is degene die u hebt gedefinieerd bij het maken van de NginxIngressController.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: <IngressClassName>
      rules:
      - host: <Hostname>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
    
  2. Maak de clusterbronnen met behulp van de kubectl apply opdracht.

    kubectl apply -f ingress.yaml -n hello-web-app-routing
    

    In de volgende voorbeelduitvoer ziet u de gemaakte resource:

    ingress.networking.k8s.io/aks-helloworld created
    

Controleren of de beheerde Ingress is aangemaakt

U kunt verifiëren of het beheerde Ingress is gemaakt met behulp van het kubectl get ingress commando.

kubectl get ingress -n hello-web-app-routing

In de volgende voorbeelduitvoer ziet u de gemaakte beheerde Ingress. De ingangsklasse, host en IP-adres kunnen afwijken:

NAME             CLASS                                HOSTS               ADDRESS       PORTS     AGE
aks-helloworld   webapprouting.kubernetes.azure.com   myapp.contoso.com   20.51.92.19   80, 443   4m

Opruimen van ingress controllers

U kunt de NGINX-ingangscontroller verwijderen met behulp van de kubectl delete nginxingresscontroller opdracht.

Notitie

Werk <IngressControllerName> bij met de naam die u hebt gebruikt bij het maken van de NginxIngressController.

kubectl delete nginxingresscontroller -n <IngressControllerName>

Resource per inkomend verkeer configureren via aantekeningen

De NGINX-ingangscontroller biedt ondersteuning voor het toevoegen van aantekeningen aan specifieke objecten voor inkomend verkeer om hun gedrag aan te passen.

U kunt aantekeningen toevoegen aan het inkomende object door de respectieve aantekening toe te voegen in het metadata.annotations veld.

Notitie

Aantekeningssleutels en -waarden kunnen alleen tekenreeksen zijn. Andere typen, zoals Booleaanse waarden of numerieke waarden, moeten worden geciteerd, bijvoorbeeld "true", "false". "100"

Hier volgen enkele voorbeelden van aantekeningen voor algemene configuraties. Raadpleeg de documentatie over NGINX-ingressannotaties voor een volledige lijst.

Aangepaste maximale grootte van hoofdtekst

Voor NGINX wordt een 413-fout geretourneerd naar de client wanneer de grootte in een aanvraag groter is dan de maximaal toegestane grootte van de hoofdtekst van de clientaanvraag. Als u de standaardwaarde wilt overschrijven, gebruikt u de aantekening:

nginx.ingress.kubernetes.io/proxy-body-size: 4m

Hier volgt een voorbeeld van een configuratie voor inkomend verkeer met behulp van deze aantekening:

Notitie

Werk <Hostname> bij met uw DNS-hostnaam. Het <IngressClassName> is degene die u hebt gedefinieerd bij het maken van de NginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 4m
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <Hostname>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

Time-out voor aangepaste verbinding

U kunt de time-out wijzigen waarop de NGINX-ingangscontroller wacht om een verbinding met uw workload te sluiten. Alle time-outwaarden zijn eenheidsloos en in seconden. Als u de standaardtime-out wilt overschrijven, gebruikt u de volgende aantekening om een geldige time-out voor lezen van 120 seconden in te stellen voor de proxy:

nginx.ingress.kubernetes.io/proxy-read-timeout: "120"

Bekijk aangepaste time-outs voor andere configuratieopties.

Hier volgt een voorbeeld van een configuratie voor inkomend verkeer met behulp van deze aantekening:

Notitie

Werk <Hostname> bij met uw DNS-hostnaam. Het <IngressClassName> is degene die u hebt gedefinieerd bij het maken van de NginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/proxy-read-timeout: "120"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <Hostname>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

Back-endprotocol

Standaard gebruikt de NGINX-ingangscontroller HTTP om de services te bereiken. Als u alternatieve back-endprotocollen zoals HTTPS of GRPCwilt configureren, gebruikt u de aantekening:

nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

of

nginx.ingress.kubernetes.io/backend-protocol: "GRPC"

Bekijk back-endprotocollen voor andere configuratieopties.

Hier volgt een voorbeeld van een configuratie voor inkomend verkeer met behulp van deze aantekening:

Notitie

Werk <Hostname> bij met uw DNS-hostnaam. Het <IngressClassName> is degene die u hebt gedefinieerd bij het maken van de NginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <Hostname>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

Cross-Origin Resource Sharing (CORS) (uitwisseling van bronnen tussen meerdere domeinen)

Om Cross-Origin Resource Sharing (CORS) in te schakelen in een Ingress-regel, gebruikt u de annotatie:

nginx.ingress.kubernetes.io/enable-cors: "true"

Controleer het inschakelen van CORS voor andere configuratie-opties.

Hier volgt een voorbeeld van een configuratie voor inkomend verkeer met behulp van deze aantekening:

Notitie

Werk <Hostname> bij met uw DNS-hostnaam. Het <IngressClassName> is degene die u hebt gedefinieerd bij het maken van de NginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/enable-cors: "true"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <Hostname>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

SSL-omleiding uitschakelen

Standaard redirect de controller (308) naar HTTPS als TLS is ingeschakeld voor een ingress. Om deze functie uit te schakelen voor specifieke ingress-resources, gebruikt u de annotatie:

nginx.ingress.kubernetes.io/ssl-redirect: "false"

Controleer https-afdwinging aan de serverzijde via omleiding voor andere configuratieopties.

Hier volgt een voorbeeld van een configuratie voor inkomend verkeer met behulp van deze aantekening:

Notitie

Werk <Hostname> bij met uw DNS-hostnaam. Het <IngressClassName> is degene die u hebt gedefinieerd bij het maken van de NginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <Hostname>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

URL herschrijven

In verschillende scenario's verschilt de blootgestelde URL in de back-endservice van het opgegeven pad in de Ingress-regel. Zonder herschrijven retourneert een aanvraag 404. Deze configuratie is handig met padgebaseerde routering , waar u twee verschillende webtoepassingen onder hetzelfde domein kunt leveren. U kunt het pad instellen dat door de service wordt verwacht met behulp van de aantekening:

nginx.ingress.kubernetes.io/rewrite-target": /$2

Hier volgt een voorbeeld van een configuratie voor inkomend verkeer met behulp van deze aantekening:

Notitie

Werk <Hostname> bij met uw DNS-hostnaam. Het <IngressClassName> is degene die u hebt gedefinieerd bij het maken van de NginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <Hostname>
    http:
      paths:
      - path: /app-one(/|$)(.*)
        pathType: Prefix 
        backend:
          service:
            name: app-one
            port:
              number: 80
      - path: /app-two(/|$)(.*)
        pathType: Prefix 
        backend:
          service:
            name: app-two
            port:
              number: 80

Volgende stappen

Meer informatie over het monitoren van de metrics van de ingress-nginx-controller die bij de add-on voor applicatieroutering horen met behulp van Prometheus in Grafana als onderdeel van het analyseren van de prestaties en het gebruik van uw toepassing.