本主题介绍如何部署用于 Contour Ingress 的 TKG 扩展 v1.3.1。Contour 是使用 Envoy 反向代理的 Kubernetes Ingress 控制器。部署用于 Contour Ingress 的 TKG 扩展,以便向在 Tanzu Kubernetes 集群上运行的服务公开输入路由。

扩展必备条件

在为 Contour Ingress 部署 TKG 扩展 v1.3.1 之前,请遵循以下要求。

部署 Contour 扩展

用于 Contour Ingress 的 TKG 扩展将在集群上安装两个容器:Envoy 和 Contour。有关详细信息,请参见 https://projectcontour.io/
容器 资源类型 副本 描述
Envoy DaemonSet 3 高性能反向代理
Contour 部署 2 用于 Envoy 的管理和配置服务器
该扩展配置为从位于 https://projects.registry.vmware.com/ 的 VMware 公共注册表中提取容器。如果使用的是专用注册表,请更改数据值和扩展配置中的端点 URL 以匹配。请参见 配置 Contour 扩展
  1. 验证您是否已完成每个扩展必备条件。请参见扩展必备条件
  2. 将目录更改为 Contour 扩展文件的下载位置。
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/ingress/contour
  3. 运行以下命令,创建 tanzu-system-ingress 命名空间、Contour 服务帐户和角色对象。
    kubectl apply -f namespace-role.yaml
  4. 为 vSphere 创建 Contour 数据值文件。
    cp vsphere/contour-data-values-lb.yaml.example vsphere/contour-data-values.yaml
  5. 通过更新文件 vsphere/contour-data-values.yaml 来配置 Contour。

    示例数据值文件提供了所需的最低配置。有关所有配置字段和选项的描述,请参见配置 Contour 扩展

    例如,以下适用于 vSphere 的 Contour 配置使用 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"
    注: 建议您指定 Envoy 映像版本 v1.17.3_vmware.1,便可不用具有 CVE 的 Envoy 映像版本 v1.16.2_vmware.1。有关详细信息,请参见 发行说明
  6. 使用数据值创建密钥。
    kubectl create secret generic contour-data-values --from-file=values.yaml=vsphere/contour-data-values.yaml -n tanzu-system-ingress
    tanzu-system-ingress 命名空间中创建了 secret/contour-data-values。使用以下命令进行验证:
    kubectl get secrets -n tanzu-system-ingress
  7. 部署 Contour Ingress 控制器应用。
    kubectl apply -f contour-extension.yaml

    成功后,应该会看到 app.kappctrl.k14s.io/contour created

  8. 检查 Contour Ingress 控制器应用的状态。
    kubectl get app contour -n tanzu-system-ingress
    成功后,状态将从 Reconciling 更改为 Reconcile succeeded。如果状态为 Reconcile failed,请参见对 Contour Ingress 部署进行故障排除
  9. 查看有关 Contour Ingress 控制器应用的详细信息。
    kubectl get app contour -n tanzu-system-ingress -o yaml
  10. 查看 LoadBalancer 类型的 Envoy 服务。
    kubectl get service envoy -n tanzu-system-ingress -o wide
    成功后,您应该会看到 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. 验证 Envoy DaemonSet。
    kubectl get daemonsets -n tanzu-system-ingress
    成功后,您应该会看到 3-pod Envoy DaemonSet。
    NAME    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    envoy   3         3         3       3            3           <none>          6m10s
  12. 验证 Contour 部署。
    kubectl get deployments -n tanzu-system-ingress
    成功后,您应该会看到 2-pod Contour 部署。
    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    contour   2/2     2            2           8m7s
  13. 验证 Contour Ingress 控制器是否已正确安装并可供使用。
    kubectl get pod,svc -n tanzu-system-ingress
    Contour 和 Envoy pod 的状态应为 Running,并应向用于 Envoy 服务的 LoadBalancer 分配 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

对 Contour Ingress 部署进行故障排除

如果部署或协调失败,请运行 kubectl get pods -n tanzu-system-ingress 以查看 pod 状态。contourenvoy pod 应为 Running。如果 pod 状态为 ImagePullBackOffImageCrashLoopBackOff,则无法提取容器映像。检查数据值和扩展 YAML 文件中的注册表 URL,并确保它们准确无误。

查看容器日志,其中 name-XXXX 是运行 kubectl get pods -A 时的唯一 pod 名称:
kubectl logs pod/envoy-XXXXX -c envoy -n tanzu-system-ingress
 kubectl logs pod/contour-XXXXX -c contour -n tanzu-system-ingress

