O Contour é um controlador de entrada do Kubernetes que usa o proxy reverso do Envoy. Implante a extensão TKG para entrada de contorno para expor rotas de ingresso para serviços em execução em clusters do Tanzu Kubernetes.

Pré-requisitos de extensão

Este tópico descreve como implantar a extensão TKG v1.3.1 para o Contour Ingress. Siga os seguintes requisitos para implantar a extensão.

Implantar a extensão Contour

A extensão TKG para o Contour Ingress instala dois contêineres no cluster: Envoy e Contour. Para obter mais informações, consulte https://projectcontour.io/.
Container Tipo de Recurso Réplicas Descrição
Enviado DaemonSet 3 Proxy reverso de alto desempenho
Contour Implantação 2 Servidor de gerenciamento e configuração para o Envoy
A extensão está configurada para receber os contêineres do registro público VMware em https://projects.registry.vmware.com/. Se você estiver usando um registro privado, altere a URL do endpoint nos valores de dados e nas configurações de extensão para corresponder. Consulte o Configurar a extensão Contour.
  1. Verifique se você concluiu cada um dos pré-requisitos de extensão. Consulte o Pré-requisitos de extensão.
  2. Altere o diretório para onde você baixou os arquivos de extensão Contour.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/ingress/contour
  3. Execute o seguinte comando para criar o namespace tanzu-system-ingress e a conta de serviço Contour e os objetos de função.
    kubectl apply -f namespace-role.yaml
  4. Crie um arquivo de valores de dados Contour para o vSphere.
    cp vsphere/contour-data-values-lb.yaml.example vsphere/contour-data-values.yaml
  5. Configure o Contour atualizando o arquivo vsphere/contour-data-values.yaml.

    O arquivo de valores de dados de exemplo fornece a configuração mínima necessária. Consulte Configurar a extensão Contour para obter uma descrição de todos os campos e opções de configuração.

    Por exemplo, a seguinte configuração de Contour para o vSphere usa um serviço do 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"
    Observação: É recomendável que você especifique a versão da imagem do Envoy v1.17.3_vmware.1 para não usar a versão da imagem do Envoy v1.16.2_vmware.1 que tem um CVE. Para obter mais informações, consulte as notas da versão .
  6. Crie um segredo com os valores de dados.
    kubectl create secret generic contour-data-values --from-file=values.yaml=vsphere/contour-data-values.yaml -n tanzu-system-ingress
    O secret/contour-data-values é criado no namespace tanzu-system-ingress. Verifique usando o seguinte comando:
    kubectl get secrets -n tanzu-system-ingress
  7. Implante o aplicativo controlador Contour Ingress.
    kubectl apply -f contour-extension.yaml

    Se for bem-sucedido, você verá app.kappctrl.k14s.io/contour created.

  8. Verifique o status do aplicativo do controlador Contour Ingress.
    kubectl get app contour -n tanzu-system-ingress
    Em caso de sucesso, o status muda de Reconciling para Reconcile succeeded. Se o status for Reconcile failed, consulte Solução de problemas de implantação de entrada do Contour.
  9. Visualize informações detalhadas sobre o aplicativo controlador Contour Ingress.
    kubectl get app contour -n tanzu-system-ingress -o yaml
  10. Visualize o serviço Envoy do tipo LoadBalancer.
    kubectl get service envoy -n tanzu-system-ingress -o wide
    Se for bem-sucedido, você deverá ver os detalhes do Balanceador de Carga do 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. Verifique o Envoy DaemonSet.
    kubectl get daemonsets -n tanzu-system-ingress
    Se for bem-sucedido, você deverá ver o DaemonSet do Envoy de 3 pods.
    NAME    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    envoy   3         3         3       3            3           <none>          6m10s
  12. Verifique a implantação do Contour.
    kubectl get deployments -n tanzu-system-ingress
    Se for bem-sucedido, você verá a Implantação de Contorno de 2 pods.
    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    contour   2/2     2            2           8m7s
  13. Verifique se o controlador Contour Ingress está instalado corretamente e pronto para uso.
    kubectl get pod,svc -n tanzu-system-ingress
    O status dos pods Contour e Envoy deve ser Running, e o LoadBalancer para o Serviço Envoy é atribuído com um 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

