我编写了一个在 Kubernetes pod 内运行 FastAPI 服务器的应用程序。与 pod 的外部通信通过单独的 pod 中的 nginx 入口控制器进行。我正在运行 nginx:1.17.0。
当它全部启动并运行时,我可以使用curl
调用通过入口地址与应用服务器交互,并在我的浏览器中访问所有简单的 GET 路径以及地址/openapi.json。如果我在 Kubernetes 中使用应用服务的内部 ip,我也可以访问交互式文档页面。但是,尝试访问交互式文档页面(address/docs#/default/)会给我一个关于/openapi.json的错误。
由于curl
调用按预期工作,我认为问题不一定在入口定义中,但使用应用程序的内部 ip 也可以正常工作,问题不应该在应用程序内部。
我在下面包含了入口定义文件。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.17.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: my-host.info
http:
paths:
- path: /server(/|$)(.*)
backend:
serviceName: my-app-service # This is the service that runs my fastAPI server pod
servicePort: 80
编辑
这是 service.yaml 文件
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
type: ClusterIP
selector:
app: server
ports:
- protocol: "TCP"
port: 80
targetPort: 80
由于该服务是我本地集群中的 ClusterIP,我可能可以直接使用它,但我还没有尝试过。当我卷曲时,我使用类似的命令
curl -X GET "http://my-host.info/server/subpath/" -H "accept: application/json"
curl -X POST "http://my-host.info/server/subpath/update/" -H "accept: application/json"
从本地集群外部。
这些是所有正在运行的服务:
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
default my-app-service ClusterIP 10.96.68.29 <none> 80/TCP 18h
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 28d
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.96.114.1 <none> 8000/TCP 28d
kubernetes-dashboard kubernetes-dashboard ClusterIP 10.96.249.255 <none> 80/TCP 28d
在我的/etc/hosts
文件中,我已将 10.0.0.1 (集群“外部”IP)连接到my-host.info。
关于为什么会发生这种情况的任何想法?