Condividi tramite


Annotazioni per il Controller in ingresso del gateway applicazione

La risorsa ingresso Kubernetes può essere annotata con coppie chiave/valore arbitrarie. Il controller in ingresso del gateway applicazione (Application Gateway Ingress Controller, AGIC) si basa sulle annotazioni per programmare le funzionalità del gateway applicazione di Azure che non sono configurabili tramite YAML in ingresso. Le annotazioni in ingresso vengono applicate a tutte le impostazioni HTTP, i pool back-end e i listener derivati da una risorsa di ingresso.

Elenco di annotazioni supportate

Affinché AGIC osservi una risorsa in ingresso, la risorsa deve essere annotata con kubernetes.io/ingress.class: azure/application-gateway.

Chiave di annotazione Tipo di valore Default value Valori consentiti
appgw.ingress.kubernetes.io/backend-path-prefix string nil
appgw.ingress.kubernetes.io/backend-hostname string nil
appgw.ingress.kubernetes.io/health-probe-hostname string 127.0.0.1
appgw.ingress.kubernetes.io/health-probe-port int32 80
appgw.ingress.kubernetes.io/health-probe-path string /
appgw.ingress.kubernetes.io/health-probe-status-code string 200-399
appgw.ingress.kubernetes.io/health-probe-interval int32 30 (secondi)
appgw.ingress.kubernetes.io/health-probe-timeout int32 30 (secondi)
appgw.ingress.kubernetes.io/health-probe-unhealthy-threshold int32 3
appgw.ingress.kubernetes.io/ssl-redirect bool false
appgw.ingress.kubernetes.io/connection-draining bool false
appgw.ingress.kubernetes.io/connection-draining-timeout int32 (secondi) 30
appgw.ingress.kubernetes.io/use-private-ip bool false
appgw.ingress.kubernetes.io/override-frontend-port bool false
appgw.ingress.kubernetes.io/cookie-based-affinity bool false
appgw.ingress.kubernetes.io/request-timeout int32 (secondi) 30
appgw.ingress.kubernetes.io/use-private-ip bool false
appgw.ingress.kubernetes.io/backend-protocol string http http, https
appgw.ingress.kubernetes.io/hostname-extension string nil
appgw.ingress.kubernetes.io/waf-policy-for-path string nil
appgw.ingress.kubernetes.io/appgw-ssl-certificate string nil
appgw.ingress.kubernetes.io/appgw-ssl-profile string nil
appgw.ingress.kubernetes.io/appgw-trusted-root-certificate string nil
appgw.ingress.kubernetes.io/rewrite-rule-set string nil
appgw.ingress.kubernetes.io/rewrite-rule-set-custom-resource
appgw.ingress.kubernetes.io/rule-priority int32 nil

Prefisso del percorso back-end

L'annotazione seguente consente di riscrivere il percorso back-end specificato in una risorsa in ingresso con il prefisso specificato. Usare ciò per esporre i servizi i cui endpoint sono diversi dai nomi degli endpoint usati per esporre un servizio in una risorsa di ingresso.

Utilizzo

appgw.ingress.kubernetes.io/backend-path-prefix: <path prefix>

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-bkprefix
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-path-prefix: "/test/"
spec:
  rules:
  - http:
      paths:
      - path: /hello/
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 80

L'esempio precedente definisce una risorsa di ingresso denominata go-server-ingress-bkprefix con un'annotazione denominata appgw.ingress.kubernetes.io/backend-path-prefix: "/test/". L'annotazione indica al gateway applicazione di creare un'impostazione HTTP con un override del prefisso del percorso per il percorso da /hello a /test/.

L'esempio definisce una sola regola. Tuttavia, le annotazioni si applicano all'intera risorsa di ingresso. Pertanto, se si definiscono più regole, si configura il prefisso del percorso back-end per ognuno dei percorsi specificati. Se si vogliono regole diverse con prefissi di percorso diversi (persino per lo stesso servizio), è necessario definire risorse di ingresso diverse.

