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:
- Konfiguration av NGINX-ingresskontrollanten , till exempel att skapa flera styrenheter, konfigurera privata lastbalanserare och ange statiska IP-adresser.
- Konfiguration per ingressresurs via anteckningar.
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 kubectl
du 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 standardresursenNginxIngressController
manuellt om så önskas.Internal
: Standardingresskontrollanten för Nginx skapas med en intern lastbalanserare. Eventuella anteckningar som ändras på den anpassade resursenNginxIngressController
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 resursenNginxIngressController
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 standardresursenNginxIngressController
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:
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
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:
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"
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:
Skapa en Azure-resursgrupp med kommandot
az group create
.az group create --name myNetworkResourceGroup --location eastus
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.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}
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ändaservice.beta.kubernetes.io/azure-load-balancer-ipv4
för en IPv4-adress ochservice.beta.kubernetes.io/azure-load-balancer-ipv6
för en IPv6-adress, som du ser i exemplet YAML. Genom att lägga till anteckningenservice.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"
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
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 skapadeNginxIngressController
.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
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 GRPC
anvä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.
Azure Kubernetes Service