Contour è un controller in ingresso Kubernetes che utilizza il proxy inverso Envoy. Distribuire l'estensione TKG per Contour Ingress per esporre le route in ingresso ai servizi in esecuzione nei cluster di Tanzu Kubernetes.

Prerequisiti dell'estensione

In questo argomento viene descritto come distribuire l'estensione TKG v1.3.1 per Contour Ingress. Per la distribuzione dell'estensione, devono essere soddisfatti i requisiti seguenti.

Distribuzione dell'estensione Contour

L'estensione TKG per Contour Ingress installa due container nel cluster, ovvero Envoy e Contour. Per ulteriori informazioni, vedere https://projectcontour.io/.
Container Tipo di risorsa Repliche Descrizione
Envoy DaemonSet 3 Proxy inverso ad alte prestazioni
Contour Distribuzione 2 Server di gestione e configurazione per Envoy.
L'estensione è configurata per estrarre i container dal registro pubblico di VMware all'indirizzo https://projects.registry.vmware.com/. Se si utilizza un registro privato, modificare l'URL dell'endpoint nei valori dei dati e nelle configurazioni delle estensioni in modo che corrispondano. Vedere Configurazione dell'estensione Contour.
  1. Verificare che tutti i prerequisiti dell'estensione siano soddisfatti. Vedere Prerequisiti dell'estensione.
  2. Modificare la directory specificando quella in cui sono stati scaricati i file dell'estensione Contour.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/ingress/contour
  3. Eseguire il comando seguente per creare lo spazio dei nomi tanzu-system-ingress, l'account del servizio Contour e gli oggetti ruolo.
    kubectl apply -f namespace-role.yaml
  4. Creare un file di valori di dati Contour per vSphere.
    cp vsphere/contour-data-values-lb.yaml.example vsphere/contour-data-values.yaml
  5. Configurare Contour aggiornando il file vsphere/contour-data-values.yaml.

    Il file dei valori dei dati di esempio fornisce la configurazione minima richiesta. Per una descrizione di tutti i campi e le opzioni di configurazione, vedere Configurazione dell'estensione Contour.

    Ad esempio, la seguente configurazione di Contour per vSphere utilizza un servizio di tipo LoadBalancer.
    infrastructure_provider: "vsphere"
    contour:
      image:
        repository: projects.registry.vmware.com/tkg
    envoy:
      image:
        repository: projects.registry.vmware.com/tkg
        tag: v1.17.3_vmware.1
      service:
        type: "LoadBalancer"
    Nota: È consigliabile specificare la versione dell'immagine di Envoy v1.17.3_vmware.1 in modo in modo da non utilizzare la versione dell'immagine di Envoy v1.16.2_vmware.1 che ha un CVE. Per ulteriori informazioni, vedere le Note di rilascio.
  6. Creare un segreto con i valori dei dati.
    kubectl create secret generic contour-data-values --from-file=values.yaml=vsphere/contour-data-values.yaml -n tanzu-system-ingress
    secret/contour-data-values viene creato nello spazio dei nomi tanzu-system-ingress. Eseguire la verifica utilizzando il comando seguente:
    kubectl get secrets -n tanzu-system-ingress
  7. Distribuire l'app del controller Contour Ingress.
    kubectl apply -f contour-extension.yaml

    Al completamento, viene visualizzato il messaggio app.kappctrl.k14s.io/contour created.

  8. Controllare lo stato dell'app del controller Contour Ingress.
    kubectl get app contour -n tanzu-system-ingress
    Al completamento, lo stato passa da Reconciling a Reconcile succeeded. Se lo stato è Reconcile failed, vedere Risoluzione dei problemi relativi alla distribuzione di Contour Ingress.
  9. Visualizzare le informazioni dettagliate sull'app del controller Contour Ingress.
    kubectl get app contour -n tanzu-system-ingress -o yaml
  10. Visualizzare il servizio Envoy di tipo LoadBalancer.
    kubectl get service envoy -n tanzu-system-ingress -o wide
    Al completamento, dovrebbero essere visualizzati i dettagli di LoadBalancer di Envoy.
    NAME    TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE     SELECTOR
    envoy   LoadBalancer   10.79.65.110   10.178.147.73   80:30437/TCP,443:30589/TCP   2m42s   app=envoy,kapp.k14s.io/app=1629916985840017976
  11. Verificare il DaemonSet di Envoy.
    kubectl get daemonsets -n tanzu-system-ingress
    Al completamento, verrà visualizzato il DaemonSet di Envoy a 3 pod.
    NAME    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    envoy   3         3         3       3            3           <none>          6m10s
  12. Verificare la distribuzione di Contour.
    kubectl get deployments -n tanzu-system-ingress
    Una volta completata l'operazione, verrà visualizzata la distribuzione di Contour a 2 pod.
    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    contour   2/2     2            2           8m7s
  13. Verificare che il controller Contour Ingress sia installato correttamente e pronto per l'uso.
    kubectl get pod,svc -n tanzu-system-ingress
    Lo stato dei pod di Contour ed Envoy deve essere Running e il LoadBalancer per il servizio Envoy viene assegnato con un EXTERNAL-IP.
    NAME                           READY   STATUS    RESTARTS   AGE
    pod/contour-84bb5475cf-7h4cx   1/1     Running   0          9m52s
    pod/contour-84bb5475cf-v8k9r   1/1     Running   0          9m52s
    pod/envoy-4828j                2/2     Running   0          9m52s
    pod/envoy-c54dw                2/2     Running   0          9m52s
    pod/envoy-qpjqp                2/2     Running   0          9m52s
    
    NAME              TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
    service/contour   ClusterIP      10.105.6.207   <none>          8001/TCP                     9m52s
    service/envoy     LoadBalancer   10.79.65.110   10.178.147.73   80:30437/TCP,443:30589/TCP   9m52s