Solução de problemas de implantação de entrada do Contour

Se a implantação ou a reconciliação falhar, execute kubectl get pods -n tanzu-system-ingress para exibir o status do pod. Os pods contour e envoy devem ser Running. Se um status de pod for ImagePullBackOff ou ImageCrashLoopBackOff, a imagem do contêiner não poderá ser extraída. Verifique a URL do registro nos valores de dados e nos arquivos YAML de extensão e certifique-se de que eles sejam precisos.

Verifique os logs do contêiner, onde name-XXXX é o nome do pod exclusivo quando você executa 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 você vir que um pod do Contour está preso em um estado ContainerCreating sem falhar com um dos erros de imagem acima e sem progredir ("contour-xxxxx has timed out progressing"), isso provavelmente significa que há um conflito de endereço IP . Certifique-se de que o intervalo de CIDR de nós que você especificou ao configurar a rede de carga de trabalho não entre em conflito com o intervalo de CIDR de pods na especificação do cluster, que por padrão é 192.168.0.0/16. Se houver um conflito, atualize o cluster com uma sub-rede de pods diferente ou altere a rede de nós.

Atualizar a extensão Contour

Atualize a extensão Contour que é implantada em um cluster do Tanzu Kubernetes.

  1. Obtenha valores de dados Contour do segredo.
    kubectl get secret contour-data-values -n tanzu-system-ingress -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > contour-data-values.yaml
    
  2. Atualize os valores de dados de Entrada de Contorno em ingress/contour/values.yaml. Consulte o Configurar a extensão Contour.
    Por exemplo, a seguinte configuração de Contour para o vSphere usa um serviço do 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"
    Observação: É recomendável que você especifique a versão da imagem do Envoy v1.17.3_vmware.1 para não usar a versão da imagem do Envoy v1.16.2_vmware.1 que tem um CVE. Para obter mais informações, consulte as notas da versão .
  3. Atualize o segredo dos valores de dados do 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-
    A extensão Contour é reconciliada com os novos valores de dados.
    Observação: Por padrão, o kapp-controller sincronizará os aplicativos a cada 5 minutos. A atualização deve entrar em vigor em 5 minutos ou menos. Se você quiser que ela entre em vigor imediatamente, altere syncPeriod em contour-extension.yaml para um valor menor e reimplante a extensão usando kubectl apply -f contour-extension.yaml.
  4. Verifique o status do aplicativo.
    kubectl get app contour -n tanzu-system-ingress

    O status deve mudar para Reconcile Succeeded assim que o Contour for atualizado.

  5. Visualize o status detalhado.
    kubectl get app contour -n tanzu-system-ingress -o yaml
  6. Solucione problemas, se necessário. Consulte o Solução de problemas de implantação de entrada do Contour.

Excluir a extensão Contour

Exclua a extensão Contour de um cluster Tanzu Kubernetes.

Observação: Conclua as etapas em ordem. Não exclua o namespace, a conta de serviço e os objetos de função antes que o aplicativo do controlador Contour Ingress seja totalmente excluído. Isso pode levar a erros do sistema.
  1. Altere o diretório para a extensão Contour.
    cd extensions/ingress/contour/
  2. Exclua o aplicativo controlador Contour Ingress.
    kubectl delete app contour -n tanzu-system-ingress

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

  3. Verifique se o aplicativo controlador Contour Ingress foi excluído.
    kubectl get app contour -n tanzu-system-ingress

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

  4. Exclua o namespace tanzu-system-ingress e a conta de serviço de extensão do Contour e os objetos de função.
    kubectl delete -f namespace-role.yaml

Atualizar a extensão Contour

Se você tiver uma extensão do Contour existente implantada, poderá atualizá-la para a versão mais recente.
  1. Exporte o mapa de configuração de contorno e salve-o como backup.
    kubectl get configmap contour -n tanzu-system-ingress -o 'go-template={{ index .data "contour.yaml" }}' > contour-configmap.yaml
  2. Exclua a implantação existente do Contour. Consulte o Excluir a extensão Contour.
  3. Implante a extensão Contour mais recente. Consulte o Implantar a extensão Contour.

