我正在学习 Kong API Gateway,特别是使用 Kong Ingress Controller 在 Kubernetes 上安装,并且我已经完成了本教程。
我发送的HTTP请求:
GET 127.0.0.1:80/weather/London
服务接收到的 HTTP 请求:
GET 127.0.0.1:3000/London
向 Kong 服务发送 HTTP 请求时,如何路由请求,以便保留 URL 的完整路径,而不剥离第一部分 (
/weather
)?
我正在尝试创建一个 Node.js 微服务,它提供一个 API 来检索天气:使用 /weather/:countryName 调用该 API,并返回包含天气信息的 JSON(使用 OpenWeatherAPIs)。
发送以下请求
curl -i localhost:3000/weather/London
返回以下 JSON:
{
"cityName": "London (GB)",
"temperature": {
"actual": 14.31,
"min": 12.56,
"max": 15.71
},
"humidity": 81,
"windSpeed": 3.09,
"description": "broken clouds",
"iconURL": "http://openweathermap.org/img/wn/[email protected]"
}
我的设置是我之前链接的教程中的设置:
文件
weather.yml
:
apiVersion: v1
kind: Service
metadata:
labels:
app: weather
name: weather
spec:
ports:
- port: 1025
name: tcp
protocol: TCP
targetPort: 1025
- port: 1026
name: udp
protocol: TCP
targetPort: 1026
- port: 3000
name: http
protocol: TCP
targetPort: 3000
selector:
app: weather
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: weather
name: weather
spec:
replicas: 1
selector:
matchLabels:
app: weather
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: weather
spec:
containers:
- image: mikyll/api-weather:v1.0
name: weather
ports:
- containerPort: 3000
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
resources: {}
适用于
cat .\weather.yml | kubectl apply -f -
文件
weather-routing.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: weather-route
annotations:
konghq.com/strip-path: 'false'
spec:
ingressClassName: kong
rules:
- http:
paths:
- path: /weather
pathType: ImplementationSpecific
backend:
service:
name: weather
port:
number: 3000
适用于
cat .\weather-routing.yml | kubectl apply -f -
当我向代理发送请求时,调用服务时 URL 的第一部分将被删除:
curl -i 127.0.0.1:80/weather/London
给出以下结果:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot GET /London</pre>
</body>
</html>
如何传递相同的路径,而不将第一部分 (
/weather
) 剥离到服务?
原来问题是我错误地创建了2条路线: “天气”和“天气路线”:
PS D:\kong-kubernetes> kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
weather kong * 127.0.0.1 80 3h9m
weather-route kong * 127.0.0.1 80 25m
因此,在编辑“天气路线”时,即使我将
konghq.com/strip-path
设置为 'false'
,其他路线规则也将其设置为 'true'
并且较早应用,导致请求失败。
删除它解决了问题:
kubectl delete ingress weather
PS D:\kong-kubernetes> kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
weather-route kong * 127.0.0.1 80 25m
HTTP 请求:
PS D:\kong-kubernetes> curl -i $PROXY_IP/weather/London
{
"cityName": "London (GB)",
"temperature": {
"actual": 14.53,
"min": 12.64,
"max": 15.76
},
"humidity": 79,
"windSpeed": 5.66,
"description": "scattered clouds",
"iconURL": "http://openweathermap.org/img/wn/[email protected]"
}
特别感谢Botje让我注意到第一个最重要的问题:)