Share via


Geavanceerde NGINX-ingangscontroller- en toegangsbeheerobjectconfiguraties met de invoegtoepassing voor toepassingsroutering

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 naar 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.

NginxIngressControllerCRD heeft een loadBalancerAnnotations veld om het gedrag van de service van de NGINX-ingangscontroller te beheren door load balancer-aantekeningen in te stellen.

De standaard NGINX-ingangscontroller

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 ingangscontroller maakt gebruik van de naam van de klasse Inkomend verkeer van webapprouting.kubernetes.azure.com.

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, gebruikt u Basic voor de parameter bij het --sku definiëren van een openbaar IP-adres. Alleen Basic SKU-IP's werken met de Load Balancer basic SKU 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 opdracht [az role assignment create][az-role-assignment-create].

    Notitie

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

    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 aantekening zorgt ervoor dat de meest efficiënte LoadBalancer wordt gemaakt en wordt ten zeerste aanbevolen om mogelijke beperking 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 voorwaarden van een controller voor inkomend verkeer in orde:

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 ingangscontroller gebruiken in een inkomend verkeer

  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 het beheerde inkomend verkeer is gemaakt

U kunt controleren of het beheerde inkomend verkeer is gemaakt met behulp van de kubectl get ingress opdracht.

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

In de volgende voorbeelduitvoer ziet u het gemaakte beheerde inkomend verkeer. 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

Toegangsbeheerobjectcontrollers opschonen

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 voor aantekeningen voor inkomend verkeer van NGINX 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

Aangepaste verbindingstime-out

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 de proxy van 120 seconden in te stellen:

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

Protocol van back-end

Standaard gebruikt HTTP de NGINX-ingangscontroller 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"

or

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)

Als u CROSS-Origin Resource Sharing (CORS) wilt inschakelen in een regel voor inkomend verkeer, gebruikt u de aantekening:

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

Controleer cors inschakelen 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/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 wordt de controller omgeleid (308) naar HTTPS als TLS is ingeschakeld voor een inkomend verkeer. Als u deze functie wilt uitschakelen voor specifieke toegangsbeheerobjectbronnen, gebruikt u de aantekening:

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 sommige scenario's verschilt de weergegeven URL in de back-endservice van het opgegeven pad in de regel Inkomend verkeer. Zonder herschrijven retourneert een aanvraag 404. Dit is met name handig bij routering op basis van paden, 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 bewaken van de metrische gegevens voor inkomend-nginx-controller die deel uitmaken van de invoegtoepassing voor toepassingsroutering met Prometheus in Grafana als onderdeel van het analyseren van de prestaties en het gebruik van uw toepassing.