如何在Kubernetes集群中让Swagger UI通过内部服务名与API通信
根因说明
你遇到的问题本质是Swagger UI为纯前端静态应用,所有拉取swagger配置、调用API接口的请求均是由用户侧浏览器(运行在K8s集群外部)发起,而非Swagger UI所在的Pod发起。因此即便Pod可以正常解析集群内部服务名,外部浏览器也无法识别api-service.default这类内部DNS记录,才会出现加载失败的报错,此时返回的CORS错误属于请求失败后的误导性提示,和API本身的CORS配置无关。
可行解决方案
方案1:同Pod部署Nginx反向代理(和你现有其他Web服务的实现逻辑一致)
在Swagger UI的同一个Pod内新增Nginx容器作为反向代理,将浏览器发往Swagger服务的特定路径请求转发到内部API服务:
- 先创建ConfigMap存储Nginx配置:
apiVersion: v1 kind: ConfigMap metadata: name: swagger-nginx-config data: nginx.conf: | events {} http { server { listen 8080; # 处理Swagger UI静态资源请求 location / { proxy_pass http://localhost:80; } # 处理API相关请求,转发到内部服务名 location /api/ { proxy_pass http://api-service.default:8080/; } } }
- 修改Swagger UI的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: # 原Swagger UI容器,端口调整为仅本地监听80 - name: swagger image: swaggerapi/swagger-ui imagePullPolicy: Always env: # 改为相对路径,通过Nginx转发 - name: URL value: '/api/swagger.json' ports: - containerPort: 80 name: swagger-port # 新增Nginx反向代理容器 - name: nginx-proxy image: nginx:alpine volumeMounts: - name: nginx-config mountPath: /etc/nginx/nginx.conf subPath: nginx.conf ports: - containerPort: 8080 name: nginx-port volumes: - name: nginx-config configMap: name: swagger-nginx-config
- 调整Swagger Service的targetPort指向Nginx的8080端口即可。此时浏览器的所有API相关请求都会先到集群内的Nginx,由Nginx转发到内部服务名,完美复用你现有方案的逻辑。
方案2:通过Ingress统一暴露服务
如果集群内已经部署了Ingress控制器,可以分别给Swagger UI和API配置Ingress规则,用公网可解析的不同路径/子域名对外暴露,直接将Swagger的URL配置为API的公网访问地址即可,无需额外修改服务配置。
内容的提问来源于stack exchange,提问作者Mikolaj
相关产品推荐
相关产品推荐