Nome host back-end

Usare l’annotazione seguente per specificare il nome host che il gateway applicazione deve usare durante la comunicazione con i pod.

Utilizzo

appgw.ingress.kubernetes.io/backend-hostname: "internal.example.com"

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-timeout
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-hostname: "internal.example.com"
spec:
  rules:
  - http:
      paths:
      - path: /hello/
        backend:
          service:
            name: store-service
            port:
              number: 80
        pathType: Exact

Probe di integrità personalizzato

È possibile configurare il gateway applicazione per inviare probe di integrità personalizzati al pool di indirizzi back-end. Quando sono presenti le annotazioni seguenti, il controller di ingresso Kubernetes crea un probe personalizzato per monitorare l'applicazione back-end. Il controller applica quindi le modifiche al gateway applicazione.

  • health-probe-hostname: questa annotazione consente un nome host personalizzato nel probe di integrità.
  • health-probe-port: questa annotazione configura una porta personalizzata per il probe di integrità.
  • health-probe-path: questa annotazione definisce un percorso per il probe di integrità.
  • health-probe-status-code: questa annotazione consente al probe di integrità di accettare codici di stato HTTP diversi.
  • health-probe-interval: questa annotazione definisce l'intervallo in cui viene eseguito il probe di integrità.
  • health-probe-timeout: questa annotazione definisce per quanto tempo il probe di integrità attende una risposta prima dell'esito negativo del probe.
  • health-probe-unhealthy-threshold: questa annotazione definisce il numero di probe di integrità che devono avere esito negativo affinché il back-end venga contrassegnato come non integro.

Utilizzo

appgw.ingress.kubernetes.io/health-probe-hostname: "contoso.com"
appgw.ingress.kubernetes.io/health-probe-port: 80
appgw.ingress.kubernetes.io/health-probe-path: "/"
appgw.ingress.kubernetes.io/health-probe-status-code: "100-599"
appgw.ingress.kubernetes.io/health-probe-interval: 30
appgw.ingress.kubernetes.io/health-probe-timeout: 30
appgw.ingress.kubernetes.io/health-probe-unhealthy-threshold: 2

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/health-probe-hostname: "contoso.com"
    appgw.ingress.kubernetes.io/health-probe-port: 81
    appgw.ingress.kubernetes.io/health-probe-path: "/probepath"
    appgw.ingress.kubernetes.io/health-probe-status-code: "100-599"
    appgw.ingress.kubernetes.io/health-probe-interval: 31
    appgw.ingress.kubernetes.io/health-probe-timeout: 31
    appgw.ingress.kubernetes.io/health-probe-unhealthy-threshold: 2
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 80

Reindirizzamento TLS

È possibile configurare il gateway applicazione per reindirizzare automaticamente gli URL HTTP alle controparti HTTPS. Quando questa annotazione è presente e TLS è configurato correttamente, il controller di ingresso Kubernetes crea una regola di gestione con una configurazione di reindirizzamento. Il controller applica quindi le modifiche all'istanza del gateway applicazione. Il reindirizzamento creato è HTTP 301 Moved Permanently.

Utilizzo

appgw.ingress.kubernetes.io/ssl-redirect: "true"

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-redirect
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
   - hosts:
     - www.contoso.com
     secretName: testsecret-tls
  rules:
  - host: www.contoso.com
    http:
      paths:
      - backend:
          service:
            name: websocket-repeater
            port:
              number: 80

Svuotamento delle connessioni

Usare le annotazioni seguenti se si vuole usare lo svuotamento della connessione:

  • connection-draining: questa annotazione specifica se abilitare lo svuotamento della connessione.
  • connection-draining-timeout: questa annotazione specifica un timeout, dopo il quale il gateway applicazione termina le richieste all'endpoint back-end di svuotamento.

Utilizzo

appgw.ingress.kubernetes.io/connection-draining: "true"
appgw.ingress.kubernetes.io/connection-draining-timeout: "60"

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-drain
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/connection-draining: "true"
    appgw.ingress.kubernetes.io/connection-draining-timeout: "60"