Risoluzione dei problemi relativi alla distribuzione di Contour Ingress

Se la distribuzione o la riconciliazione non riesce, eseguire kubectl get pods -n tanzu-system-ingress per visualizzare lo stato del pod. I pod di contour e envoy devono essere Running. Se lo stato di un pod è ImagePullBackOff o ImageCrashLoopBackOff, non è possibile estrarre l'immagine del container. Controllare l'URL del registro nei valori dei dati e nei file YAML dell'estensione e assicurarsi che sia corretto.

Controllare i registri del container, dove name-XXXX è il nome univoco del pod quando si esegue kubectl get pods -A:
kubectl logs pod/envoy-XXXXX -c envoy -n tanzu-system-ingress
 kubectl logs pod/contour-XXXXX -c contour -n tanzu-system-ingress

Se si nota che un pod di Contour è bloccato nello stato ContainerCreating senza che si verifichi uno degli errori dell'immagine precedenti e senza che il processo avanzi ("timeout dell'avanzamento di contour-xxxxx"), significa probabilmente che si è verificato un conflitto di indirizzi IP. Assicurarsi che l'intervallo CIDR dei nodi specificato quando è stata configurata la rete del carico di lavoro non sia in conflitto con l'intervallo CIDR dei pod nella specifica del cluster, che per impostazione predefinita è 192.168.0.0/16. Se si verifica un conflitto, aggiornare il cluster specificando una subnet di pod diversa o modificare la rete dei nodi.

Aggiornamento dell'estensione Contour

Aggiornare l'estensione Contour che viene distribuita in un cluster di Tanzu Kubernetes.

  1. Recuperare i valori dei dati di Contour dal segreto.
    kubectl get secret contour-data-values -n tanzu-system-ingress -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > contour-data-values.yaml
    
  2. Aggiornare i valori dei dati di Contour Ingress in ingress/contour/values.yaml. Vedere Configurazione dell'estensione Contour.
    Ad esempio, la seguente configurazione di Contour per vSphere utilizza un servizio di tipo LoadBalancer.
    infrastructure_provider: "vsphere"
    contour:
      image:
        repository: projects.registry.vmware.com/tkg
    envoy:
      image:
        repository: projects.registry.vmware.com/tkg
        tag: v1.17.3_vmware.1
      service:
        type: "LoadBalancer"
    Nota: È consigliabile specificare la versione dell'immagine di Envoy v1.17.3_vmware.1 in modo in modo da non utilizzare la versione dell'immagine di Envoy v1.16.2_vmware.1 che ha un CVE. Per ulteriori informazioni, vedere le Note di rilascio.
  3. Aggiornare il segreto dei valori dei dati di Contour.
    kubectl create secret generic contour-data-values --from-file=values.yaml=contour-data-values.yaml -n tanzu-system-ingress -o yaml --dry-run | kubectl replace -f-
    L'estensione Contour viene riconciliata con i nuovi valori dei dati.
    Nota: Per impostazione predefinita, kapp-controller sincronizzerà le app ogni 5 minuti. L'aggiornamento dovrebbe essere applicato in 5 minuti al massimo. Se si desidera che venga applicato immediatamente, impostare syncPeriod in contour-extension.yaml su un valore inferiore e ridistribuire l'estensione utilizzando kubectl apply -f contour-extension.yaml.
  4. Controllare lo stato dell'app
    kubectl get app contour -n tanzu-system-ingress

    Una volta aggiornato Contour, lo stato dovrebbe passare a Reconcile Succeeded.

  5. Visualizzare lo stato dettagliato.
    kubectl get app contour -n tanzu-system-ingress -o yaml
  6. Risolvere i problemi se necessario. Vedere Risoluzione dei problemi relativi alla distribuzione di Contour Ingress.

