如何使用服务名称在 Kubernetes 集群中通信 Swagger UI 和 API?

How to communicate Swagger UI and API in Kubernetes cluster using service names?

我有一个 node.js API 运行 在一个容器内的 Kubernetes 集群上的 Docker 容器中。 pod 已连接到 LoadBalancer 类型的 Kubernetes 服务,因此我可以从外部连接到它,也可以从 Swagger UI 连接到它,方法是传递到另一个 运行 的 Swagger UI Docker 同一 Kubernetes 集群上的容器 API IP 地址 http://<API IP address>:<port>/swagger.json.

但在我的例子中,我想通过 Swagger UI 调用 API 端点,使用这样的服务名称 api-service.default:<port>/swagger.json 而不是使用外部 API IP地址。

对于 Swagger UI 我正在使用最新版本的 swaggerapi/swagger-ui docker 图片来自这里:https://hub.docker.com/r/swaggerapi/swagger-ui

如果我尝试将 api-service.default:<port>/swagger.json 分配给 Swagger-UI 容器环境变量,则 Swagger UI 结果为:加载失败 API定义

我想这很明显,因为浏览器无法识别内部集群服务名称。

有什么方法可以使用服务名称在 Kubernetes 集群中与 Swagger UI 和 API 通信吗?

---附加说明---

Swagger UI CORS 错误在这种情况下具有误导性。我正在使用来自许多其他服务的 API。

我还使用 cURL 测试了 API CORS。

我假设 pod 中的 swagger-ui 容器可以解析该内部集群服务名称,但浏览器不能,因为浏览器在我的 Kubernetes 集群之外运行。

在我的其他 Web 服务 运行在浏览器中(在我的集群之外)在 nginx 上服务,它也使用这个 API,我使用 nginx 反向代理机制。

https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

此机制将从浏览器级别调用的我的 API 请求重定向到内部集群服务名称:api-service.default:8080,其中 nginx 服务器实际上是 运行ning。我的意思是 nginx 在集群上是 运行nig,浏览器不是。

不幸的是,我不知道如何在那个大摇大摆的 ui 案例中实现这一目标。

Swagger mainfest 文件:

# SERVICE
apiVersion: v1
kind: Service
metadata:
  name: swagger-service
  labels:
    kind: swagger-service
spec:
  selector:
    tier: api-documentation
  ports:
    - protocol: 'TCP'
      port: 80
      targetPort: 8080
  type: LoadBalancer
---
# DEPLOYMENT
apiVersion: apps/v1
kind: Deployment
metadata:
  name: swagger-deployment
  labels:
    kind: swagger-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      tier: api-documentation
  template:
    metadata:
      labels:
        tier: api-documentation
    spec:
      containers:
        - name: swagger
          image: swaggerapi/swagger-ui
          imagePullPolicy: Always
          env:
            - name: URL
              value: 'http://api-service.default:8080/swagger.json'

API 清单文件:

# SERVICE
apiVersion: v1
kind: Service
metadata:
  name: api-service
  labels:
    kind: api-service
spec:
  selector:
    tier: backend
  ports:
    - protocol: 'TCP'
      port: 8080
      targetPort: 8080
  type: LoadBalancer
---
# DEPLOYMENT
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
  labels:
    kind: api-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      tier: backend
  template:
    metadata:
      labels:
        tier: backend
    spec:
      containers:
        - name: api
          image: <my-api-image>:latest

我通过将 nginx 反向代理添加到 swagger UI 容器中的 /etc/nginx/nginx.conf 文件来解决它,它将所有以 /swagger.json 结尾的请求重定向到 API 服务.

此文件更改后,您需要重新加载 nginx 服务器:nginx -s reload

server {
    listen            8080;
    server_name       localhost;
    index             index.html index.htm;
    
    location /swagger.json {
      proxy_pass http://api-service.default:8080/swagger.json;
    }

    location / {
      absolute_redirect off;
      alias            /usr/share/nginx/html/;
      expires 1d;

      location ~* \.(?:json|yml|yaml)$ {
        #SWAGGER_ROOT
        expires -1;

        include cors.conf;
      }

      include cors.conf;
    }

重要 仅将 /swagger.json 分配给 SwaggerUI 容器的 ENV。这是强制性的,因为请求必须路由到 nginx 才能得到解决。

Swagger 清单

# SERVICE
apiVersion: v1
kind: Service
metadata:
  name: swagger-service
  labels:
    kind: swagger-service
spec:
  selector:
    tier: api-documentation
  ports:
    - protocol: 'TCP'
      port: 80
      targetPort: 8080
  type: LoadBalancer
---
# DEPLOYMENT
apiVersion: apps/v1
kind: Deployment
metadata:
  name: swagger-deployment
  labels:
    kind: swagger-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      tier: api-documentation
  template:
    metadata:
      labels:
        tier: api-documentation
    spec:
      containers:
        - name: swagger
          image: swaggerapi/swagger-ui
          imagePullPolicy: Always
          env:
            - name: URL
              value: '/swagger.json'