Kong Ingress Controller:防止在将请求路由到服务时剥离路径

问题描述 投票:0回答:1

我正在学习 Kong API Gateway,特别是使用 Kong Ingress Controller 在 Kubernetes 上安装,并且我已经完成了本教程

TL;博士

我发送的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]"
}

金刚

我的设置是我之前链接的教程中的设置:

  • 带有 minikube 的本地集群;
  • minikube 隧道(docker 驱动程序)在后台运行;

服务和部署资源

文件

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
) 剥离到服务?

kubernetes api-gateway kong ingress-controller kong-ingress
1个回答
0
投票

原来问题是我错误地创建了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让我注意到第一个最重要的问题:)

© www.soinside.com 2019 - 2024. All rights reserved.