F5 VIP 上线全流程:Pool / VS / Profile 三板斧(附实操 CheckList)

上篇我们理清了 F5 的整体框架,这篇直接上手实操。

学完这篇,你就能独立完成一个 HTTPS VIP 从零到上线的全流程。

三个核心概念一句话

组件 一句话 类比
Virtual Server (VS) 对外暴露的 VIP:Port,所有流量的入口 公司的前台大门
Pool 后端服务器的集合,决定流量转发给谁 坐在工位上的员工
Profile 协议处理模板,决定流量怎么处理 接待流程:登记录入 → 访客卡 → 引导

它们的关系:VS 绑定 Pool + Profile,来一个请求就按 Profile 规定的流程处理,然后转发给 Pool 里的某个 Member。

准备工作:先确认六个问题

动手前,先问清楚这六个问题,少一个都可能让上线失败:

确认项 说明 示例
VIP 地址 从地址池申请,确认不冲突 10.0.0.100
端口 4 层(TCP/UDP)还是 7 层(HTTP/HTTPS) 443
协议 TCP / HTTP / HTTPS HTTPS
后端地址列表 IP:Port,确认后端存活 10.0.0.10:80, 10.0.0.11:80
是否需要 SSL 证书是否已上传 F5 RSA 还是 ECC?通配符还是单域名?
所属 Partition 和业务线的隔离一致 /Common/production-app

第一步:上传证书(仅 HTTPS 需要)

复制代码
# tmsh 导入证书和密钥
tmsh install sys crypto cert myapp.crt from-local-file /shared/tmp/your.crt
tmsh install sys crypto key myapp.key from-local-file /shared/tmp/your.key
tmsh install sys crypto ca-bundle myapp-ca.crt from-local-file /shared/tmp/ca.crt

也可在 GUI → System → File Management → SSL Certificate List → Import 上传。

验证证书已上传:

复制代码
tmsh list sys crypto cert myapp.crt
# 应看到有效期、Subject、Issuer 等信息

第二步:创建健康检查 Monitor

Monitor 决定了一个后端 Member 是活的还是死的。

选型规则:

复制代码
业务类型        推荐的 Monitor
────────────────────────────────
TCP 端口服务     tcp(只检查端口是否 Listen)
HTTP 页面        http(检查 HTTP 200)
HTTPS 页面       https(走 TLS 检查)

创建 HTTP Monitor(最常用):

复制代码
tmsh create ltm monitor http myapp-monitor \
    interval 10 \
    timeout 31 \
    time-until-up 0 \
    send "GET /health HTTP/1.1\r\nHost: myapp.local\r\nConnection: close\r\n\r\n" \
    recv "200 OK"

参数说明------这里是新手最容易踩坑的地方:

复制代码
参数              推荐值        说明
──────────────────────────────────────────
interval          5~30         每次探测间隔(秒)
timeout          interval×3+1  F5 官方公式:超时 = 间隔 × 3 + 1
time-until-up    0~60          启动后等几秒再标记 up(防止刚重启误判)
send             请求内容      写 GET /health,TCP 不用写
recv             期望响应       响应包含此字符串才算 up

重要规则:timeout 必须大于 interval,否则 F5 会报错。 F5 推荐公式:timeout = interval × 3 + 1

第三步:创建 Node(节点)

这一步是新手最容易忽略的步骤,但理解 Node 和 Member 的区别是理解 F5 对象模型的关键。

Node vs Member ------ 核心区别

