安装用于 Ingress 控制的 Contour

本主题介绍了如何将 Contour 部署到 Tanzu Kubernetes Grid 中的工作负载集群。

Contour 是使用 Envoy 边缘和服务代理的 Kubernetes 输入控制器。Tanzu Kubernetes Grid 包含 Contour 和 Envoy 的签名二进制文件,您可以将其部署到工作负载集群中,以便在这些集群中提供 Ingress 控制服务。

您可以将 Contour 和 Envoy 直接部署到工作负载集群中。如果要部署 Prometheus、Grafana 和 Harbor 软件包,则必须部署 Contour。

有关 Ingress 控制的常规信息,请参见 Kubernetes 文档中的 输入控制器

必备条件

重要

在此 Tanzu Kubernetes Grid 版本中,提供的 Contour 和 Envoy 实施假定您使用自签名证书。

为 Contour 部署准备工作负载集群

要准备集群,请执行以下操作:

  1. 获取要将 Contour 部署到的工作负载集群的 admin 凭据。例如:

    tanzu cluster kubeconfig get my-cluster --admin
    

    在上面的示例中,my-cluster 是集群的名称。

  2. kubectl 的上下文设置为集群。例如:

    kubectl config use-context my-cluster-admin@my-cluster
    
  3. 如果集群尚未安装 standard 软件包存储库,请进行安装:

    注意

    如果要将基于计划的集群(旧版)作为目标,请跳过此步骤。对于基于计划的集群,在 tanzu-package-repo-global 命名空间中的每个集群能够自动启用 tanzu-standard 软件包存储库。

    tanzu package repository add tanzu-standard --url PACKAGE-REPOSITORY-ENDPOINT --namespace tkg-system
    

    其中,PACKAGE-REPOSITORY-ENDPOINTstandard 软件包存储库的 URL。对于此版本,URL 为 projects.registry.vmware.com/tkg/packages/standard/repo:v2.1.1

    要从 Tanzu CLI 获取此值,请参见列出软件包存储库,或在 Tanzu Mission Control 中查看集群 (Cluster) 窗格中的附加模块 (Addons) > 存储库 (Repositories) 列表。

  4. 如果尚未执行此操作,请在集群中安装证书管理器。有关说明,请参见安装证书管理器以进行证书管理

  5. 继续下面的将 Contour 部署到工作负载集群

将 Contour 部署到工作负载集群

