Dela via


Avancerade NGINX-ingresskontrollanter och ingresskonfigurationer med tillägget för programroutning

Tillägget för programroutning stöder två sätt att konfigurera ingresskontrollanter och inkommande objekt:

Förutsättningar

Ett AKS-kluster med tillägget för programdirigering.

Ansluta till ditt AKS-kluster

Om du vill ansluta till Kubernetes-klustret från den lokala datorn använder kubectldu kubernetes-kommandoradsklienten. Du kan installera den lokalt med kommandot az aks install-cli . Om du använder Azure Cloud Shell är kubectl redan installerat.

Konfigurera kubectl för att ansluta till ditt Kubernetes-kluster med hjälp av az aks get-credentials kommandot .

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

Konfiguration av NGINX-ingresskontrollanten

Tillägget för programroutning använder en anpassad Kubernetes-resursdefinition (CRD) som anropas NginxIngressController för att konfigurera NGINX-ingresskontrollanter. Du kan skapa fler ingresskontrollanter eller ändra befintlig konfiguration.

Här är en referens till egenskaper som du kan ange för att konfigurera en NginxIngressController.

Property beskrivning
ingressClassName Namnet på den IngressClass som ska användas för NGINX-ingresskontrollanten. Standardvärdet är namnet på om det NginxIngressController inte har angetts.
controllerNamePrefix Ett namn som används för att prefixa de hanterade NGINX-ingresskontrollantresurserna. Standardvärdet är nginx.
loadBalancerAnnotations En uppsättning anteckningar som styr beteendet för NGINX-ingresskontrollantens tjänst genom att ange anteckningar för lastbalanserare
Skalning Konfigurationsalternativ för hur NGINX-ingresskontrollanten skalar.
scaling.minReplicas Den lägre gränsen för antalet ingresskontrollantrepliker. Standardvärdet är 2 poddar.
scaling.maxReplicas Den övre gränsen för antalet ingresskontrollantrepliker. Standardvärdet är 100 poddar.
scaling.threshold Definierar hur snabbt NGINX-ingresskontrollantpoddarna ska skalas baserat på arbetsbelastning. Rapid innebär att ingresskontrollanten skalar snabbt och aggressivt för hantering av plötsliga och betydande trafiktoppar. Steady prioriterar kostnadseffektivitet med färre repliker som hanterar mer arbete. Balanced är en bra blandning mellan de två som fungerar för de flesta användningsfall. Om det här fältet är ospecificerat är det standardvärdet Balanced.
defaultBackendService Kubernetes-tjänsten som NGINX-ingresskontrollanten ska använda som standard som hanterar alla URL-sökvägar och är värd för Ingress-NGINX-kontrollanten förstår inte (dvs. alla begäranden som inte är mappade med en ingress). Kontrollanten dirigerar trafik till tjänstens första port. Om det inte anges används standardserverdelen som är inbyggd.
defaultBackendService.namespace Tjänstens namnområde.
defaultBackendService.name Namnet på tjänsten.
defaultSSLCertificate Hemligheten som den här egenskapen refererar till innehåller standardcertifikatet som ska användas vid åtkomst till standardserverdelstjänsten. Om den här egenskapen inte anges använder NGINX ett självsignerat certifikat. Om avsnittet tls: inte har angetts för en ingress tillhandahåller NGINX standardcertifikatet men tvingar inte HTTPS-omdirigering.
defaultSSLCertificate.forceSSLRedirect Tvingar fram en omdirigering för ingresser som inte anger något tls: avsnitt.
defaultSSLCertificate.keyVaultURI Azure Key Vault-URI:n där standard-SSL-certifikatet finns. Tillägget måste konfigureras för att använda nyckelvalvet.
defaultSSLCertificate.secret Konfigurerar namnet och namnområdet där standard-SSL-hemligheten finns i klustret.
defaultSSLCertificate.secret.name Namnet på hemligheten.
defaultSSLCertificate.secret.namespace Hemlighetens namnområde.

Vanliga konfigurationer

Kontrollera standardkonfigurationen för NGINX-ingresskontrollant (förhandsversion)

Kommentar

Att styra konfigurationen av NGINX-ingresskontrollanten när du aktiverar tillägget är tillgängligt i API 2024-06-02-preview, Kubernetes version 1.30 eller senare, och azure CLI-tilläggsversionen 7.0.0b5 aks-preview eller senare. Information om hur du kontrollerar aks-klusterversionen finns i Söka efter tillgängliga AKS-klusteruppgraderingar.

När du aktiverar tillägget för programdirigering med NGINX skapas en ingresskontrollant som anropas default i den app-routing-namespace konfigurerade med en offentlig Azure-lastbalanserare. Den inkommande kontrollanten använder ett ingressklassnamn på webapprouting.kubernetes.azure.com.

Du kan också styra om standardvärdet hämtar en offentlig eller en intern IP-adress, eller om den skapas alls när tillägget aktiveras.

