在OpenShift中正确暴露Flask应用:理解路由与Ingress服务

7次阅读

在 OpenShift 中正确暴露 Flask 应用:理解路由与 Ingress 服务

本教程详细阐述了在 openshift 环境中,如何通过 service 和 route 将运行在 pod 中的 flask 应用暴露给外部访问。核心在于理解 openshift 的 ingress 服务默认监听 80 和 443端口 ,外部用户应通过这些标准 端口 访问 路由,而非应用内部端口。文章将提供创建 service 和 route 的配置示例,并强调关键注意事项。

在 OpenShift 容器平台中部署 Web 应用时,确保其能够被外部访问是核心需求。对于运行在 Pod 内的 Flask 应用,这通常涉及 Service 和 Route 的配置。本文将指导您如何在 OpenShift 中正确地暴露一个 Flask 应用,重点解释 Ingress路由 的工作机制及其对外部访问端口的影响。

核心概念:OpenShift 路由与 Ingress 服务

OpenShift 的路由(Route)机制是其网络层的重要组成部分,它负责将外部流量引导至集群内部的服务。当您创建一个 Route 时,它实际上是由 OpenShift 的 Ingress 服务(也称为 Ingress router)来处理的。Ingress 服务作为集群的入口点,默认监听标准的http(80)和https(443)端口。

这意味着,无论您的 Flask 应用在 Pod 内部监听哪个端口(例如 5000),或者 Service 的 targetPort 配置为何,外部用户访问您的应用时,都将通过 Ingress 服务的 80 或 443 端口。Ingress 服务随后会将这些请求代理到您 Service 定义的 targetPort 上,最终转发到您的 Pod。因此,尝试通过 http://:5000 这样的方式访问 Route 是无效的,因为 Ingress 服务不在此端口监听外部请求。

步骤详解:暴露 Flask 应用

以下是暴露运行在 OpenShift Pod 中的 Flask 应用的具体步骤。

1. 确保 Flask 应用监听正确地址

您的 Flask 应用必须配置为监听所有网络 接口,以便 Pod 内部的服务可以访问它。通常,这意味着将 Flask 应用绑定到 0.0.0.0 地址。

# app.py from flask import Flask app = Flask(__name__)  @app.route('/') def hello_world():     return 'Hello from Flask in OpenShift!'  if __name__ == '__main__':     # 确保监听所有网络接口     app.run(host='0.0.0.0', port=5000)

2. 创建 Service

Service 是 OpenShift 中用于抽象一组 Pod 并提供稳定网络访问的方式。它将请求从 Route 转发到 后端Pod。创建一个 ClusterIP 类型的 Service,其 targetPort 应与 Flask 应用在 Pod 内部监听的端口一致(本例中为 5000)。

apiVersion: v1 kind: Service metadata:   name: flask-service spec:   selector:     # 确保这里的标签与您的 Pod 标签匹配     app: flask-app   ports:     - protocol: TCP       port: 5000 # Service 暴露的端口       targetPort: 5000 # Pod 内部 Flask 应用监听的端口   type: ClusterIP # 默认类型,Service 仅在集群内部可访问

请确保 selector 字段与您的 Pod 的标签匹配,这样 Service 才能正确地将流量路由到您的 Flask Pod。您可以使用 oc apply -f 命令创建此 Service。

3. 创建 Route

Route 是 OpenShift 中将 Service 暴露给外部世界的机制。它将外部流量(通过 Ingress 服务)路由到您的 Service。

apiVersion: route.openshift.io/v1 kind: Route metadata:   name: flask-route spec:   host: my-flask-app.apps.your-cluster.com # 替换为您的实际域名或 OpenShift 提供的默认域名   to:     kind: Service     name: flask-service # 引用上面创建的 Service     weight: 100   port:     targetPort: 5000 # 这里的 targetPort 应与 Service 的 port 字段匹配   # termination: edge # 可选:配置 TLS 加密,例如 edge, passthrough, reencrypt   wildcardPolicy: None

请注意,spec.port.targetPort 在这里指的是 Service 的端口(即 Service 定义中的 port: 5000),而不是外部访问的端口。Ingress 服务会监听 80/443 端口,并将请求转发到 flask-service 的 5000 端口。您可以使用 oc apply -f 命令创建此 Route。

访问方式

创建 Route 后,您可以通过 Route 的 host 字段定义的 URL 来访问您的 Flask 应用。由于 Ingress 服务监听 80 和 443 端口,您应该直接使用 HTTP 或 HTTPS 协议访问,而无需指定端口号:

  • 对于 HTTP 访问:http://my-flask-app.apps.your-cluster.com
  • 对于 HTTPS 访问(如果配置了 TLS 终止):https://my-flask-app.apps.your-cluster.com

例如,如果您的 Route 主机是 my-flask-app.apps.your-cluster.com,那么您只需在 浏览器 中输入或使用 curl 命令访问 http://my-flask-app.apps.your-cluster.com 即可。

注意事项

  • Flask 监听地址: 务必确保 Flask 应用在 Pod 内部监听 0.0.0.0,而不是 127.0.0.1,以便 Service 可以访问到它。
  • 端口匹配: Service 的 targetPort 必须与 Flask 应用实际监听的端口一致。Route 的 port.targetPort 则应与 Service 暴露的端口一致。
  • 外部访问端口: 外部访问始终通过 Ingress 服务的 80(HTTP)或 443(HTTPS)端口,无需在 URL 中指定应用内部端口。
  • TLS 配置: 如果需要 HTTPS 访问,可以在 Route 中配置 termination 字段,例如edge、passthrough 或 reencrypt,由 OpenShift Ingress 服务处理 TLS 证书和加密。
  • Route Host: Route 的 host 字段可以是 OpenShift 集群提供的默认域名,也可以是您自定义的域名,但后者需要相应的 dns 配置。

总结

在 OpenShift 中暴露 Flask 应用的关键在于理解 Ingress 服务作为流量入口的工作方式。通过正确配置 Service 将内部 Pod 端口映射到集群内端口,并创建 Route 将该 Service 暴露到外部,同时记住外部访问将通过标准的 80/443 端口,您就可以成功地让您的 Flask 应用对外提供服务。遵循这些步骤和注意事项,将有助于您避免常见的网络配置问题。

站长
版权声明:本站原创文章,由 站长 2025-12-13发表,共计2894字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
1a44ec70fbfb7ca70432d56d3e5ef742
text=ZqhQzanResources