设置集群后,必须先创建在安装 Contour 软件包时使用的配置文件,然后再安装软件包。

  1. 通过检索 Contour 软件包的默认配置为该软件包创建配置文件:

    tanzu package available get contour.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
    

    其中,PACKAGE-VERSION 是要安装的 Contour 软件包的版本,FILE-PATH 是要将配置文件保存到的位置,例如,contour-data-values.yaml

  2. contour-data-values.yaml 文件中配置以下内容:

    vSphere
    此文件用于配置 vSphere 上的 Contour 软件包。
    ---
    infrastructure_provider: vsphere
    namespace: tanzu-system-ingress
    contour:
     configFileContents: {}
     useProxyProtocol: false
     replicas: 2
     pspNames: "vmware-system-restricted"
     logLevel: info
    envoy:
     service:
       type: NodePort
       annotations: {}
       nodePorts:
         http: null
         https: null
       externalTrafficPolicy: Cluster
       disableWait: false
     hostPorts:
       enable: true
       http: 80
       https: 443
     hostNetwork: false
     terminationGracePeriodSeconds: 300
     logLevel: info
     pspNames: null
    certificates:
     duration: 8760h
     renewBefore: 360h
    
    AWS
    此文件用于配置 vSphere 上的 Contour 软件包。
    ---
    infrastructure_provider: aws
    namespace: tanzu-system-ingress
    contour:
     configFileContents: {}
     useProxyProtocol: false
     replicas: 2
     pspNames: "vmware-system-restricted"
     logLevel: info
    envoy:
     service:
       type: LoadBalancer
       annotations: {}
       nodePorts:
         http: null
         https: null
       externalTrafficPolicy: Cluster
       aws:
         LBType: classic
       disableWait: false
     hostPorts:
       enable: true
       http: 80
       https: 443
     hostNetwork: false
     terminationGracePeriodSeconds: 300
     logLevel: info
     pspNames: null
    certificates:
     duration: 8760h
     renewBefore: 360h
    
    Azure
    此文件用于配置 Azure 上的 Contour 软件包。
    ---
    infrastructure_provider: azure
    namespace: tanzu-system-ingress
    contour:
     configFileContents: {}
     useProxyProtocol: false
     replicas: 2
     pspNames: "vmware-system-restricted"
     logLevel: info
    envoy:
     service:
       type: LoadBalancer
       annotations: {}
       nodePorts:
         http: null
         https: null
       externalTrafficPolicy: Cluster
       disableWait: false
     hostPorts:
       enable: true
       http: 80
       https: 443
     hostNetwork: false
     terminationGracePeriodSeconds: 300
     logLevel: info
     pspNames: null
    certificates:
     duration: 8760h
     renewBefore: 360h
    
  3. 如果要将 Contour 安装到使用 vSphere with Tanzu 创建的工作负载集群,请执行以下操作之一:

    • 没有 hostPorts

      如果 Envoy 守护进程不需要 hostPorts,请编辑 contour-data-values.yaml 以将 envoy.hostPorts.enable 设置为 false

      contour-data-values.yaml
      envoy:
        hostPorts:
          enable: false
      
    • hostPorts

      如果需要 hostPorts,请创建一个ClusterRoleBinding,以便 Envoy 服务帐户能够访问 tkg-system-privileged PSP:

      kubectl create clusterrolebinding envoy-tkg-admin-privileged-binding --clusterrole=psp:vmware-system-privileged --serviceaccount=tanzu-system-ingress:envoy
      
  4. 如果要将 Contour 安装到使用 NSX ALB 作为负载均衡器服务提供程序的 vSphere 集群,请修改 contour-default-values.yaml 文件以将 envoy.service.type 设置为 LoadBalancer

    [...]
    envoy:
     service:
       type: LoadBalancer
    
  5. 如果要将 Contour 安装到 Internet 受限的 AWS 环境,请修改 contour-data-values.yaml 文件以将以下注释添加到 Envoy 服务:

    infrastructure_provider: aws
    [...]
    envoy:
     service:
       annotations:
         service.beta.kubernetes.io/aws-load-balancer-internal: "true"
    
  6. (可选)根据需要修改 contour-data-values.yaml 文件。可选配置部分介绍了您可以在 contour-data-values.yaml 文件中自定义的值,以及如何使用这些值修改目标集群中 Contour 的默认行为。例如,Contour 软件包默认部署两个 Contour 副本,但副本数可以配置。您可以在 contour.replicas 值的 contour-data-values.yaml 中设置此数值。在大多数情况下,您无需修改 contour-data-values.yaml 文件。

    您也可以通过对目标集群运行以下命令来检索这些值:

    tanzu package available get contour.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
    

    其中,AVAILABLE-VERSION 是 Contour 软件包的版本。--values-schema 标记从 Contour 软件包的 Package API 资源中检索 valuesSchema 部分。您可以将值结构定义的输出格式 --output 设置为 yamljsontable。有关详细信息,请参见安装和管理软件包中的软件包

    例如:

    tanzu package available get contour.tanzu.vmware.com/1.17.1+vmware.1-tkg.1 --values-schema
    
  7. 如果您的 contour-data-values.yaml 文件包含注释,请将注释移除:

    yq -i eval '... comments=""' contour-data-values.yaml
    
  8. 安装 Contour 软件包:

    1. 检索可用软件包的名称:

      tanzu package available list -A
      
    2. 检索可用软件包的版本:

      tanzu package available list contour.tanzu.vmware.com -A
      
    3. 安装软件包:

      tanzu package install contour \
      --package contour.tanzu.vmware.com \
      --version AVAILABLE-PACKAGE-VERSION \
      --values-file contour-data-values.yaml \
      --namespace TARGET-NAMESPACE
      

      其中:

      • TARGET-NAMESPACE 是要在其中安装 Contour 软件包的命名空间。例如,my-packagestanzu-cli-managed-packages 命名空间。

        • 如果未指定 --namespace 标记,Tanzu CLI 将使用 default 命名空间。Contour 和 Envoy pod 以及与 Contour 组件关联的任何其他资源是在 tanzu-system-ingress 命名空间中创建的;请勿将 Contour 软件包安装到此命名空间中。
        • 指定的命名空间必须已存在,例如,通过运行 kubectl create namespace my-packages
      • AVAILABLE-PACKAGE-VERSION 是上面检索到的版本。

      例如:

      tanzu package install contour \
      --package contour.tanzu.vmware.com \
      --version 1.17.1+vmware.1-tkg.1 \
      --values-file contour-data-values.yaml \
      --namespace my-packages
      
  9. 确认已安装 contour 软件包:

    tanzu package installed list -A
    

    例如:

    tanzu package installed list -A
    - Retrieving installed packages...
      NAME            PACKAGE-NAME                     PACKAGE-VERSION                   STATUS               NAMESPACE
      cert-manager    cert-manager.tanzu.vmware.com    1.1.0+vmware.1-tkg.2              Reconcile succeeded  my-packages
      contour         contour.tanzu.vmware.com         1.17.1+vmware.1-tkg.1             Reconcile succeeded  my-packages
      antrea          antrea.tanzu.vmware.com                                            Reconcile succeeded  tkg-system
      [...]
    

    要查看有关软件包的更多详细信息,还可以运行:

    tanzu package installed get contour --namespace PACKAGE-NAMESPACE
    

    其中,PACKAGE-NAMESPACE 是安装 contour 软件包的命名空间。

    例如:

    tanzu package installed get contour --namespace my-packages
    \ Retrieving installation details for contour...
    NAME:                    contour
    PACKAGE-NAME:            contour.tanzu.vmware.com
    PACKAGE-VERSION:         1.17.1+vmware.1-tkg.1
    STATUS:                  Reconcile succeeded
    CONDITIONS:              [{ReconcileSucceeded True  }]
    USEFUL-ERROR-MESSAGE:
    
  10. 确认 contour 应用已在 PACKAGE-NAMESPACE 中成功协调:

    kubectl get apps -A
    

    例如:

    NAMESPACE     NAME             DESCRIPTION           SINCE-DEPLOY   AGE
    my-packages   cert-manager     Reconcile succeeded   78s            3h5m
    my-packages   contour          Reconcile succeeded   57s            6m3s
    tkg-system    antrea           Reconcile succeeded   45s            3h18m
    [...]
    

    如果状态不是 Reconcile Succeeded,请查看 contour 应用的完整状态详细信息。查看完整状态可帮助您解决问题。

    kubectl get app contour --namespace PACKAGE-NAMESPACE -o yaml
    

    其中,PACKAGE-NAMESPACE 是安装软件包的命名空间。如果故障排除无法帮助您解决问题,则必须先卸载软件包,然后再重新安装:

    tanzu package installed delete contour --namespace PACKAGE-NAMESPACE
    
  11. 确认 Contour 和 Envoy pod 正在 tanzu-system-ingress 命名空间中运行:

    kubectl get pods -A
    

    例如:

    kubectl get pods -A
    NAMESPACE              NAME                                                        READY   STATUS    RESTARTS   AGE
    [...]
    tanzu-system-ingress   contour-5dc6fc667c-c4w8k                                    1/1     Running   0          14m
    tanzu-system-ingress   contour-5dc6fc667c-jnqwn                                    1/1     Running   0          14m
    tanzu-system-ingress   envoy-mgfll                                                 2/2     Running   0          14m
    [...]
    
  12. 如果已将 Contour 部署到 AWS 或 Azure,请确认已为 Envoy 服务创建负载均衡器:

    kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'
    

    在 AWS 上,负载均衡器的名称类似于 aabaaad4dfc8e4a808a70a7cbf7d9249-1201421080.us-west-2.elb.amazonaws.com。在 Azure 上,它将是类似于 20.54.226.44 的 IP 地址。

