本主题介绍如何部署用于 Contour Ingress 的 TKG 扩展 v1.3.1。Contour 是使用 Envoy 反向代理的 Kubernetes Ingress 控制器。部署用于 Contour Ingress 的 TKG 扩展,以便向在 Tanzu Kubernetes 集群上运行的服务公开输入路由。
扩展必备条件
- 置备集群。请参见使用 TKGS v1alpha2 API 置备 Tanzu Kubernetes 集群的工作流。
- 连接到集群。请参见以 vCenter Single Sign-On 用户身份连接到 Tanzu Kubernetes 集群。
- 下载 TKG 扩展 v1.3.1 包到运行 kubectl 的客户端主机上。
- 在目标集群上安装 TKG 扩展必备条件。
部署 Contour 扩展
容器 | 资源类型 | 副本 | 描述 |
---|---|---|---|
Envoy | DaemonSet | 3 | 高性能反向代理 |
Contour | 部署 | 2 | 用于 Envoy 的管理和配置服务器 |
- 验证您是否已完成每个扩展必备条件。请参见扩展必备条件。
- 将目录更改为 Contour 扩展文件的下载位置。
cd /tkg-extensions-v1.3.1+vmware.1/extensions/ingress/contour
- 运行以下命令,创建
tanzu-system-ingress
命名空间、Contour 服务帐户和角色对象。kubectl apply -f namespace-role.yaml
- 为 vSphere 创建 Contour 数据值文件。
cp vsphere/contour-data-values-lb.yaml.example vsphere/contour-data-values.yaml
- 通过更新文件
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"
- 使用数据值创建密钥。
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
- 部署 Contour Ingress 控制器应用。
kubectl apply -f contour-extension.yaml
成功后,应该会看到
app.kappctrl.k14s.io/contour created
。 - 检查 Contour Ingress 控制器应用的状态。
kubectl get app contour -n tanzu-system-ingress
成功后,状态将从Reconciling
更改为Reconcile succeeded
。如果状态为Reconcile failed
,请参见对 Contour Ingress 部署进行故障排除。 - 查看有关 Contour Ingress 控制器应用的详细信息。
kubectl get app contour -n tanzu-system-ingress -o yaml
- 查看 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
- 验证 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
- 验证 Contour 部署。
kubectl get deployments -n tanzu-system-ingress
成功后,您应该会看到 2-pod Contour 部署。NAME READY UP-TO-DATE AVAILABLE AGE contour 2/2 2 2 8m7s
- 验证 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 状态。contour
和 envoy
pod 应为 Running
。如果 pod 状态为 ImagePullBackOff
或 ImageCrashLoopBackOff
,则无法提取容器映像。检查数据值和扩展 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 扩展。
- 从密钥获取 Contour 数据值。
kubectl get secret contour-data-values -n tanzu-system-ingress -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > contour-data-values.yaml
- 更新
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"
- 更新 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
重新部署扩展。 - 检查该应用的状态。
kubectl get app contour -n tanzu-system-ingress
更新 Contour 后,状态应更改为
Reconcile Succeeded
。 - 查看详细状态。
kubectl get app contour -n tanzu-system-ingress -o yaml
- 如有必要,进行故障排除。请参见对 Contour Ingress 部署进行故障排除。
删除 Contour 扩展
从 Tanzu Kubernetes 集群中删除 Contour 扩展。
- 将目录更改为 Contour 扩展。
cd extensions/ingress/contour/
- 删除 Contour Ingress 控制器应用。
kubectl delete app contour -n tanzu-system-ingress
预期结果:
app.kappctrl.k14s.io "contour" deleted
。 - 验证是否已删除 Contour Ingress 控制器应用。
kubectl get app contour -n tanzu-system-ingress
预期结果:
apps.kappctrl.k14s.io "contour" not found
。 - 删除
tanzu-system-ingress
命名空间、Contour 扩展服务帐户和角色对象。kubectl delete -f namespace-role.yaml
升级 Contour 扩展
- 导出 Contour configmap 并保存为备份。
kubectl get configmap contour -n tanzu-system-ingress -o 'go-template={{ index .data "contour.yaml" }}' > contour-configmap.yaml
- 删除现有的 Contour 部署。请参见删除 Contour 扩展。
- 部署最新的 Contour 扩展。请参见部署 Contour 扩展。
配置 Contour 扩展
/extensions/ingress/contour/vsphere/contour-data-values.yaml
中进行设置。
参数 | 描述 | 类型 | 默认 |
---|---|---|---|
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 |
|
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
。