【实战】OpenShift OKD 路由与负载均衡完全指南:Route vs Ingress

【实战】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-projectoc 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 的“一键部署”神技。它会自动检测镜像并生成运行所需的所有资源。
  • 后台动作:创建了 DeploymentService。由于镜像默认暴露了 8080 端口,OpenShift 自动创建了一个 ClusterIP 类型的 Service。
  • 当前状态:应用已在 Pod 中运行,拥有稳定的内网 IP,但外部网络尚无法访问

步骤 2:暴露外部路由 (oc expose)

为了让集群外的浏览器能够访问,我们需要创建一个 Route。

执行命令:

oc expose service hello-route

【命令详解】

  • 作用:将集群内部 Service “暴露”给外部世界。
  • 后台动作
    1. OpenShift 创建了一个 Route 资源对象。
    2. 集群内置的 Router (HAProxy) 组件检测到新路由,动态更新其转发规则。
    3. 自动分配一个默认域名。
  • 当前状态:你可以通过生成的域名从外部访问应用了。

步骤 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 控制台界面(直观)
  1. 登录 Web 控制台,在左侧导航栏点击 Networking -> Routes
  2. 确保顶部的 Project 选择了 demo-routing
  3. 点击右上角的 Create Route 按钮。
  4. 填写以下关键信息:
    • Name: route-site-b
    • Hostname: site-b.example.com (自定义域名)
    • Service: 在下拉菜单中选择 hello-route
    • Target Port: 选择 8080 -> 8080 (TCP)
  5. 点击底部的 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 RouteKubernetes Ingress
层级应用层(Layer 7)应用层(Layer 7)
底层实现集群内置 HAProxy Router需额外安装 Controller (如 Nginx)
便捷性极高,oc expose 自动关联一般,需手动编写较复杂的 YAML
高级特性原生支持 TLS 卸载策略依赖具体实现插件的 Annotation
适用场景OpenShift 环境内的首选方式跨 Kubernetes 平台的通用方案

5. 流量转发全流程图

1. 访问域名
2. 指向
3. 端口 80/443
4. 匹配 Host 域名
5. 转发给
6. 负载均衡分发
6. 负载均衡分发
6. 负载均衡分发

用户浏览器

本地 Hosts/DNS 解析

集群入口 IP / Router IP

Router HAProxy Pod

Route 资源配置

Service 资源

Pod 实例 1

Pod 实例 2

Pod 实例 3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值