spec:
  rules:
  - http:
      paths:
      - path: /hello/
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 80

Usare l'annotazione seguente per abilitare l'affinità basata su cookie.

Utilizzo

appgw.ingress.kubernetes.io/cookie-based-affinity: "true"

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-affinity
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/cookie-based-affinity: "true"
spec:
  rules:
  - http:
      paths:
      - path: /hello/
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 80

Timeout richiesta

Usare l'annotazione seguente per specificare il timeout della richiesta in secondi. Dopo il timeout, il gateway applicazione fallisce nel caso di richiesta se la risposta non viene ricevuta.

Utilizzo

appgw.ingress.kubernetes.io/request-timeout: "20"

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-timeout
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/request-timeout: "20"
spec:
  rules:
  - http:
      paths:
      - path: /hello/
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 80

Usare l'indirizzo IP privato

Usare l'annotazione seguente per specificare se esporre questo endpoint in un indirizzo IP privato del gateway applicazione.

Per un'istanza del gateway applicazione che non dispone di un indirizzo IP privato, i dati in ingresso con appgw.ingress.kubernetes.io/use-private-ip: "true" vengono ignorati. I log del controller e gli eventi di ingresso per tali dati in ingresso visualizzano un avviso NoPrivateIP.

Utilizzo

appgw.ingress.kubernetes.io/use-private-ip: "true"

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-privateip
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/use-private-ip: "true"
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 80

Eseguire l'override della porta front-end

Usare l'annotazione seguente per configurare un listener front-end per usare porte diverse da 80 per HTTP e 443 per HTTPS.

Se la porta è compresa nell'intervallo autorizzato del gateway applicazione (da 1 a 64999), il listener viene creato su questa porta specifica. Se si imposta una porta non valida o nessuna porta nell'annotazione, la configurazione usa il valore predefinito 80 o 443.

Utilizzo

appgw.ingress.kubernetes.io/override-frontend-port: "port"

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-overridefrontendport
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/override-frontend-port: "8080"
spec:
  rules:
  - http:
      paths:
      - path: /hello/
        backend:
          service:
            name: store-service
            port:
              number: 80
        pathType: Exact

Nota

La richiesta esterna devono avere come destinazione http://somehost:8080 anziché http://somehost.

Protocollo back-end

Usare quanto segue per specificare il protocollo che il gateway applicazione deve usare quando comunica con i pod. I protocolli supportati sono HTTP e HTTPS.

Anche se i certificati autofirmati sono supportati nel gateway applicazione, AGIC supporta attualmente HTTPS solo quando i pod usano un certificato firmato da un'autorità di certificazione nota.

Non usare la porta 80 con HTTPS e la porta 443 con HTTP nei pod.

Utilizzo

appgw.ingress.kubernetes.io/backend-protocol: "https"

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-timeout
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-protocol: "https"
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 443

Estensione del nome host

È possibile configurare il gateway applicazione per accettare più nomi host. Usare l'annotazione hostname-extension per definire più nomi host, inclusi i nomi host con caratteri jolly. Questa azione aggiunge i nomi host all'FQDN definito nelle informazioni spec.rules.host di ingresso sul listener frontend, quindi questo è configurato come un listener multisito.

Utilizzo

appgw.ingress.kubernetes.io/hostname-extension: "hostname1, hostname2"

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-multisite
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/hostname-extension: "hostname1, hostname2"
spec:
  rules:
  - host: contoso.com
    http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 443

L'esempio precedente configura il listener per accettare il traffico per i nomi host hostname1.contoso.com e hostname2.contoso.com.

Criterio WAF per il percorso

Usare l'annotazione seguente per collegare un criterio web application firewall (WAF) esistente ai percorsi di elenco per un host all'interno di una risorsa di ingresso Kubernetes annotata. I criteri WAF vengono applicati agli URL /ad-server e /auth.

Utilizzo

