本主题介绍了如何将 Contour 部署到 Tanzu Kubernetes Grid 中的工作负载集群。
Contour 是使用 Envoy 边缘和服务代理的 Kubernetes 输入控制器。Tanzu Kubernetes Grid 包含 Contour 和 Envoy 的签名二进制文件,您可以将其部署到工作负载集群中,以便在这些集群中提供 Ingress 控制服务。
您可以将 Contour 和 Envoy 直接部署到工作负载集群中。如果要部署 Prometheus、Grafana 和 Harbor 软件包,则必须部署 Contour。
有关 Ingress 控制的常规信息,请参见 Kubernetes 文档中的 输入控制器。
kubectl
,如安装 Tanzu CLI 和其他工具以与 vSphere with Tanzu 主管配合使用或安装 Tanzu CLI 和其他工具以与独立管理集群配合使用中所述。重要在此 Tanzu Kubernetes Grid 版本中,提供的 Contour 和 Envoy 实施假定您使用自签名证书。
要准备集群,请执行以下操作:
获取要将 Contour 部署到的工作负载集群的 admin
凭据。例如:
tanzu cluster kubeconfig get my-cluster --admin
在上面的示例中,my-cluster
是集群的名称。
将 kubectl
的上下文设置为集群。例如:
kubectl config use-context my-cluster-admin@my-cluster
如果集群没有安装有 Contour 软件包的软件包存储库,例如 tanzu-standard
存储库,请安装一个:
注意如果要将基于计划的集群(旧版)作为目标,请跳过此步骤。对于基于计划的集群,在
tanzu-package-repo-global
命名空间中的每个集群能够自动启用tanzu-standard
软件包存储库。
tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
其中:
PACKAGE-REPO-NAME
是软件包存储库的名称,如 tanzu-standard
或使用 ADDITIONAL_IMAGE_REGISTRY
变量配置的专用映像注册表的名称。PACKAGE-REPO-ENDPOINT
是软件包存储库的 URL。
tanzu-standard
URL 为 projects.registry.vmware.com/tkg/packages/standard/repo:v2.2.0
。要从 Tanzu CLI 获取此值,请参见列出软件包存储库,或在 Tanzu Mission Control 中查看集群 (Cluster) 窗格中的附加模块 (Addons) > 存储库 (Repositories) 列表。如果尚未执行此操作,请在集群中安装证书管理器。有关说明,请参见安装证书管理器以进行证书管理。
继续下面的将 Contour 部署到工作负载集群。
设置集群后,必须先创建在安装 Contour 软件包时使用的配置文件,然后再安装软件包。
通过检索 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
。
在 contour-data-values.yaml
文件中配置以下内容:
---
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
---
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
---
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
如果要将 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
如果要将 Contour 安装到使用 NSX ALB 作为负载均衡器服务提供程序的 vSphere 集群,请修改 contour-default-values.yaml
文件以将 envoy.service.type
设置为 LoadBalancer
:
[...]
envoy:
service:
type: LoadBalancer
如果要将 Contour 安装到 Internet 受限的 AWS 环境,请修改 contour-data-values.yaml
文件以将以下注释添加到 Envoy 服务:
infrastructure_provider: aws
[...]
envoy:
service:
annotations:
service.beta.kubernetes.io/aws-load-balancer-internal: "true"
(可选)根据需要修改 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
设置为 yaml
、json
或 table
。有关详细信息,请参见安装和管理软件包中的软件包。
例如:
tanzu package available get contour.tanzu.vmware.com/1.17.1+vmware.1-tkg.1 --values-schema
如果您的 contour-data-values.yaml
文件包含注释,请将注释移除:
yq -i eval '... comments=""' contour-data-values.yaml
安装 Contour 软件包:
检索可用软件包的名称:
tanzu package available list -A
检索可用软件包的版本:
tanzu package available list contour.tanzu.vmware.com -A
安装软件包:
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-packages
或 tanzu-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
确认已安装 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:
确认 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
确认 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
[...]
如果已将 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 地址。
将 Contour 部署到 集群后,可以使用嵌入式 Envoy 管理界面检索有关部署的数据。
有关 Envoy 管理界面的信息,请参见 Envoy 文档中的管理界面。
获取 Envoy pod 的名称:
ENVOY_POD=$(kubectl -n tanzu-system-ingress get pod -l app=envoy -o name | head -1)
将 Envoy Pod 转发到引导计算机上的端口 9001:
kubectl -n tanzu-system-ingress port-forward $ENVOY_POD 9001
从引导计算机中,通过将 curl
查询发送到 访问 Envoy 管理界面中列出的 Envoy 管理端点,从 Contour 部署中检索信息。例如,使用 /config_dump
端点检索当前加载的配置:
curl http://localhost:9001/config_dump
在集群中开始运行工作负载后,可以以有向无环图 (DAG) 的形式直观显示 Contour 公开的流量信息。
安装 Graphviz(如果尚未安装)。此软件包提供用于创建 DAG 映像文件的 dot
命令。
获取 Contour pod 的名称:
CONTOUR_POD=$(kubectl -n tanzu-system-ingress get pod -l app=contour -o name | head -1)
转发 Contour pod 上的端口 6060:
kubectl -n tanzu-system-ingress port-forward $CONTOUR_POD 6060
打开新的终端窗口,下载 DAG 并将其另存为 *.png
文件。以下命令要求您在系统上安装 dot
(如果尚未安装)。
curl localhost:6060/debug/dag | dot -T png > contour-dag.png
打开 contour-dag.png
以查看图形。
您可以通过编辑 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 日志级别。有效值为 info 和 debug 。 |
contour.pspNames |
vmware-system-restricted |
要应用于 Contour Pod 的以逗号分隔的 Pod 安全策略 (PSP) 列表。 |
envoy.service.type |
无 | 要为 Envoy 置备的 Kubernetes 服务的类型。有效值为 LoadBalancer 、NodePort 和 ClusterIP 。如果未指定,则会将 NodePort 服务用于 vsphere 以及将 LoadBalancer 用于所有其他目标平台。 |
envoy.service.externalTrafficPolicy |
Local |
Envoy 服务的外部流量策略。有效值为 Local 和 Cluster 。 |
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 负载均衡器的类型。有效值为 classic 和 nlb 。如果不使用 aws ,则会忽略此值。 |
envoy.hostPorts.enable |
false |
是否为 Envoy pod 启用主机端口。如果为 false ,将忽略 envoy.hostPorts.http 和 envoy.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 日志级别。有效值为 trace 、debug 、info 、warn 、error 、critical 和 off 。 |
envoy.pspNames |
无 | 要应用于 Envoy 的以逗号分隔的 Pod 安全策略 (PSP) 列表。 |
infrastructure_provider |
vsphere |
底层目标平台。有效值为 vsphere 、aws 和 azure 。 |
loadBalancerIP |
无 | Envoy 服务所需的负载均衡器 IP。如果 envoy.service.type 未设置为 LoadBalancer ,则会忽略此设置 |
namespace |
tanzu-system-ingress |
运行 Contour 和 Envoy Pod 的命名空间与部署软件包的位置不同。 |
如果需要在部署后更改 Contour 软件包的配置,请按照以下步骤更新已部署的 Contour 软件包:
更新 contour-data-values.yaml
文件中的 Contour 配置。例如,可以通过将 contour.replicas
设置为新值来更改 Contour 副本的数量。
更新安装的软件包:
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
命令的详细信息,请参见安装和管理软件包中的更新软件包。您可以使用以下命令更新已安装软件包的版本或配置。