En este tema se describe cómo implementar la extensión TKG v1.3.1 para la entrada de Contour. Contour es un controlador de entrada de Kubernetes que utiliza el proxy inverso Envoy. Implemente la extensión TKG para la entrada de Contour a la hora de exponer las rutas de entrada a los servicios que se ejecutan en los clústeres de Tanzu Kubernetes.

Requisitos previos de la extensión

Cumpla los siguientes requisitos para implementar la extensión TKG v1.3.1 para la entrada de Contour.

Implementar la extensión Contour

La extensión TKG para la entrada de Contour instala dos contenedores en el clúster: Envoy y Contour. Para obtener más información, consulte https://projectcontour.io/.
Contenedor Tipo de recurso Réplicas Descripción
Envoy DaemonSet 3 Proxy inverso de alto rendimiento
Contour Implementación 2 Servidor de administración y configuración para Envoy
La extensión está configurada para extraer los contenedores del registro público de VMware en https://projects.registry.vmware.com/. Si utiliza un registro privado, cambie la URL del endpoint en los valores de datos y las configuraciones de extensión para que coincidan. Consulte Configurar la extensión Contour.
  1. Asegúrese de haber completado cada uno de los requisitos previos de la extensión. Consulte Requisitos previos de la extensión.
  2. Cambie el directorio en el que descargó los archivos de la extensión Contour.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/ingress/contour
  3. Ejecute el siguiente comando para crear el espacio de nombres tanzu-system-ingress, así como los objetos de función y la cuenta de servicio de Contour.
    kubectl apply -f namespace-role.yaml
  4. Cree un archivo de valores de datos de Contour para vSphere.
    cp vsphere/contour-data-values-lb.yaml.example vsphere/contour-data-values.yaml
  5. Para configurar Contour, actualice el archivo vsphere/contour-data-values.yaml.

    El archivo de valores de datos de ejemplo proporciona la configuración mínima requerida. Consulte Configurar la extensión Contour para ver una descripción de todos los campos y las opciones de configuración.

    Por ejemplo, la siguiente configuración de Contour para vSphere utiliza un servicio de 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: Se recomienda especificar la versión de imagen de Envoy v1.17.3_vmware.1 para no utilizar la versión de imagen de Envoy v1.16.2_vmware.1, la cual tiene un CVE. Para obtener más información, consulte las Notas de la versión.
  6. Cree un secreto con los valores de datos.
    kubectl create secret generic contour-data-values --from-file=values.yaml=vsphere/contour-data-values.yaml -n tanzu-system-ingress
    secret/contour-data-values se crea en el espacio de nombres tanzu-system-ingress. Verifique con el siguiente comando:
    kubectl get secrets -n tanzu-system-ingress
  7. Implemente la aplicación del controlador de entrada de Contour.
    kubectl apply -f contour-extension.yaml

    Si todo es correcto, debería ver app.kappctrl.k14s.io/contour created.

  8. Compruebe el estado de la aplicación del controlador de ingreso de Contour.
    kubectl get app contour -n tanzu-system-ingress
    Si es correcto, el estado cambia de Reconciling a Reconcile succeeded. Si el estado es Reconcile failed, consulte Solucionar problemas de implementación de entrada de Contour.
  9. Vea más detalles sobre la aplicación del controlador de entrada de Contour.
    kubectl get app contour -n tanzu-system-ingress -o yaml
  10. Vea el servicio Envoy de tipo LoadBalancer.
    kubectl get service envoy -n tanzu-system-ingress -o wide
    Si es correcto, debería ver los detalles de Envoy LoadBalancer.
    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. Compruebe el DaemonSet de Envoy.
    kubectl get daemonsets -n tanzu-system-ingress
    Si es correcto, debería ver el DaemonSet de Envoy de 3 pods.
    NAME    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    envoy   3         3         3       3            3           <none>          6m10s
  12. Compruebe la implementación de Contour.
    kubectl get deployments -n tanzu-system-ingress
    Si es correcto, debería ver la implementación de Contour de 2 pods.
    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    contour   2/2     2            2           8m7s
  13. Compruebe que el controlador de entrada de Contour esté instalado correctamente y listo para poder usarlo.
    kubectl get pod,svc -n tanzu-system-ingress
    El estado de los pods de Contour y Envoy debe ser Running, y LoadBalancer para el servicio Envoy se asigna con una 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

