本教程介绍如何通过配置 Ingress 资源在使用外部应用负载均衡器的情况下运行 Web 应用。
本页面适用于为组织设计和架构网络以及安装、配置和支持网络设备的网络专家。如需详细了解我们在Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。
背景
Google Kubernetes Engine (GKE) 为可公开访问的应用提供了对两种类型的 Cloud Load Balancing 的集成支持:
在本教程中,您将使用 Ingress。
入站流量
在资源清单中指定 kind: Ingress
时,您需要指示 GKE 来创建 Ingress 资源。通过添加注释并支持工作负载和 Service,您可以创建自定义 Ingress 控制器。否则,GKE 会进行适当的 Google Cloud API 调用,以创建外部应用负载均衡器。负载均衡器的网址映射的主机规则和路径匹配器会引用一个或多个后端服务,其中,每个后端服务对应于一个类型为 NodePort
的 GKE Service,如 Ingress
中引用的那样。每个后端服务的后端是实例组或网络端点组 (NEG)。在配置 Ingress 的过程中,配置容器原生负载均衡时,系统会创建 NEG。对于每个后端服务,GKE 都会根据相应 GKE Service 引用的工作负载的就绪性探测设置创建 Google Cloud 健康检查。
如果要公开在 GKE 上托管的 HTTP(S) 服务,则建议使用 HTTP(S) 负载平衡方法来实现负载平衡。
部署 Web 应用
下面的清单描述了了一个在端口 8080 的 HTTP 服务器上运行示例 Web 应用容器映像的 Deployment:
将资源应用到集群:
kubectl apply -f web-deployment.yaml
在集群内公开 Deployment
下面的清单描述了了使 web
部署可在容器集群中访问的 Service:
将资源应用到集群:
kubectl apply -f web-service.yaml
使用此命令创建 NodePort 类型的 Service 时,GKE 会使您的 Service 在集群中所有节点上随机选择的较大端口号(例如 32640)上可用。
验证是否已创建 Service 以及是否分配了节点端口:
输出:kubectl get service web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.35.245.219 <none> 8080:32640/TCP 5m
在示例输出结果中,
web
Service 的节点端口是32640
。另请注意,我们未为此 Service 分配外部 IP 地址。由于默认情况下无法从外部访问 GKE 节点,因此创建此 Service 后,仍无法通过互联网访问您的应用。
要使 HTTP(S) 网络服务器应用可公开访问,您必须创建 Ingress 资源。
创建 Ingress 资源
Ingress 是一种 Kubernetes 资源,它封装了一系列规则和配置,可将外部 HTTP(S) 流量路由到内部服务。
在 GKE 上,Ingress 是使用 Cloud Load Balancing 实现的。当您在集群中创建 Ingress 时,GKE 会创建一个 HTTP(S) 负载均衡器,并将其配置为将流量路由到您的应用。
下面的清单描述了将流量定向到 web
Service 的 Ingress 资源:
将资源应用到集群:
kubectl apply -f basic-ingress.yaml
部署此清单后,Kubernetes 会在您的集群上创建一个 Ingress 资源。GKE Ingress 控制器根据 Ingress 中的信息创建并配置 HTTP(S) 负载均衡器,将端口 80 上的所有外部 HTTP 流量路由到您公开的 web
NodePort Service。
访问应用
通过运行以下命令找出为应用提供服务的负载均衡器的外部 IP 地址:
kubectl get ingress basic-ingress
NAME HOSTS ADDRESS PORTS AGE basic-ingress * 203.0.113.12 80 2m
在浏览器中打开应用的外部 IP 地址,查看纯文本 HTTP 响应,如下所示:
Hello, world! Version: 1.0.0 Hostname: web-6498765b79-fq5q5
您可以访问 Google Cloud 控制台中的负载均衡,并检查 GKE Ingress 控制器创建的网络资源。
(可选)配置静态 IP 地址
在域名上公开网络服务器时,您需要确保应用的外部 IP 地址是不会更改的静态 IP。
默认情况下,GKE 会为通过 Ingress 公开的 HTTP 应用分配临时外部 IP 地址。 临时地址随时可能更改。如果您打算长时间运行应用,则必须使用静态外部 IP 地址。
请注意,为 Ingress 资源配置静态 IP 地址后,删除 Ingress 时将不会删除与之关联的静态 IP 地址。如果不再打算再次使用所配置的静态 IP 地址,请务必清理该 IP 地址。
如需配置静态 IP 地址,请完成以下步骤:
预留名为
web-static-ip
的静态外部 IP 地址:gcloud
gcloud compute addresses create web-static-ip --global
Config Connector
注意:此步骤需要使用 Config Connector。按照安装说明在您的集群上安装配置连接器。
如需部署此清单,请将它以 compute-address.yaml 的形式下载到您的机器上,然后运行以下命令:kubectl apply -f compute-address.yaml
basic-ingress-static.yaml
清单会在 Ingress 中添加注释,以使用名为web-static-ip
的静态 IP 地址资源:查看清单:
cat basic-ingress-static.yaml
将资源应用到集群:
kubectl apply -f basic-ingress-static.yaml
检查外部 IP 地址:
kubectl get ingress basic-ingress
等待应用的 IP 地址发生更改,以使用
web-static-ip
资源的预留 IP 地址。更新现有 Ingress 资源、重新配置负载均衡器并在全球范围传播负载均衡规则可能需要几分钟的时间。完成此操作后,GKE 会释放之前分配给应用的临时 IP 地址。
(可选)在负载均衡器上处理多个应用
您可以通过对 Ingress 配置路由规则,在单个负载均衡器和公共 IP 上运行多个服务。通过在同一 Ingress 上托管多个服务,您就不必为公开给互联网的每一个 Service 创建额外的负载均衡器(此为计费资源)。
下面的清单描述了同一 Web 应用的 2.0
版 Deployment:
将资源应用到集群:
kubectl apply -f web-deployment-v2.yaml
下面的清单描述了一个在内部将 web2
公开给名为 web2
的 NodePort Service 上的集群:
将资源应用到集群:
kubectl apply -f web-service-v2.yaml
下面的清单描述了具备以下特点的 Ingress 资源:
- 使用以
/v2/
开头的路径将请求路由到web2
Service - 将其他所有请求路由到
web
Service
将资源应用到集群:
kubectl create -f fanout-ingress.yaml
部署 Ingress 后,请运行 kubectl get ingress fanout-ingress
来查找集群的公共 IP 地址。
然后,访问该 IP 地址,确定能否在同一负载均衡器上访问这两个应用:
- 访问
http://<IP_ADDRESS>/
并注意响应包含Version: 1.0.0
(因为该请求被路由到web
Service) - 访问
http://<IP_ADDRESS>/v2/
并注意响应包含Version: 2.0.0
(因为该请求被路由到web2
Service)
Ingress 的 path
字段唯一支持的通配符是 *
字符。*
字符必须紧跟在正斜线 (/
) 之后,并且必须是格式中的最后一个字符。例如,/*
、/foo/*
、/foo/bar/*
是有效格式,但 *
、/foo/bar*
、/foo/*/bar
不是有效格式。
较具体的格式优先于不太具体的格式。如果您同时拥有 /foo/*
和 /foo/bar/*
,则选择 /foo/bar/bat
来匹配 /foo/bar/*
。
如需详细了解路径限制和格式匹配,请参阅网址映射文档。
(可选)监控服务的可用性和延迟时间
Google Cloud 拨测从用户的角度对应用进行黑盒监控,确定从多个外部 IP 到负载均衡器 IP 地址的延迟时间和可用性。相比之下, Google Cloud 健康检查会对 Pod IP 执行内部检查,确定实例级层的可用性。这两项检查是相辅相成的,它们可让您全面了解应用的运行状况。
您可以使用 Google Cloud 控制台、Cloud Monitoring API 或使用 Cloud Monitoring 客户端库来创建拨测。 如需了解相关信息,请参阅管理拨测。 如需使用 Google Cloud 控制台创建拨测,请执行以下操作:
前往 Google Cloud 控制台中的服务 Ingress 页面。
点击要为其创建拨测的 Service 的名称。
点击创建拨测。
在创建拨测窗格中,输入拨测的标题,然后点击下一步前往目标设置。
拨测的目标字段自动填充 Service 负载均衡器中的信息。
如需查看有关正常运行时间检查中所有字段的完整文档,请参阅创建正常运行时间检查。
点击下一步前往响应验证设置。
点击下一步前往提醒和通知部分。
如需监控拨测,您可以创建一个提醒政策或查看拨测信息中心。如果您的正常运行时间检查失败,提醒政策可以通过电子邮件或其他渠道通知您。如需了解有关提醒政策的常规信息,请参阅提醒简介。
点击创建。
备注
默认情况下,Ingress 通过在 /
路径上发出 GET
请求来执行定期健康检查,以确定应用的健康状况,并预期获得 HTTP 200 响应。如果要检查其他路径或预期获得其他响应代码,您可以使用自定义健康检查路径。
Ingress 支持更高级的用例,例如:
基于名称的虚拟托管:您可以使用 Ingress 对多个域名、子域名重复使用负载均衡器,并在单个 IP 地址和负载均衡器上公开多个 Service。如需了解如何为这些任务配置 Ingress,请查看简单扇出和基于名称的虚拟托管示例。
HTTPS 终止:您可使用 Cloud Load Balancing 负载均衡器配置 Ingress 来终止 HTTPS 流量。
删除 Ingress 后,GKE Ingress 控制器会自动清理相关资源(预留的静态 IP 地址除外)。