Eliminazione dell'estensione Contour

Eliminare l'estensione Contour da un cluster di Tanzu Kubernetes.

Nota: Completare i passaggi nell'ordine indicato. Non eliminare lo spazio dei nomi, l'account del servizio e gli oggetti ruolo prima dell'eliminazione completa dell'app del controller Contour Ingress. In caso contrario, possono verificarsi errori di sistema.
  1. Modificare la directory impostandola sull'estensione Contour.
    cd extensions/ingress/contour/
  2. Eliminare l'app del controller Contour Ingress.
    kubectl delete app contour -n tanzu-system-ingress

    Risultato previsto: app.kappctrl.k14s.io "contour" deleted.

  3. Verificare che l'app del controller Contour Ingress sia stata eliminata.
    kubectl get app contour -n tanzu-system-ingress

    Risultato previsto: apps.kappctrl.k14s.io "contour" not found.

  4. Eliminare lo spazio dei nomi tanzu-system-ingress, l'account del servizio estensione Contour e gli oggetti ruolo.
    kubectl delete -f namespace-role.yaml

Upgrade dell'estensione Contour

Se è già stata distribuita un'estensione Contour, è possibile eseguirne l'upgrade alla versione più recente.
  1. Esportare la mappa di configurazione di Contour e salvarla come backup.
    kubectl get configmap contour -n tanzu-system-ingress -o 'go-template={{ index .data "contour.yaml" }}' > contour-configmap.yaml
  2. Eliminare la distribuzione di Contour esistente. Vedere Eliminazione dell'estensione Contour.
  3. Distribuire l'estensione Contour più recente. Vedere Distribuzione dell'estensione Contour.

Configurazione dell'estensione Contour

I valori di configurazione del controller Contour Ingress sono impostati in /extensions/ingress/contour/vsphere/contour-data-values.yaml.
Tabella 1. Parametri di configurazione di Contour Ingress
Parametro Descrizione Tipo Predefinito
infrastructure_provider Provider dell'infrastruttura. Valori supportati: vsphere, aws, azure stringa Parametro obbligatorio
contour.namespace Spazio dei nomi in cui Contour verrà distribuito stringa tanzu-system-ingress
contour.config.requestTimeout Timeout della richiesta client da trasmettere a Envoy time.Duration 0s

Vedere Timeout della route per i download dei file.

contour.config.server.xdsServerType Tipo di server XDS da utilizzare. Valori supportati: contour o envoy stringa Null
contour.config.tls.minimumProtocolVersion Versione di TLS minima che Contour negozierà stringa 1.1
contour.config.tls.fallbackCertificate.name Nome del segreto contenente il certificato di fallback per le richieste che non corrispondono alla SNI definita per un vhost stringa Null
contour.config.tls.fallbackCertificate.namespace Spazio dei nomi del segreto contenente il certificato di fallback stringa Null
contour.config.tls.envoyClientCertificate.name Nome del segreto da utilizzare come certificato client, chiave privata per la connessione TLS al servizio di back-end stringa Null
contour.config.tls.envoyClientCertificate.namespace Spazio dei nomi del segreto da utilizzare come certificato client, chiave privata per la connessione TLS al servizio back-end stringa Null
contour.config.leaderelection.configmapName Nome della mappa di configurazione da utilizzare per leaderelection di Contour stringa leader-elect
contour.config.leaderelection.configmapNamespace Spazio dei nomi della mappa di configurazione leaderelection di Contour stringa tanzu-system-ingress
contour.config.disablePermitInsecure Disabilita il campo ingressroute permitInsecure booleano false
contour.config.accesslogFormat Formato del registro di accesso stringa envoy
contour.config.jsonFields Campi che verranno registrati array di stringhe https://godoc.org/github.com/projectcontour/contour/internal/envoy#JSONFields
contour.config.useProxyProtocol https://projectcontour.io/guides/proxy-proto/ booleano false
contour.config.defaultHTTPVersions Versioni HTTP per cui Contour deve programmare Envoy array di stringhe "HTTP/1.1 HTTP2"
contour.config.timeouts.requestTimeout Timeout per un'intera richiesta time.Duration Null (il timeout è disabilitato)
contour.config.timeouts.connectionIdleTimeout Tempo di attesa prima della terminazione di una connessione inattiva time.Duration 60s
contour.config.timeouts.streamIdleTimeout Tempo di attesa prima della terminazione di una richiesta o di un flusso senza attività time.Duration 5m
contour.config.timeouts.maxConnectionDuration Tempo di attesa prima che la connessione venga terminata, indipendentemente dall'attività o meno time.Duration Null (il timeout è disabilitato)
contour.config.timeouts.ConnectionShutdownGracePeriod Tempo di attesa tra l'invio di un GOAWAY iniziale e finale time.Duration 5s
contour.config.cluster.dnsLookupFamily dns-lookup-family da utilizzare per le richieste upstream ai servizi di tipo externalName da una route HTTPProxy stringa Null (valori supportati: auto, v4, v6)
contour.config.debug Attiva il debug di Contour booleano false
contour.config.ingressStatusAddress Indirizzo da impostare sullo stato di ogni risorsa in ingresso stringa Null
contour.certificate.duration Durata certificato root time.Duration 8760h
contour.certificate.renewBefore Data prima della quale è necessario rinovare il certificato di Contour time.Duration 360h
contour.deployment.replicas Numero di repliche di Contour numero intero 2
contour.image.repository Posizione del repository con l'immagine di Contour. L'impostazione predefinita è il registro di VMware pubblico. Modificare questo valore se si utilizza un repository privato (ad esempio, un ambiente air gap). stringa projects.registry.vmware.com/tkg
contour.image.name Nome dell'immagine di Contour stringa contour
contour.image.tag Tag dell'immagine di Contour. Potrebbe essere necessario aggiornare questo valore se si esegue l'aggiornamento della versione di Contour. stringa v1.11.0_vmware.1
contour.image.pullPolicy Criterio di pull dell'immagine di Contour stringa IfNotPresent
envoy.image.repository Posizione del repository con l'immagine di Envoy. L'impostazione predefinita è il registro di VMware pubblico. Modificare questo valore se si utilizza un repository privato (ad esempio, un ambiente air gap). stringa projects.registry.vmware.com/tkg
envoy.image.name Nome dell'immagine di Envoy stringa envoy
envoy.image.tag Tag dell'immagine di Envoy. Potrebbe essere necessario aggiornare questo valore se si esegue l'aggiornamento della versione di Envoy. stringa