远程访问 Envoy 管理界面

将 Contour 部署到 集群后,可以使用嵌入式 Envoy 管理界面检索有关部署的数据。

有关 Envoy 管理界面的信息,请参见 Envoy 文档中的管理界面

  1. 获取 Envoy pod 的名称:

    ENVOY_POD=$(kubectl -n tanzu-system-ingress get pod -l app=envoy -o name | head -1)
    
  2. 将 Envoy Pod 转发到引导计算机上的端口 9001:

    kubectl -n tanzu-system-ingress port-forward $ENVOY_POD 9001
    
  3. 从引导计算机中,通过将 curl 查询发送到 访问 Envoy 管理界面中列出的 Envoy 管理端点,从 Contour 部署中检索信息。例如,使用 /config_dump 端点检索当前加载的配置:

    curl http://localhost:9001/config_dump
    

可视化内部 Contour 有向无环图 (DAG)

在集群中开始运行工作负载后,可以以有向无环图 (DAG) 的形式直观显示 Contour 公开的流量信息。

  1. 安装 Graphviz(如果尚未安装)。此软件包提供用于创建 DAG 映像文件的 dot 命令。

  2. 获取 Contour pod 的名称:

    CONTOUR_POD=$(kubectl -n tanzu-system-ingress get pod -l app=contour -o name | head -1)
    
  3. 转发 Contour pod 上的端口 6060:

    kubectl -n tanzu-system-ingress port-forward $CONTOUR_POD 6060
    
  4. 打开新的终端窗口,下载 DAG 并将其另存为 *.png 文件。以下命令要求您在系统上安装 dot(如果尚未安装)。

    curl localhost:6060/debug/dag | dot -T png > contour-dag.png
    
  5. 打开 contour-dag.png 以查看图形。

    Contour DAG 文件

可选配置

您可以通过编辑 Contour 软件包配置文件中的默认值进一步自定义配置。

下表包含有关您可以在 contour-data-values.yaml 文件中自定义的值的信息,以及在部署到工作负载集群时如何使用这些值修改 Contour 的默认行为。