概念 Node(节点) Member(成员)
定义 一台物理/虚拟机的 IP 地址,是 F5 中的独立资源 Node + 端口的组合,属于某个 Pool
粒度 IP 级别(如 10.0.0.10 IP:Port 级别(如 10.0.0.10:80
创建时机 可提前创建,也可在 Pool 创建时自动创建 创建 Pool 时指定
独立性 是独立的对象,不依赖 Pool 存在 依赖于 Pool,离开 Pool 无意义
共享关系 一个 Node 可以被多个 Pool 引用 一个 Member 只能属于一个 Pool

用一个类比帮助理解:

复制代码
Node → 一栋楼(固定地址)
Member → 这栋楼里的一个房间(地址 + 门牌号)
Pool → 你在这个小区里的所有房产列表
​
10.0.0.10  ── 一个 Node(一栋楼)
  ├─ 10.0.0.10:80  ── 一个 Member(属于 Pool A)
  └─ 10.0.0.10:443 ── 另一个 Member(属于 Pool B,同一个 Node)

关键理解:Node 是底层 IP 资源,Member 是"Node + 端口 + 所属 Pool"的逻辑组合。

  • 一个 Node 可以有多个不同端口的 Member,分属不同的 Pool

  • 在 GUI 中:看到 Node 的状态是全局的,Member 的状态只代表该端口在该 Pool 中的状态

提前创建 Node(推荐------让对象模型更清晰)

复制代码
tmsh create ltm node 10.0.0.10 address 10.0.0.10
tmsh create ltm node 10.0.0.11 address 10.0.0.11

也可以不预先创建,在下一步创建 Pool 时 F5 会自动创建对应 Node(详见第四步的"两种方式")。

验证 Node 已注册:

复制代码
tmsh show ltm node
# 应列出所有已注册的 Node 及其状态

第四步:创建 Pool(服务器池)

两种创建方式

方式一:引用已创建的 Node(推荐)

复制代码
tmsh create ltm pool myapp-pool \
    load-balancing-mode least-connections-member \
    monitor myapp-monitor \
    members add { \
        10.0.0.10:80 { address 10.0.0.10 } \
        10.0.0.11:80 { address 10.0.0.11 } \
    }

方式二:一步到位(Node 自动创建)

复制代码
tmsh create ltm pool myapp-pool \
    load-balancing-mode least-connections-member \
    monitor myapp-monitor \
    members add { \
        10.0.0.10:80 {} \
        10.0.0.11:80 {} \
    }
# 如果 Node 10.0.0.10 和 10.0.0.11 还不存在,F5 会自动创建

两种方式的区别:

方式一(先创建 Node) 方式二(自动创建 Node)
明确性 Node 先独立存在,对象间关系一目了然 Node 随 Pool 自动产生,不直观
复用性 同一个 Node 可被多个 Pool 引用,提前注册即可 自动创建的 Node 也可被后续 Pool 引用
推荐场景 生产环境、长期维护 快速测试、临时创建

生产环境推荐方式一。 提前创建 Node 能让你在 F5 上看到清晰的 IP 资源视图,便于后面做全局排障和统计。

负载均衡算法选哪个?

算法 使用场景
round-robin 后端配置一致,通用场景
least-connections-member 长连接 / WebSocket(推荐
ratio-member 后端性能不均,按权重分
fastest 后端分布在各地,选响应最快的

新手黄金法则:后端配置一样用 round-robin,长连接业务用 least-connections-member。

验证 Pool 状态:

复制代码
tmsh show ltm pool myapp-pool
# 重点看:
#   Status: available         → 绿色,正常
#   Active Member Count: 2    → 有 2 个 Member 在线

注意:新建 Pool 后前几秒 Member 是红色(unknown)的。 等一个 Monitor 周期后自动变绿(up)或变红(down)。不要一上来就以为配错了。

第五步:创建 Profile

一个 HTTPS VS 通常需要这 4 个 Profile:

5.1 TCP Profile

复制代码
tmsh create ltm profile tcp myapp-tcp \
    idle-timeout 300 \
    keep-alive-interval 10 \
    reset-on-timeout enabled \
    time-wait-recycle enabled \
    nagle disabled

5.2 HTTP Profile

复制代码
tmsh create ltm profile http myapp-http \
    xforwarded-for enabled \
    reset-on-timeout disabled

xforwarded-for enabled 会插入 X-Forwarded-For 头,让后端知道客户端真实 IP。强烈建议打开。

5.3 OneConnect Profile(连接复用)

复制代码
tmsh create ltm profile oneconnect myapp-oneconnect \
    idle-timeout-override 60 \
    max-age 60 \
    max-reuse 0 \
    source-prefix-length 32

OneConnect 让多个客户端复用和后端之间的 TCP 连接,减少三次握手开销。HTTP 业务强烈推荐打开。

5.4 SSL Client Profile(证书卸载)

复制代码
tmsh create ltm profile client-ssl myapp-clientssl \
    cert myapp.crt \
    key myapp.key \
    chain myapp-ca.crt \
    ciphers DEFAULT:!SSLv3:!TLSv1 \
    options { dont-insert-empty-fragments }

这个 Profile 负责接收客户端 HTTPS、解密成明文,然后转发给后端(后端走 HTTP,不用算加密)。

第六步:创建 Virtual Server

前面的所有东西最终都绑在这里:

复制代码
tmsh create ltm virtual myapp-vip-443 \
    destination 10.0.0.100:443 \
    ip-protocol tcp \
    mask 255.255.255.255 \
    profiles add { \
        myapp-tcp { context all } \
        myapp-http { context all } \
        myapp-clientssl { context clientside } \
        myapp-oneconnect { context serverside } \
    } \
    pool myapp-pool \
    source-address-translation { type automap } \
    source 0.0.0.0/0 \
    vlans-enabled \
    vlans add { /Common/internal }

注意:这里没配 serverssl 的 SSL Profile,因为我们做的是 SSL 卸载 ------ F5 解密,后端走明文 HTTP。

创建后必检查:

复制代码
# 状态检查
tmsh show ltm virtual myapp-vip-443
# Status: Green / Available 才对
​
# 看绑了哪些 Profiles
tmsh list ltm virtual myapp-vip-443 profiles
​
# 看指向哪个 Pool
tmsh list ltm virtual myapp-vip-443 pool
​
# 看 VLAN 限制
tmsh list ltm virtual myapp-vip-443 vlans

第七步:验证------5 项测试

7.1 连通性测试

复制代码
nc -zv 10.0.0.100 443
# 应输出 Connection succeeded!

7.2 HTTPS 证书测试

复制代码
openssl s_client -connect 10.0.0.100:443 -servername 10.0.0.100 -showcerts
# 重点关注:
#   Certificate chain  → 链是否完整
#   Verify return code: 0 (ok)

7.3 HTTP 请求测试

复制代码
curl -k -I https://10.0.0.100/
# 应返回 200 OK
​
# 检查 F5 插入的请求头
curl -k -v https://10.0.0.100/ 2>&1 | grep -i "x-forwarded-for"

7.4 负载均衡效果

复制代码
for i in {1..5}; do
    echo "Request $i:"
    curl -k -s -o /dev/null -w "HTTP %{http_code} | Time: %{time_total}s\n" https://10.0.0.100/
done

7.5 故障切换

复制代码
# 禁用一个 Member,观察流量是否切换到另一个
tmsh modify ltm pool myapp-pool members modify { 10.0.0.10:80 { session user-disabled } }
​
# 再次请求,应该还能正常返回(流量走另一个 Member)
curl -k -s https://10.0.0.100/
​
# 恢复
tmsh modify ltm pool myapp-pool members modify { 10.0.0.10:80 { session user-enabled } }

第九步:保存配置

F5 不会自动保存配置!改完必须手动保存。

复制代码
tmsh save sys config

重大变更前建议备份全量配置:

复制代码
tmsh save sys ucs /shared/tmp/backup-$(date +%Y%m%d).ucs

九步 Checklist 速查

复制代码
□ 前置确认:VIP/端口/协议/后端/SSL/Partition 六问
□ 上传证书(HTTPS 业务)
□ 创建 Monitor(interval × 3 + 1 = timeout)
□ 创建 Node(理解 Node ≠ Member)
□ 创建 Pool(选 LB 算法 + Members + Monitor)
□ 创建 Profile(TCP + HTTP + OneConnect + SSL)
□ 创建 VS(绑定 Pool + Profiles + SNAT + VLAN)
□ 五步验证(连通 + 证书 + 请求 + 负载 + 故障切换)
□ 保存配置(F5 不会自动保存!)

新手高频踩坑汇总

症状 原因 解决
VS 状态 available 但连不上 SNAT 没开 / VLAN 没配对 snat automap,检查 vlans
Member 一直红色 down Monitor 配置不对 / 后端没开机 send 字符串,检查后端服务
TCP 能连但请求卡住超时 SNAT 没开,后端回包找不到路 source-address-translation { type automap }
HTTPS 握手失败 证书名拼错 / Key 和证书不匹配 tmsh list sys crypto 检查
请求返回 502 某个 Member 已挂但 Monitor 没踢掉 调小 interval 加速检测
请求很慢 OneConnect 没开,TCP 不断重建 加上 OneConnect Profile
配了半天流量不进来 没保存! tmsh save sys config

小结

这篇是 F5 学习系列的第二篇,也是最核心的一篇。掌握 Pool / VS / Profile 这三板斧,你就能独立完成一个 HTTPS VIP 从创建到上线的全流程。

这篇提到的其他模块------Monitor、SSL Profile、iRules、监控指标------后续会一篇一篇展开,欢迎持续关注。

相关阅读:

  • F5 BIG-IP 学习路线:一张图理清核心技术与架构关系(上一篇)

  • F5 健康检查 Monitor 深入篇(下一篇,敬请期待)