Solucionar problemas de implementación de entrada de Contour

Si se produce un error en la implementación o la reconciliación, ejecute kubectl get pods -n tanzu-system-ingress para ver el estado del pod. El de los pods contour y envoy debe ser Running. Si el estado de un pod es ImagePullBackOff o ImageCrashLoopBackOff, no se podrá extraer la imagen del contenedor. Compruebe la URL del registro en los valores de datos y los archivos YAML de extensión, y asegúrese de que sean precisos.

Compruebe los registros del contenedor, en los que name-XXXX es el nombre único del pod cuando ejecuta 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

Si ve que un pod de Contour está bloqueado en un estado ContainerCreating sin generar ninguno de los errores de imagen anteriores y no muestra ningún progreso ("contour-xxxxx ha agotado el tiempo de espera para seguir progresando"), es probable que haya un conflicto con la dirección IP. Asegúrese de que el rango de CIDR de los nodos que especificó al configurar la red de carga de trabajo no entre en conflicto con el rango de CIDR de los pods en la especificación del clúster, el cual es de forma predeterminada 192.168.0.0/16. Si hay un conflicto, actualice el clúster con una subred de pods diferente o cambie la red de nodos.

Actualizar la extensión Contour

Actualice la extensión de Contour que está implementada en el clúster de Tanzu Kubernetes.

  1. Obtenga los valores de datos de Contour del secreto.
    kubectl get secret contour-data-values -n tanzu-system-ingress -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > contour-data-values.yaml
    
  2. Actualice los valores de datos de entrada de Contour en ingress/contour/values.yaml. Consulte Configurar la extensión Contour.
    Por ejemplo, la siguiente configuración de Contour para vSphere utiliza un servicio de 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: Se recomienda especificar la versión de imagen de Envoy v1.17.3_vmware.1 para no utilizar la versión de imagen de Envoy v1.16.2_vmware.1, la cual tiene un CVE. Para obtener más información, consulte las Notas de la versión.
  3. Actualice el secreto de los valores de datos de 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-
    La extensión Contour se conciliará entonces con los nuevos valores de datos.
    Nota: De forma predeterminada, kapp-controller sincronizará las aplicaciones cada 5 minutos. La actualización debería tener efecto en 5 minutos o menos. Si desea que se aplique inmediatamente, cambie los valores de syncPeriod en contour-extension.yaml a un valor menor y vuelva a implementar la extensión mediante kubectl apply -f contour-extension.yaml.
  4. Compruebe el estado de la aplicación.
    kubectl get app contour -n tanzu-system-ingress

    El estado debe cambiar a Reconcile Succeeded una vez que Contour se actualice.

  5. Ver estado detallado.
    kubectl get app contour -n tanzu-system-ingress -o yaml
  6. Solucione los problemas en caso necesario. Consulte Solucionar problemas de implementación de entrada de Contour.

Eliminar la extensión de extensión Contour

Elimine la extensión Contour de un clúster de Tanzu Kubernetes.

Nota: Complete los pasos en orden. No elimine el espacio de nombres, la cuenta de servicio ni los objetos de función antes de eliminar totalmente la aplicación del controlador de entrada de Contour. De lo contrario, podría provocar errores en el sistema.
  1. Cambie el directorio a la extensión Contour.
    cd extensions/ingress/contour/
  2. Elimine la aplicación del controlador de entrada de Contour.
    kubectl delete app contour -n tanzu-system-ingress

    Resultado esperado: app.kappctrl.k14s.io "contour" deleted.

  3. Compruebe que la aplicación del controlador de entrada de Contour se haya eliminado.
    kubectl get app contour -n tanzu-system-ingress

    Resultado esperado: apps.kappctrl.k14s.io "contour" not found.

  4. Elimine el espacio de nombres tanzu-system-ingress, así como los objetos de función y la cuenta de servicio de la extensión Contour.
    kubectl delete -f namespace-role.yaml