如果在初始部署后重新配置 Contour 设置,则必须按照更新正在运行的 Contour 部署中的步骤将新配置应用于集群。

配置 默认 描述
certificates.duration 8760h 用于确保 Contour 与 Envoy 之间通信安全的证书的有效期。
certificates.renewBefore 360h 应在过期之前多久续订用于确保 Contour 与 Envoy 之间通信安全的证书。
contour.configFileContents Contour 配置文件的 YAML 内容。有关详细信息,请参见 Contour 文档中的配置文件
contour.replicas 2 要有多少个 Contour Pod 副本。
contour.useProxyProtocol false 是否为所有 Envoy 侦听器启用 PROXY 协议。
contour.logLevel info Contour 日志级别。有效值为 infodebug
contour.pspNames vmware-system-restricted 要应用于 Contour Pod 的以逗号分隔的 Pod 安全策略 (PSP) 列表。
envoy.service.type 要为 Envoy 置备的 Kubernetes 服务的类型。有效值为 LoadBalancerNodePortClusterIP。如果未指定,则会将 NodePort 服务用于 vsphere 以及将 LoadBalancer 用于所有其他目标平台。
envoy.service.externalTrafficPolicy Local Envoy 服务的外部流量策略。有效值为 LocalCluster
envoy.service.annotations 要在 Envoy 服务上设置的注释。
envoy.service.loadBalancerIP Envoy 服务所需的负载均衡器 IP。如果 envoy.service.type 未设置为 LoadBalancer,则会忽略此设置
envoy.service.nodePorts.http 如果 envoy.service.type == NodePort,则公开 Envoy 的 HTTP 侦听器的节点端口号打开。如果未指定,Kubernetes 将自动分配节点端口。
envoy.service.nodePorts.https 如果 envoy.service.type == NodePort,则公开 Envoy 的 HTTPS 侦听器的节点端口号打开。如果未指定,Kubernetes 将自动分配节点端口。
envoy.service.aws.LBType classic 如果 infrastructure_provider == aws,则为要使用的 AWS 负载均衡器的类型。有效值为 classicnlb。如果不使用 aws,则会忽略此值。
envoy.hostPorts.enable false 是否为 Envoy pod 启用主机端口。如果为 false,将忽略 envoy.hostPorts.httpenvoy.hostPorts.https
envoy.hostPorts.http 80 如果 envoy.hostPorts.enable == true,则公开 Envoy 的 HTTP 侦听器的主机端口号打开。
envoy.hostPorts.https 443 如果 envoy.hostPorts.enable == true,则公开 Envoy 的 HTTPS 侦听器的主机端口号打开。
envoy.hostNetwork false 是否为 Envoy Pod 启用主机网络。
envoy.terminationGracePeriodSeconds 300 Envoy pod 的终止宽限期(以秒为单位)。
envoy.logLevel info Envoy 日志级别。有效值为 tracedebuginfowarnerrorcriticaloff
envoy.pspNames 要应用于 Envoy 的以逗号分隔的 Pod 安全策略 (PSP) 列表。
infrastructure_provider vsphere 底层目标平台。有效值为 vsphereawsazure
loadBalancerIP Envoy 服务所需的负载均衡器 IP。如果 envoy.service.type 未设置为 LoadBalancer,则会忽略此设置
namespace tanzu-system-ingress 运行 Contour 和 Envoy Pod 的命名空间与部署软件包的位置不同。

更新正在运行的 Contour 部署

如果需要在部署后更改 Contour 软件包的配置,请按照以下步骤更新已部署的 Contour 软件包:

  1. 更新 contour-data-values.yaml 文件中的 Contour 配置。例如,可以通过将 contour.replicas 设置为新值来更改 Contour 副本的数量。

  2. 更新安装的软件包:

    tanzu package installed update contour \
    --version INSTALLED-PACKAGE-VERSION \
    --values-file contour-data-values.yaml \
    --namespace INSTALLED-PACKAGE-NAMESPACE
    

    其中:

    • INSTALLED-PACKAGE-VERSION 是已安装 Contour 软件包的版本。
    • INSTALLED-PACKAGE-NAMESPACE 是安装 Contour 软件包的命名空间。

    例如:

    tanzu package installed update contour \
    --version 1.17.1+vmware.1-tkg.1 \
    --values-file contour-data-values.yaml \
    --namespace my-packages
    

    将使用您添加的新值协调 Contour 软件包。kapp-controller 应用更改可能需要长达五分钟的时间。

    有关 tanzu package installed update 命令的详细信息,请参见安装和管理软件包中的更新软件包。您可以使用以下命令更新已安装软件包的版本或配置。

check-circle-line exclamation-circle-line close-line
Scroll to top icon