【实战】OpenShift/OKD 路由与负载均衡完全指南:Route vs Ingress
前言:
在 Kubernetes 原生世界中,我们通常使用Ingress来暴露服务。而在 OpenShift/OKD 生态中,诞生了更早且功能更强大的Route对象。
本文将带你在 OpenShift/OKD 集群上,通过实战深入理解两者的区别,并亲手验证负载均衡效果。
1. 核心组件概念速览
在开始敲命令前,先建立三个核心概念的认知:
- Deployment (部署):负责管理应用运行(定义镜像、副本数)。
- Service (服务):集群内部的负载均衡器,提供固定的内网 IP。
- Route (路由):集群外部的入口,分配域名,将外部流量引入 Service。
2. 实战演练:从部署到负载均衡
我们将按照一个应用上线的真实生命周期,一步步执行命令并解析其原理。
步骤 0:环境准备
首先,我们需要一个干净的实验环境。
# 1. 登录集群
oc login -u <username> -p <password>
# 2. 创建新项目 (Namespace)
oc new-project demo-routing
【进阶知识:项目(Namespace)的自动选择】
在执行后续命令(如 oc new-app)时,你会发现我们没有显式指定项目名称。这是因为 oc 命令行工具拥有“上下文记忆”:
- 当前项目:当你执行
oc new-project或oc project <name>时,oc会自动将该项目设为“活动状态”。 - 如何查看:运行
oc project命令,它会告诉你当前正在操作哪个项目。 - 如何强制指定:在任何命令后添加
-n <项目名>参数,可以覆盖当前默认设置。
步骤 1:部署应用 (oc new-app)
我们部署一个名为 hello-route 的应用,它会打印出当前的 Pod 主机名,方便后续测试负载均衡。
执行命令:
# 使用官方 Quay.io 镜像,避免短名称拉取错误
oc new-app quay.io/openshift/origin-hello-openshift --name=hello-route
【命令详解】
- 作用:这是 OpenShift 的“一键部署”神技。它会自动检测镜像并生成运行所需的所有资源。
- 后台动作:创建了 Deployment 和 Service。由于镜像默认暴露了 8080 端口,OpenShift 自动创建了一个 ClusterIP 类型的 Service。
- 当前状态:应用已在 Pod 中运行,拥有稳定的内网 IP,但外部网络尚无法访问。
步骤 2:暴露外部路由 (oc expose)
为了让集群外的浏览器能够访问,我们需要创建一个 Route。
执行命令:
oc expose service hello-route
【命令详解】
- 作用:将集群内部 Service “暴露”给外部世界。
- 后台动作:
- OpenShift 创建了一个 Route 资源对象。
- 集群内置的 Router (HAProxy) 组件检测到新路由,动态更新其转发规则。
- 自动分配一个默认域名。
- 当前状态:你可以通过生成的域名从外部访问应用了。
步骤 3:配置多域名路由 (自定义 Route)
在生产环境中,通常需要使用自定义域名。我们将演示如何通过两种方式配置多个域名指向同一个后端 Service。
方案 A:YAML 命令行方式(高效)
创建 route-custom.yaml 文件:
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: route-site-a
spec:
host: site-a.example.com
to:
kind: Service
name: hello-route
port:
targetPort: 8080-tcp
应用配置:oc apply -f route-custom.yaml
方案 B:Web 控制台界面(直观)
- 登录 Web 控制台,在左侧导航栏点击 Networking -> Routes。
- 确保顶部的 Project 选择了 demo-routing。
- 点击右上角的 Create Route 按钮。
- 填写以下关键信息:
- Name:
route-site-b - Hostname:
site-b.example.com(自定义域名) - Service: 在下拉菜单中选择
hello-route。 - Target Port: 选择
8080 -> 8080 (TCP)。
- Name:
- 点击底部的 Create 按钮。
本地 DNS 映射 (模拟):
修改本地电脑的 hosts 文件,将域名指向集群入口 IP:
<集群入口IP> site-a.example.com
<集群入口IP> site-b.example.com
步骤 4:验证负载均衡 (oc scale)
现在应用只有一个副本,我们通过扩容来观察流量分发效果。
执行命令:
# 将副本数扩展到 3 个
oc scale deployment/hello-route --replicas=3
【命令详解】
- 作用:动态调整应用实例的数量。
- 后台动作:Deployment 启动新 Pod,Service 发现新 IP,Router 实时更新负载均衡池。
测试效果:
在终端运行循环请求命令,观察输出中的 Pod 名称变化:
for i in {1..5}; do curl -s http://site-a.example.com | grep "Hello OpenShift"; done
你会发现请求被均匀地分发到了不同的 Pod 实例上。
3. 【进阶技巧】自定义负载均衡策略
默认情况下,OpenShift Route 使用 leastconn (最少连接数) 策略。但如果你想修改它,可以通过 Annotation 实现。
3.1 支持的策略
leastconn(默认):分发给当前连接数最少的 Pod。适合长连接。roundrobin(轮询):严格轮流分发。适合短连接。source(源 IP 哈希):同一个用户的请求固定到同一个 Pod。
3.2 如何修改?
# 将策略修改为 "roundrobin"
oc annotate route route-site-a haproxy.router.openshift.io/balance=roundrobin
4. 总结:Route 与 Ingress 对比
| 特性 | OpenShift Route | Kubernetes Ingress |
|---|---|---|
| 层级 | 应用层(Layer 7) | 应用层(Layer 7) |
| 底层实现 | 集群内置 HAProxy Router | 需额外安装 Controller (如 Nginx) |
| 便捷性 | 极高,oc expose 自动关联 | 一般,需手动编写较复杂的 YAML |
| 高级特性 | 原生支持 TLS 卸载策略 | 依赖具体实现插件的 Annotation |
| 适用场景 | OpenShift 环境内的首选方式 | 跨 Kubernetes 平台的通用方案 |
1787

被折叠的 条评论
为什么被折叠?