Här är de möjliga konfigurationsalternativen:

  • None: Standard-Nginx-ingresskontrollanten skapas inte och tas inte bort om den redan finns. Användarna bör ta bort den anpassade standardresursen NginxIngressController manuellt om så önskas.
  • Internal: Standardingresskontrollanten för Nginx skapas med en intern lastbalanserare. Eventuella anteckningar som ändras på den anpassade resursen NginxIngressController för att göra den extern skrivs över.
  • External: Standardingresskontrollanten för Nginx som skapats med en extern lastbalanserare. Eventuella anteckningar som ändras på den anpassade resursen NginxIngressController för att göra den intern skrivs över.
  • AnnotationControlled (standard): Standardingresskontrollanten för Nginx skapas med en extern lastbalanserare. Användare kan redigera den anpassade standardresursen NginxIngressController för att konfigurera anteckningar för lastbalanserare.

Kontrollera standardkonfigurationen för ingresskontrollant när du skapar klustret

Om du vill aktivera programroutning i ett nytt kluster använder du az aks create kommandot och anger flaggorna --app-routing-default-nginx-controller --enable-app-routing och . Du måste ange <DefaultIngressControllerType> till något av konfigurationsalternativen som beskrevs tidigare.

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

Uppdatera standardkonfigurationen för ingresskontrollant i ett befintligt kluster

Om du vill uppdatera standardkonfigurationen för ingresskontrollanten för programroutning i ett befintligt kluster använder du az aks approuting update kommandot och anger --nginx flaggan. Du måste ange <DefaultIngressControllerType> till något av konfigurationsalternativen som beskrevs tidigare.

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

Skapa en annan offentlig NGINX-ingresskontrollant

Så här skapar du en annan NGINX-ingresskontrollant med en offentlig Azure Load Balancer:

  1. Kopiera följande YAML-manifest till en ny fil med namnet nginx-public-controller.yaml och spara filen på den lokala datorn.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-public
    spec:
      ingressClassName: nginx-public
      controllerNamePrefix: nginx-public
    
  2. Skapa NGINX-ingresskontrollantresurserna kubectl apply med kommandot .

    kubectl apply -f nginx-public-controller.yaml
    

    Följande exempelutdata visar den skapade resursen:

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

Skapa en intern NGINX-ingresskontrollant med en privat IP-adress

Så här skapar du en NGINX-ingresskontrollant med en intern Azure Load Balancer med en privat IP-adress:

  1. Kopiera följande YAML-manifest till en ny fil med namnet nginx-internal-controller.yaml och spara filen på den lokala datorn.

    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. Skapa NGINX-ingresskontrollantresurserna kubectl apply med kommandot .

    kubectl apply -f nginx-internal-controller.yaml
    

    Följande exempelutdata visar den skapade resursen:

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

Skapa en NGINX-ingresskontrollant med en statisk IP-adress

Så här skapar du en NGINX-ingresskontrollant med en statisk IP-adress i Azure Load Balancer:

  1. Skapa en Azure-resursgrupp med kommandot az group create .

    az group create --name myNetworkResourceGroup --location eastus
    
  2. Skapa en statisk offentlig IP-adress med kommandot az network public ip create .

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

    Kommentar

    Om du använder en Basic SKU-lastbalanserare i ditt AKS-kluster använder du Basic för parametern --sku när du definierar en offentlig IP-adress. Endast Basic SKU-IP-adresser fungerar med Basic SKU-lastbalanseraren och endast Standard SKU-IP-adresser fungerar med Standard SKU-lastbalanserare.

  3. Kontrollera att klusteridentiteten som används av AKS-klustret har delegerade behörigheter till den offentliga IP-adressens resursgrupp med hjälp av az role assignment create kommandot .

    Kommentar

    Uppdatera <ClusterName> och <ClusterResourceGroup> med AKS-klustrets namn och resursgruppsnamn.

    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. Kopiera följande YAML-manifest till en ny fil med namnet nginx-staticip-controller.yaml och spara filen på den lokala datorn.

    Kommentar

    Du kan antingen använda service.beta.kubernetes.io/azure-pip-name för offentligt IP-namn eller använda service.beta.kubernetes.io/azure-load-balancer-ipv4 för en IPv4-adress och service.beta.kubernetes.io/azure-load-balancer-ipv6 för en IPv6-adress, som du ser i exemplet YAML. Genom att lägga till anteckningen service.beta.kubernetes.io/azure-pip-name säkerställs att den mest effektiva LoadBalancer skapas och rekommenderas starkt för att undvika potentiella begränsningar.

    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. Skapa NGINX-ingresskontrollantresurserna kubectl apply med kommandot .

    kubectl apply -f nginx-staticip-controller.yaml
    

    Följande exempelutdata visar den skapade resursen:

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

Kontrollera att ingresskontrollanten har skapats

Du kan kontrollera statusen för NGINX-ingresskontrollanten kubectl get nginxingresscontroller med hjälp av kommandot .

Kommentar

Uppdatera <IngressControllerName> med det namn som du använde när du skapade NginxIngressController.

kubectl get nginxingresscontroller -n <IngressControllerName>

Följande exempelutdata visar den skapade resursen. Det kan ta några minuter innan kontrollanten är tillgänglig:

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

Du kan också visa villkoren för att felsöka eventuella problem:

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