Configurar a extensão Contour

Os valores de configuração do controlador Contour Ingress são definidos em /extensions/ingress/contour/vsphere/contour-data-values.yaml.
Tabela 1. Parâmetros de configuração de entrada do Contour
Parâmetro Descrição Tipo Padrão
provedor_de_estrutura_de_estrutura Provedor de infraestrutura. Valores compatíveis: vsphere, aws, azure cadeia de caracteres Parâmetro obrigatório
contour.namespace Namespace onde o Contour será implantado cadeia de caracteres tanzu-system-ingress
contour.config.requestTimeout O tempo limite da solicitação do cliente deve ser passado para o Envoy time.Duração 0s

Consulte o Tempo limite de rota para downloads de arquivos.

contour.config.server.xdsServerType Tipo de servidor XDS a ser usado: Valores com suporte: contour ou enviado cadeia de caracteres Nulo
contour.config.tls.minimumProtocolVersion Versão mínima do TLS que a Contour negociará cadeia de caracteres 1.1
contour.config.tls.fallbackCertificate.name Nome do segredo que contém o certificado de fallback para solicitações que não correspondem ao SNI definido para um vhost cadeia de caracteres Nulo
contour.config.tls.fallbackCertificate.namespace Namespace do segredo que contém o certificado de fallback cadeia de caracteres Nulo
contour.config.tls.envoyClientCertificate.name Nome do segredo a ser usado como certificado de cliente, chave privada para conexão TLS com o serviço de back-end cadeia de caracteres Nulo
contour.config.tls.envoyClientCertificate.namespace Namespace do segredo a ser usado como certificado de cliente, chave privada para conexão TLS com o serviço de back-end cadeia de caracteres Nulo
contour.config.leaderelection.configmapName Nome do mapa de configuração a ser usado para a seleção de líderes de contorno cadeia de caracteres líder eleito
contour.config.leaderelection.configmapNamespace Namespace do mapa de configuração de seleção de líderes de contorno cadeia de caracteres tanzu-system-ingress
contour.config.disablePermitInsecure Desativa o campo ingressroute permitInsecure boolean falso
contour.config.accesslogFormat Formato de log de acesso cadeia de caracteres enviado
contour.config.jsonFields Campos que serão registrados matriz de cadeias de caracteres https://godoc.org/github.com/projectcontour/contour/internal/envoy#JSONFields
contour.config.useProxyProtocol https://projectcontour.io/guides/proxy-proto/ boolean falso
contour.config.defaultHTTPVersions Versões HTTP que o Contour deve programar o Envoy para servir matriz de cadeias de caracteres "HTTP / 1.1 HTTP2"
contour.config.timeouts.requestTimeout O tempo limite de uma solicitação inteira time.Duração Nulo (o tempo limite está desativado)
contour.config.timeouts.connectionIdleTimeout O tempo de espera antes de encerrar uma conexão ociosa time.Duração Anos 60
contour.config.timeouts.streamIdleTimeout O tempo de espera antes de encerrar uma solicitação ou fluxo sem atividade time.Duração 5m
contour.config.timeouts.maxConnectionDuração O tempo de espera antes de encerrar uma conexão, independentemente da atividade ou não time.Duração Nulo (o tempo limite está desativado)
contour.config.timeouts.ConnectionShutdownGracePeriod O tempo de espera entre o envio de um GOAWAY inicial e final time.Duração 5s
contour.config.cluster.dnsLookupFamily família dns-lookup a ser usada para solicitações upstream para serviços do tipo externalName de uma rota HTTPProxy cadeia de caracteres Nulo (Valores compatíveis: auto, v4, v6)
contour.config.debug Ativar depuração de contorno boolean falso
contour.config.ingressStatusAddress O endereço para definir o status de cada recurso de entrada cadeia de caracteres Nulo
contour.certificate.duration Duração do certificado de contorno time.Duração 8760h
contour.certificate.renewBefore Duração antes de o certificado de contorno ser renovado time.Duração 360h
contour.deployment.replicas Número de réplicas de contorno número inteiro 2
contour.image.repository Localização do repositório com a imagem Contour. O padrão é o registro público VMware. Altere esse valor se você estiver usando um repositório privado (por exemplo, ambiente isolado). cadeia de caracteres projects.registry.vmware.com/tkg
contour.image.name Nome da imagem de contorno cadeia de caracteres contorno
contour.image.tag Marca de imagem de contorno. Esse valor pode precisar ser atualizado se você estiver atualizando a versão do Contour. cadeia de caracteres v1.11.0_vmware.1
contour.image.pullPolicy Política de recebimento de imagem Contour cadeia de caracteres IfNotPresent
envoy.image.repository Localização do repositório com a imagem do Envoy. O padrão é o registro público VMware. Altere esse valor se você estiver usando um repositório privado (por exemplo, ambiente isolado). cadeia de caracteres projects.registry.vmware.com/tkg
envoy.image.name Nome da imagem do enviado cadeia de caracteres enviado
envoy.image.tag Etiqueta de imagem do Envoy. Esse valor pode precisar ser atualizado se você estiver atualizando a versão do Envoy. cadeia de caracteres