appgw.ingress.kubernetes.io/waf-policy-for-path: "/subscriptions/aaaa0000-bb11-2222-33cc-444444dddddd/resourceGroups/SampleRG/providers/Microsoft.Network/applicationGatewayWebApplicationFirewallPolicies/AGICWAFPolcy"

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ad-server-ingress
  namespace: commerce
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/waf-policy-for-path: "/subscriptions/abcd/resourceGroups/rg/providers/Microsoft.Network/applicationGatewayWebApplicationFirewallPolicies/adserver"
spec:
  rules:
  - http:
      paths:
      - path: /ad-server
        backend:
          service:
            name: ad-server
            port:
              number: 80
        pathType: Exact
      - path: /auth
        backend:
          service:
            name: auth-server
            port:
              number: 80
        pathType: Exact

Certificato SSL del gateway applicazione

È possibile configurare il certificato SSL nel gateway applicazione da un file di certificato PFX locale o da un riferimento a un ID segreto non modificato di Azure Key Vault. Quando l'annotazione è presente con un nome certificato e il certificato è preinstallato nel gateway applicazione, il controller di ingresso Kubernetes crea una regola di gestione con un listener HTTPS e applica le modifiche all'istanza del gateway applicazione. È anche possibile usare l'annotazione appgw-ssl-certificate insieme a un'annotazione ssl-redirect nel caso di un reindirizzamento SSL.

Nota

L'annotazione appgw-ssl-certificate viene ignorata quando la specifica TLS viene definita contemporaneamente in ingresso. Se si vogliono certificati diversi con host diversi (terminazione di più certificati TLS), è necessario definire risorse di ingresso diverse.

Utilizzo

appgw.ingress.kubernetes.io/appgw-ssl-certificate: "name-of-appgw-installed-certificate"

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-certificate
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/appgw-ssl-certificate: "name-of-appgw-installed-certificate"
spec:
  rules:
  - host: www.contoso.com
    http:
      paths:
      - backend:
          service:
            name: websocket-repeater
            port:
              number: 80

Profilo SSL del gateway applicazione

È possibile configurare un profilo SSL nell'istanza del gateway applicazione per ogni listener. Quando l'annotazione è presente con un nome del profilo e il profilo è preinstallato nel gateway applicazione, il controller in ingresso Kubernetes crea una regola di gestione con un listener HTTPS e applica le modifiche all'istanza del gateway applicazione.

Utilizzo

appgw.ingress.kubernetes.io/appgw-ssl-certificate: "name-of-appgw-installed-certificate"
appgw.ingress.kubernetes.io/appgw-ssl-profile: "SampleSSLProfile"

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-certificate
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/appgw-ssl-certificate: "name-of-appgw-installed-certificate"
    appgw.ingress.kubernetes.io/appgw-ssl-profile: "SampleSSLProfile"
spec:
  rules:
  - host: www.contoso.com
    http:
      paths:
      - backend:
          service:
            name: websocket-repeater
            port:
              number: 80

Certificato radice trusted del gateway applicazione

Ora è possibile configurare i propri certificati radice nel gateway applicazione in modo che siano attendibili tramite AGIC. È possibile usare l'annotazione appgw-trusted-root-certificate insieme all'annotazione backend-protocol per indicare la crittografia SSL end-to-end. Se si specificano più certificati radice, separarli con una virgola, ad esempio name-of-my-root-cert1,name-of-my-root-cert2.

Utilizzo

appgw.ingress.kubernetes.io/backend-protocol: "https"
appgw.ingress.kubernetes.io/appgw-trusted-root-certificate: "name-of-my-root-cert1"

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-certificate
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-protocol: "https"
    appgw.ingress.kubernetes.io/appgw-trusted-root-certificate: "name-of-my-root-cert1"
spec:
  rules:
  - host: www.contoso.com
    http:
      paths:
      - backend:
          service:
            name: websocket-repeater
            port:
              number: 80

Riscrivere il set di regole