如果您发现 Contour pod 停滞在 ContainerCreating 状态,但未失败并显示上述映像错误之一,并且没有进展(“contour-xxxxx 进展超时”),则可能意味着存在 IP 地址冲突。确保在配置工作负载网络时指定的节点 CIDR 范围与集群规范中的 pod CIDR 范围(默认为 192.168.0.0/16)不冲突。如果存在冲突,请使用不同的 pod 子网更新集群,或更改节点网络。

更新 Contour 扩展

可更新部署到 Tanzu Kubernetes 集群的 Contour 扩展。

  1. 从密钥获取 Contour 数据值。
    kubectl get secret contour-data-values -n tanzu-system-ingress -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > contour-data-values.yaml
    
  2. 更新 ingress/contour/values.yaml 中的 Contour Ingress 数据值。请参见配置 Contour 扩展
    例如,以下适用于 vSphere 的 Contour 配置使用 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"
    注: 建议您指定 Envoy 映像版本 v1.17.3_vmware.1,便可不用具有 CVE 的 Envoy 映像版本 v1.16.2_vmware.1。有关详细信息,请参见 发行说明
  3. 更新 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-
    将使用新数据值协调 Contour 扩展。
    注: 默认情况下,kapp-controller 将每 5 分钟同步一次应用程序。更新应在 5 分钟或更短的时间内生效。如果希望更新立即生效,请将 contour-extension.yaml 中的 syncPeriod 更改为更低的值,然后使用 kubectl apply -f contour-extension.yaml 重新部署扩展。
  4. 检查该应用的状态。
    kubectl get app contour -n tanzu-system-ingress

    更新 Contour 后,状态应更改为 Reconcile Succeeded

  5. 查看详细状态。
    kubectl get app contour -n tanzu-system-ingress -o yaml
  6. 如有必要,进行故障排除。请参见对 Contour Ingress 部署进行故障排除

删除 Contour 扩展

Tanzu Kubernetes 集群中删除 Contour 扩展。

注: 按顺序完成步骤。在完全删除 Contour Ingress 控制器应用之前,请勿删除命名空间、服务帐户和角色对象。这样做可能会导致系统错误。
  1. 将目录更改为 Contour 扩展。
    cd extensions/ingress/contour/
  2. 删除 Contour Ingress 控制器应用。
    kubectl delete app contour -n tanzu-system-ingress

    预期结果:app.kappctrl.k14s.io "contour" deleted

  3. 验证是否已删除 Contour Ingress 控制器应用。
    kubectl get app contour -n tanzu-system-ingress

    预期结果:apps.kappctrl.k14s.io "contour" not found

  4. 删除 tanzu-system-ingress 命名空间、Contour 扩展服务帐户和角色对象。
    kubectl delete -f namespace-role.yaml

升级 Contour 扩展

如果部署了现有的 Contour 扩展,可以将其升级到最新版本。
  1. 导出 Contour configmap 并保存为备份。
    kubectl get configmap contour -n tanzu-system-ingress -o 'go-template={{ index .data "contour.yaml" }}' > contour-configmap.yaml
  2. 删除现有的 Contour 部署。请参见删除 Contour 扩展
  3. 部署最新的 Contour 扩展。请参见部署 Contour 扩展

配置 Contour 扩展

Contour Ingress 控制器配置值在 /extensions/ingress/contour/vsphere/contour-data-values.yaml 中进行设置。
表 1. Contour Ingress 配置参数
参数 描述 类型 默认
infrastructure_provider 基础架构提供商支持的值:vsphere、aws、azure string 必填参数
contour.namespace 将 contour 部署到的命名空间 string tanzu-system-ingress
contour.config.requestTimeout 要传递到 Envoy 的客户端请求超时 time.Duration 0 秒

请参见文件下载的路由超时