v1.17.3_vmware.1

Observação: Não use a imagem do Envoy v1.16.2_vmware.1 devido a um CVE. Para obter mais informações, consulte as notas da versão .
envoy.image.pullPolicy Política de recebimento de imagem do Envoy cadeia de caracteres IfNotPresent
envoy.hostPort.enable Sinalizar para expor as portas do enviado no host boolean verdadeiro
envoy.hostPort.http Porta do host HTTP do Envoy número inteiro 80
envoy.hostPort.https Porta do host HTTPS do Envoy número inteiro 443
envoy.service.type Tipo de serviço para expor o enviado. Valores com suporte: ClusterIP, NodePort, LoadBalancer cadeia de caracteres Parâmetro obrigatório para vSphere: NodePort ou LoadBalancer, AWS: LoadBalancer, Azure: LoadBalancer
envoy.service.annotations Anotações do serviço Envoy Mapa (valores-chave) Mapa vazio
envoy.service.externalTrafficPolicy Política de tráfego externo do serviço de envio. Valores com suporte: local, cluster cadeia de caracteres Cluster
envoy.service.nodePort.http NodePort desejado para o serviço do tipo NodePort usado para solicitações http número inteiro Nulo - O Kubernetes atribui uma porta de nó dinâmica
envoy.service.nodePort.https NodePort desejado para o serviço do tipo NodePort usado para solicitações HTTPS número inteiro Nulo - O Kubernetes atribui uma porta de nó dinâmica
envoy.deployment.hostNetwork Execute o envoy em hostNetwork boolean falso
envoy.service.aws.LBType O tipo de AWS LB a ser usado para expor o serviço do Envoy. Valores compatíveis: clássico, nlb cadeia de caracteres clássico
envoy.loglevel Nível de log a ser usado para o enviado cadeia de caracteres informação

Tempo limite de rota para downloads de arquivos

O parâmetro contour.config.requestTimeout define o tempo limite do caminho de contorno. O valor padrão é 0s. Para a maioria dos casos de uso, essa configuração é apropriada. No entanto, se você estiver tentando usar o Contour com o Envoy para transferência de arquivos, esse valor exigirá mais explicações.

De acordo com a documentação do Contour , um valor de tempo limite de 0s será tratado como se o campo não estivesse definido, ou seja, o Contour irá adiar para o Envoy e usar seu comportamento padrão. De acordo com a documentação do Envoy , por padrão, o Envoy tem um tempo limite de 15 segundos. Além disso, o Envoy espera que toda a operação de solicitação-resposta seja concluída em 15 segundos. Para transferências de arquivos grandes, isso pode não ser suficiente. Para desativar o tempo limite do Envoy, defina o valor de contour.config.requestTimeout como 0.