Usare l’annotazione seguente per assegnare un set di regole di riscrittura esistente alla regola di gestione della richiesta corrispondente.

Utilizzo

appgw.ingress.kubernetes.io/rewrite-rule-set: <rewrite rule set name>

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-bkprefix
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/rewrite-rule-set: add-custom-response-header
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 8080

Riscrivere una risorsa personalizzata del set di regole

Nota

Il rilascio di Gateway applicativo per contenitori introduce numerose modifiche a prestazioni, resilienza e funzionalità. Prendere in considerazione l'uso del Gateway applicativo per contenitori per la distribuzione successiva.

È possibile trovare regole di riscrittura URL per il Gateway applicativo per contenitori in questo articolo sull’API gateway e questo articolo sull'API In ingresso. È possibile trovare le regole di riscrittura delle intestazioni per il Gateway applicativo per contenitori in questo articolo sull'API gateway.

Il gateway applicazione consente di riscrivere il contenuto selezionato di richieste e risposte. Con questa funzionalità è possibile tradurre gli URL, modificare i parametri della stringa di query e modificare le intestazioni di richiesta e risposta. Inoltre è possibile usare questa funzionalità per aggiungere condizioni per assicurarsi che l'URL o le intestazioni specificate vengano riscritte solo quando vengono soddisfatte determinate condizioni. La riscrittura della risorsa personalizzata del set di regole porta questa funzionalità in AGIC.

Le intestazioni HTTP consentono al client e al server di passare informazioni aggiuntive insieme a una richiesta o a una risposta. Riscrivendo queste intestazioni, è possibile eseguire attività importanti come l'aggiunta di campi di intestazione correlati alla sicurezza (ad esempio, HSTS o X-XSS-Protection), rimuovendo i campi di intestazione della risposta che potrebbero rivelare informazioni riservate e rimuovendo le informazioni sulla porta dalle intestazioni X-Forwarded-For.

Con la funzionalità di riscrittura URL, è possibile:

  • Riscrivere il nome host, il percorso e la stringa di query dell'URL della richiesta.
  • Scegliere di riscrivere l'URL di tutte le richieste o solo le richieste che corrispondono a una o più delle condizioni impostate. Queste condizioni sono basate sulle proprietà della richiesta e della risposta (intestazione della richiesta, intestazione della risposta e variabili del server).
  • Scegliere di instradare la richiesta in base all'URL originale o all'URL riscritto

Nota

Questa funzionalità è supportata a partire da 1.6.0-rc1. Usare appgw.ingress.kubernetes.io/rewrite-rule-set, che consente l'uso di un set di regole di riscrittura esistente nel gateway applicazione.

Utilizzo

appgw.ingress.kubernetes.io/rewrite-rule-set-custom-resource

Esempio

apiVersion: appgw.ingress.azure.io/v1beta1 
kind: AzureApplicationGatewayRewrite 
metadata: 
  name: my-rewrite-rule-set-custom-resource 
spec: 
  rewriteRules: 
  - name: rule1 
    ruleSequence: 21
    conditions:
  - ignoreCase: false
    negate: false
    variable: http_req_Host
    pattern: example.com
  actions:
    requestHeaderConfigurations:
    - actionType: set
      headerName: incoming-test-header
      headerValue: incoming-test-value
    responseHeaderConfigurations:
    - actionType: set
      headerName: outgoing-test-header
      headerValue: outgoing-test-value
    urlConfiguration:
      modifiedPath: "/api/"
      modifiedQueryString: "query=test-value"
      reroute: false

Priorità delle regole

L'annotazione seguente consente al controller di ingresso del gateway applicazione di impostare in modo esplicito la priorità delle regole di gestone delle richieste associate.

Utilizzo

appgw.ingress.kubernetes.io/rule-priority:

Esempio

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-server-ingress-rulepriority
  namespace: test-ag
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/rule-priority: 10
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: go-server-service
            port:
              number: 8080

Nell'esempio precedente viene impostata una priorità pari a 10 per la regola di gestione della richiesta.