Följande exempelutdata visar villkoren för en felfri ingresskontrollant:

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

Använda ingresskontrollanten i en ingress

  1. Kopiera följande YAML-manifest till en ny fil med namnet ingress.yaml och spara filen på den lokala datorn.

    Kommentar

    Uppdatera <Hostname> med dns-värdnamnet. <IngressClassName> är den som du definierade när du skapade 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. Skapa klusterresurserna kubectl apply med kommandot .

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

    Följande exempelutdata visar den skapade resursen:

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

Kontrollera att den hanterade ingressen har skapats

Du kan kontrollera att den hanterade ingressen har skapats med hjälp av kubectl get ingress kommandot .

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

Följande exempelutdata visar den skapade hanterade ingressen. Ingressklassen, värden och IP-adressen kan vara olika:

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

Rensa ingresskontrollanter

Du kan ta bort NGINX-ingresskontrollanten med hjälp av kubectl delete nginxingresscontroller kommandot .

Kommentar

Uppdatera <IngressControllerName> med det namn som du använde när du skapade NginxIngressController.

kubectl delete nginxingresscontroller -n <IngressControllerName>

Konfiguration per ingressresurs via anteckningar

NGINX-ingresskontrollanten har stöd för att lägga till anteckningar i specifika ingressobjekt för att anpassa deras beteende.

Du kan kommentera ingressobjektet genom att lägga till respektive anteckning i fältet metadata.annotations .

Kommentar

Anteckningsnycklar och värden kan bara vara strängar. Andra typer, till exempel booleska eller numeriska värden, måste anges, t.ex. "true", "false", "100".

Här följer några exempelanteckningar för vanliga konfigurationer. En fullständig lista finns i dokumentationen för NGINX-ingressanteckningar.

Anpassad maxstorlek för brödtext

För NGINX returneras ett 413-fel till klienten när storleken i en begäran överskrider den maximala tillåtna storleken på klientbegärandetexten. Om du vill åsidosätta standardvärdet använder du kommentaren:

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

Här är ett exempel på en ingresskonfiguration med den här kommentaren:

Kommentar

Uppdatera <Hostname> med dns-värdnamnet. <IngressClassName> är den som du definierade när du skapade 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

Tidsgräns för anpassad anslutning

Du kan ändra tidsgränsen som NGINX-ingresskontrollanten väntar på att stänga en anslutning till din arbetsbelastning. Alla timeout-värden är enhetslösa och i sekunder. Om du vill åsidosätta standardtimeouten använder du följande kommentar för att ange en giltig tidsgräns för 120 sekunders proxyläsning:

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

Granska anpassade tidsgränser för andra konfigurationsalternativ.

Här är ett exempel på en ingresskonfiguration med den här kommentaren:

Kommentar

Uppdatera <Hostname> med dns-värdnamnet. <IngressClassName> är den som du definierade när du skapade 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

Serverdelsprotokoll

Som standard använder HTTP NGINX-ingresskontrollanten för att nå tjänsterna. Om du vill konfigurera alternativa serverdelsprotokoll som HTTPS eller GRPCanvänder du anteckningen:

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

eller

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

Granska serverdelsprotokollen för andra konfigurationsalternativ.

Här är ett exempel på en ingresskonfiguration med den här kommentaren:

Kommentar

Uppdatera <Hostname> med dns-värdnamnet. <IngressClassName> är den som du definierade när du skapade 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

Resursdelning med flera ursprung (CORS)

Om du vill aktivera resursdelning mellan ursprung (CORS) i en ingressregel använder du kommentaren:

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

Läs aktivera CORS för andra konfigurationsalternativ.

Här är ett exempel på en ingresskonfiguration med den här kommentaren:

Kommentar

Uppdatera <Hostname> med dns-värdnamnet. <IngressClassName> är den som du definierade när du skapade 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

Inaktivera SSL-omdirigering

Som standard omdirigeras kontrollanten (308) till HTTPS om TLS är aktiverat för en ingress. Om du vill inaktivera den här funktionen för specifika ingressresurser använder du kommentaren:

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

Granska HTTPS-tillämpningen på serversidan genom omdirigering för andra konfigurationsalternativ.

Här är ett exempel på en ingresskonfiguration med den här kommentaren:

Kommentar

Uppdatera <Hostname> med dns-värdnamnet. <IngressClassName> är den som du definierade när du skapade 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-omskrivning

I vissa scenarier skiljer sig den exponerade URL:en i serverdelstjänsten från den angivna sökvägen i ingressregeln. Utan en omskrivning returnerar en begäran 404. Den här konfigurationen är användbar med sökvägsbaserad routning där du kan hantera två olika webbprogram under samma domän. Du kan ange sökvägen som förväntas av tjänsten med hjälp av kommentaren:

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

Här är ett exempel på en ingresskonfiguration med den här kommentaren:

Kommentar

Uppdatera <Hostname> med dns-värdnamnet. <IngressClassName> är den som du definierade när du skapade 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

Nästa steg

Lär dig mer om övervakning av ingress-nginx-kontrollantmåtten som ingår i tillägget för programroutning med Prometheus i Grafana som en del av analysen av programmets prestanda och användning.