v1.17.3_vmware.1

Nota: Non utilizzare l'immagine di Envoy v1.16.2_vmware.1 a causa di un CVE. Per ulteriori informazioni, vedere le Note di rilascio.
envoy.image.pullPolicy Criterio di pull dell'immagine di Envoy stringa IfNotPresent
envoy.hostPort.enable Contrassegno per esporre le porte di Envoy nell'host booleano true
envoy.hostPort.http Porta dell'host HTTP di Envoy numero intero 80
envoy.hostPort.https Porta dell'host HTTPS di Envoy numero intero 443
envoy.service.type Tipo di servizio per esporre Envoy. Valori supportati: ClusterIP, NodePort, LoadBalancer stringa Parametro obbligatorio per vSphere: NodePort o LoadBalancer, AWS: LoadBalancer, Azure: LoadBalancer
envoy.service.annotations Annotazioni del servizio Envoy Mappa (valori chiave) Mappa vuota
envoy.service.externalTrafficPolicy Criterio del traffico esterno del servizio Envoy. Valori supportati: Local, Cluster stringa Cluster
envoy.service.nodePort.http Valore di NodePort desiderato per il servizio di tipo NodePort utilizzato per le richieste HTTP numero intero Null - Kubernetes assegna una porta del nodo dinamico
envoy.service.nodePort.https Valore di NodePort desiderato per il servizio di tipo NodePort utilizzato per le richieste HTTPS numero intero Null - Kubernetes assegna una porta del nodo dinamico
envoy.deployment.hostNetwork Eseguire Envoy in hostNetwork booleano false
envoy.service.aws.LBType Tipo di AWS LB da utilizzare per esporre il servizio Envoy. Valori supportati: classic, nlb stringa classic
envoy.loglevel Livello di registrazione da utilizzare per Envoy stringa info

Timeout della route per i download dei file

Il parametro contour.config.requestTimeout definisce il timeout della route di Contour. Il valore predefinito è 0s. Questa impostazione è appropriata per la maggior parte dei casi d'uso. Tuttavia, se si sta tentando di utilizzare Contour con Envoy per il trasferimento dei file, questo valore richiede ulteriori spiegazioni.

In base alla documentazione di Contour, un valore di timeout di 0s verrà considerato come se il campo non fosse impostato. In altre parole, Contour si rimetterà a Envoy e utilizzerà il suo comportamento predefinito. In base alla documentazione di Envoy, per impostazione predefinita il timeout di Envoy è di 15 secondi. Envoy si aspetta inoltre che l'intera operazione di richiesta-risposta venga completata entro 15 secondi. Per trasferimenti di file di grandi dimensioni, questo tempo potrebbe non essere sufficiente. Per disabilitare il timeout di Envoy, impostare il valore di contour.config.requestTimeout su 0.