contour.config.server.xdsServerType 要使用的 XDS 服务器类型:支持的值:contour 或 envoy string
contour.config.tls.minimumProtocolVersion Contour 将协商的最低 TLS 版本 string 1.1
contour.config.tls.fallbackCertificate.name 包含不与为虚拟主机定义的 SNI 匹配的请求的回退证书的密钥名称 string
contour.config.tls.fallbackCertificate.namespace 包含回退证书的密钥的命名空间 string
contour.config.tls.envoyClientCertificate.name 用作客户端证书的密钥(用于与后端服务建立 TLS 连接的私钥)的名称 string
contour.config.tls.envoyClientCertificate.namespace 用作客户端证书的密钥(用于与后端服务建立 TLS 连接的私钥)的命名空间 string
contour.config.leaderelection.configmapName 要用于 contour 主节点选举的配置映射的名称 string leader-elect
contour.config.leaderelection.configmapNamespace contour 主节点选举配置映射的命名空间 string tanzu-system-ingress
contour.config.disablePermitInsecure 禁用 ingressroute permitInsecure 字段 布尔 false
contour.config.accesslogFormat 访问日志格式 string envoy
contour.config.jsonFields 将记录的字段 字符串数组 https://godoc.org/github.com/projectcontour/contour/internal/envoy#JSONFields
contour.config.useProxyProtocol https://projectcontour.io/guides/proxy-proto/ 布尔 false
contour.config.defaultHTTPVersions Contour 应编程 Envoy 以提供服务的 HTTP 版本 字符串数组 "HTTP/1.1 HTTP2"
contour.config.timeouts.requestTimeout 整个请求的超时时间 time.Duration 空(禁用超时)
contour.config.timeouts.connectionIdleTimeout 终止闲置连接之前等待的时间 time.Duration 60 秒
contour.config.timeouts.streamIdleTimeout 终止无活动的请求或流之前等待的时间 time.Duration 5m
contour.config.timeouts.maxConnectionDuration 终止连接之前等待的时间,与有无活动无关 time.Duration 空(禁用超时)
contour.config.timeouts.ConnectionShutdownGracePeriod 发送初始和最终 GOAWAY 之间等待的时间 time.Duration 5 秒
contour.config.cluster.dnsLookupFamily 用于从 HTTPProxy 路由到 externalName 类型服务的上游请求的 dns-lookup-family string 空(支持的值:自动、v4、v6)
contour.config.debug 打开 contour 调试 布尔 false
contour.config.ingressStatusAddress 要针对每个 Ingress 资源的状态设置的地址 string
contour.certificate.duration Contour 证书的持续时间 time.Duration 8760 小时
contour.certificate.renewBefore 应续订 contour 证书前的持续时间 time.Duration 360 小时
contour.deployment.replicas contour 副本数 integer 2
contour.image.repository 包含 Contour 映像的存储库的位置。默认为公共 VMware 注册表。如果使用的是专用存储库(例如气隙环境),请更改此值。 string projects.registry.vmware.com/tkg
contour.image.name 创建映像的名称 string contour
contour.image.tag Contour 映像标记。如果升级 Contour 版本,可能需要更新此值。 string v1.11.0_vmware.1
contour.image.pullPolicy 创建映像拉取策略 string IfNotPresent
envoy.image.repository 包含 Envoy 映像的存储库的位置。默认为公共 VMware 注册表。如果使用的是专用存储库(例如气隙环境),请更改此值。 string projects.registry.vmware.com/tkg
envoy.image.name envoy 映像的名称 string envoy
envoy.image.tag Envoy 映像标记。如果升级 Envoy 版本,可能需要更新此值。 string

v1.17.3_vmware.1

注: 由于 CVE,请勿使用 Envoy 映像 v1.16.2_vmware.1。有关详细信息,请参见 发行说明
envoy.image.pullPolicy 制定映像拉取策略 string IfNotPresent
envoy.hostPort.enable 用于在主机上公开 envoy 端口的标记 布尔 true
envoy.hostPort.http Envoy HTTP 主机端口 integer 80
envoy.hostPort.https Envoy HTTPS 主机端口 integer 443
envoy.service.type 用于公开 envoy 的服务类型。支持的值:ClusterIP、NodePort、LoadBalancer string 必填参数,vSphere:NodePort 或 LoadBalancer,AWS:LoadBalancer,Azure:LoadBalancer
envoy.service.annotations Envoy 服务注释 映射(键值) 空映射
envoy.service.externalTrafficPolicy envoy 服务的外部流量策略。支持的值:本地、集群 string 集群
envoy.service.nodePort.http 用于 http 请求的 NodePort 类型的服务所需的 nodePort integer Null - Kubernetes 分配动态节点端口
envoy.service.nodePort.https 用于 HTTPS 请求的 NodePort 类型的服务所需的 nodePort integer Null - Kubernetes 分配动态节点端口
envoy.deployment.hostNetwork 在 hostNetwork 中运行 envoy 布尔 false
envoy.service.aws.LBType 要用于公开 envoy 服务的 AWS LB 类型。支持的值:经典、nlb string 经典
envoy.loglevel 要用于 envoy 的日志级别 string 信息

文件下载的路由超时

参数 contour.config.requestTimeout 定义了 Contour 路由超时持续时间。默认值是 0s。如果使用 Contour 进行文件传输,您可能需要调整此值。

根据 Contour 文档0s 的超时值会指示 Contour 使用 Envoy 超时。根据 Envoy 文档,Envoy 的默认超时时间为 15 秒。此外,Envoy 还要求在超时时间间隔内完成整个请求响应操作。

这意味着,如果 Contour 默认超时设置为 0s,则必须在 15 秒内完成文件传输。对于大型文件传输,此时间可能不够。要禁用 Envoy 默认超时,请将 contour.config.requestTimeout 值设置为 0