Actualizar la extensión Contour

Si tiene una extensión de Contour existente implementada, puede actualizarla a la versión más reciente.
  1. Exporte el mapa de configuración de Contour y guárdelo como copia de seguridad.
    kubectl get configmap contour -n tanzu-system-ingress -o 'go-template={{ index .data "contour.yaml" }}' > contour-configmap.yaml
  2. Elimine la implementación de Contour existente. Consulte Eliminar la extensión de extensión Contour.
  3. Implemente la última extensión Contour. Consulte Implementar la extensión Contour.

Configurar la extensión Contour

Los valores de configuración del controlador de entrada de Contour se establecen en /extensions/ingress/contour/vsphere/contour-data-values.yaml.
Tabla 1. Parámetros de configuración de entrada de Contour
Parámetro Descripción Tipo Predeterminado
infrastructure_provider Proveedor de infraestructura. Valores admitidos: vsphere, aws, azure string Parámetro obligatorio
contour.namespace Espacio de nombres en el que se implementará Contour string tanzu-system-ingress
contour.config.requestTimeout Tiempo de espera de solicitud del cliente que se debe pasar a Envoy time.Duration 0s

Consulte Tiempo de espera de ruta para las descargas de archivo.

contour.config.server.xdsServerType Tipo de servidor XDS que se utilizará: Valores compatibles: contour o envoy string Nulo
contour.config.tls.minimumProtocolVersion Versión mínima de TLS que Contour negociará string 1,1
contour.config.tls.fallbackCertificate.name Nombre del secreto que contiene el certificado de reserva para las solicitudes que no coinciden con el SNI definido para un vhost string Nulo
contour.config.tls.fallbackCertificate.namespace Espacio de nombres del secreto que contiene el certificado de reserva string Nulo
contour.config.tls.envoyClientCertificate.name Nombre del secreto que se utilizará como certificado del cliente, clave privada para la conexión TLS al servicio back-end. string Nulo
contour.config.tls.envoyClientCertificate.namespace Espacio de nombres del secreto que se utilizará como certificado del cliente, clave privada para la conexión TLS al servicio back-end. string Nulo
contour.config.leaderelection.configmapName Nombre del configmap que se utilizará para contour leaderelection string leader-elect
contour.config.leaderelection.configmapNamespace Espacio de nombres de contour leaderelection configmap string tanzu-system-ingress
contour.config.disablePermitInsecure Deshabilita el campo ingressroute permitInsecure booleano false
contour.config.accesslogFormat Formato de registro de acceso string envoy
contour.config.jsonFields Campos que se registrarán array of strings https://godoc.org/github.com/projectcontour/contour/internal/envoy#JSONFields
contour.config.useProxyProtocol https://projectcontour.io/guides/proxy-proto/ booleano false
contour.config.defaultHTTPVersions Contour debería programar a Envoy para que sirva estas versiones HTTP array of strings "HTTP/1.1 HTTP2"
contour.config.timeouts.requestTimeout El tiempo de espera de una solicitud completa time.Duration Nulo (el tiempo de espera está deshabilitado)
contour.config.timeouts.connectionIdleTimeout El tiempo de espera antes de finalizar una conexión inactiva time.Duration 60s
contour.config.timeouts.streamIdleTimeout Tiempo de espera antes de finalizar una solicitud o un flujo sin actividad time.Duration 5m
contour.config.timeouts.maxConnectionDuration Tiempo de espera antes de finalizar una conexión, independientemente de si hay actividad o no time.Duration Nulo (el tiempo de espera está deshabilitado)
contour.config.timeouts.ConnectionShutdownGracePeriod Tiempo que se debe esperar entre el envío de un GOAWAY inicial y final time.Duration 5s
contour.config.cluster.dnsLookupFamily dns-lookup-family que se utilizará para las solicitudes de subida a servicios de tipo externalName desde una ruta HTTPProxy string Nulo (valores admitidos: auto, v4, v6)
contour.config.debug Activa la depuración de Contour booleano false
contour.config.ingressStatusAddress Dirección que se establecerá en el estado de cada recurso de entrada. string Nulo
contour.certificate.duration Duración del certificado de Contour time.Duration 8760h
contour.certificate.renewBefore Duración antes de la renovación del certificado de Contour time.Duration 360h
contour.deployment.replicas Número de réplicas de Contour entero 2
contour.image.repository Ubicación del repositorio con la imagen de Contour. El valor predeterminado es el registro de VMware público. Cambie este valor si utiliza un repositorio privado (p. ej., un entorno aislado). string projects.registry.vmware.com/tkg
contour.image.name Nombre de la imagen de Contour string contour
contour.image.tag Etiqueta de la imagen de Contour. Es posible que este valor tenga que actualizarse si va a actualizar la versión de Contour. string v1.11.0_vmware.1
contour.image.pullPolicy Directiva de extracción de imagen de Contour string IfNotPresent
envoy.image.repository Ubicación del repositorio con la imagen de Envoy. El valor predeterminado es el registro de VMware público. Cambie este valor si utiliza un repositorio privado (p. ej., un entorno aislado). string projects.registry.vmware.com/tkg
envoy.image.name Nombre de la imagen de Envoy string envoy
envoy.image.tag Etiqueta de la imagen de Envoy. Es posible que este valor tenga que actualizarse si va a actualizar la versión de Envoy. string

