OpenResty使用Lua实现动态路由,根据地址的路径路由到不同的K8s服务上。
# 添加 http 前的基础配置
worker_processes 1;
events {
worker_connections 65535;
}
http {
resolver kube-dns.kube-system.svc.cluster.local;
# resolver 8.8.8.8 8.8.4.4 valid=300s; # 使用Google的公共DNS服务器
resolver_timeout 10s; # 设置DNS解析超时时间为10秒
server {
listen 8000;
location / {
# 定义变量 target 并设置一个默认值
set $target "";
set $new_uri "";
# 使用 Lua 脚本动态生成目标上游地址
access_by_lua_block {
local uri = ngx.var.uri -- 获取请求的 URI
local match = string.match(uri, "^/game(%d+)")
if match then
local game_id = tonumber(match)
if game_id >= 1 and game_id <= 1000 then
-- 假设游戏服在 "default" 命名空间中,生成完整的 Kubernetes 服务地址
-- local upstream_url = "http://game" .. game_id .. ".default.svc.cluster.local"
local upstream_url = "http://127.0.0.1/game" .. game_id .. ".php"
ngx.var.target = upstream_url
ngx.var.new_uri = string.gsub(uri, "^/game" .. match, "")
else
-- 如果游戏服 ID 超出范围,返回 404
ngx.exit(404)
end
else
-- 如果请求不匹配 /gameN 格式,返回 404
ngx.exit(404)
end
}
# 将 Lua 变量 target 传递给 proxy_pass
proxy_pass $target$new_uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400; # 根据需要调整超时时间
}
}
}