在K8s Ingress中添加额外的Path后,Swagger中Host URL的Port似乎消失了

Ock*_*Ock 7 swagger kubernetes

我有一个 Spring Boot 应用程序,它有一些端点,例如:产品/版本

然后我将应用程序部署到 K8s 网络并使用 Ingress 公开它,如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /productApp
        backend:
          serviceName: productappservice
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

我添加了一个入口路径,让我的应用程序在 my-host:8080/productApp/

Deployment配置中,我需要将额外的内容添加context-path到我的应用程序中,ConfigMap以便与入口公开的 URL 进行映射:

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: product-app
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: product-app
    spec:
      containers:
        - name: product-app
          image: my-docer-registry/product-app:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
          env:
            - name: server.servlet.context-path
              valueFrom:
                configMapKeyRef:
                  name: product-app-values
                  key: server.servlet.context-path

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: product-app-values
data:
   server.servlet.context-path: '/productApp'
Run Code Online (Sandbox Code Playgroud)

所以现在我的应用程序正在运行my-host:8080/productApp/,当我尝试调用 API ex: 时my-host:8080/productApp/product/version,它运行良好。

当我与 Swagger 一起工作时,问题就出现了。我大摇大摆:my-host:8080/productApp/swagger-ui.html当我尝试调用product/versionAPI 时,它返回TypeError: Failed to fetch. 然后我意识到 swagger 发送请求的主机 URL 不再是my-host:8080,它只是my-host

curl -X GET " http://my-host/productApp/product/version " -H "accept: application/json;charset=UTF-8"

这是示例json:

{
    "swagger": "2.0",
    "info": {
        "version": "0.0.1-SNAPSHOT",
        "title": "Product App REST API"
    },
    "host": "my-host",
    "basePath": "/productApp",
    "tags": [{
        "name": "Product App API",
        "description": "REST API of Product App"
    },
    {
        "name": "version API",
        "description": "Version information of application and REST API"
    }],
    "paths": {
        .....
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里期望的是主机 URL 应该是my-host:8080,而不是 only my-host,这就是 swagger 中的请求无法发送的原因。

有谁知道如何解决这个问题。先谢谢了!

小智 1

我在使用的时候也遇到了类似的问题Istio Ingress。我通过使用 Nginx 代理并在 Nginx 配置文件中设置X-Forwarded-HostX-Forwarded-Port请求标头来解决这个问题,让 Swagger 知道正确的地址。