v1.17.3_vmware.1

Nota: No utilice la imagen de Envoy v1.16.2_vmware.1 debido a una CVE. Para obtener más información, consulte las Notas de la versión.
envoy.image.pullPolicy Directiva de extracción de la imagen de Envoy string IfNotPresent
envoy.hostPort.enable Etiqueta para exponer los puertos de Envoy en el host booleano true
envoy.hostPort.http Puerto de host HTTP de Envoy entero 80
envoy.hostPort.https Puerto de host HTTPS de Envoy entero 443
envoy.service.type Tipo de servicio para exponer Envoy. Valores admitidos: ClusterIP, NodePort y LoadBalancer string Parámetro obligatorio para vSphere: NodePort o LoadBalancer, AWS: LoadBalancer, Azure: LoadBalancer
envoy.service.annotations Anotaciones en el servicio Envoy Mapa (valores de clave) Mapa vacío
envoy.service.externalTrafficPolicy Directiva de tráfico externo del servicio Envoy. Valores admitidos: Local, Clúster string Clúster
envoy.service.nodePort.http NodePort deseado para el servicio de tipo NodePort utilizado para las solicitudes http entero Nulo: Kubernetes asigna un puerto de nodo dinámico
envoy.service.nodePort.https NodePort deseado para el servicio de tipo NodePort utilizado para las solicitudes HTTPS entero Nulo: Kubernetes asigna un puerto de nodo dinámico
envoy.deployment.hostNetwork Ejecuta envoy en hostNetwork booleano false
envoy.service.aws.LBType Tipo AWS LB que se utilizará para exponer el servicio Envoy. Valores admitidos: clásico, nlb string clásico
envoy.loglevel Nivel de registro que se utilizará para Envoy string info

Tiempo de espera de ruta para las descargas de archivo

El parámetro contour.config.requestTimeout define la duración del tiempo de espera de la ruta de Contour. El valor predeterminado es 0s. Si utiliza Contour para la transferencia de archivos, es posible que deba ajustar este valor.

Según la documentación de Contour , un valor de tiempo de espera de 0s indica a Contour que utilice el tiempo de espera de Envoy. Según la documentación de Envoy, Envoy tiene un tiempo de espera de 15 segundos de forma predeterminada. Además, Envoy espera que toda la operación de solicitud-respuesta se complete dentro del intervalo de tiempo de espera.

Esto significa que con la configuración predeterminada de tiempo de espera de Contour de 0s, la transferencia de archivos debe completarse en 15 segundos. Para las transferencias de archivos grandes, es posible que este tiempo no sea suficiente. Para deshabilitar el tiempo de espera predeterminado de Envoy, establezca el valor de contour.config.requestTimeout en 0.