我有一个简单的 python Flask 应用程序,名为 hwrequest。我可以从 PyCharm IDE 运行它并且工作正常。 我使用以下 Dockerfile 对该应用程序进行了 docker 化
FROM python:3.8-alpine
LABEL maintainer="John Smith, <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ddb7b2b5b3f3aeb0b4a9b59db0a4beb2b0adbcb3a4f3beb2b0" rel="noreferrer noopener nofollow">[email protected]</a>"
RUN apk update && apk add bash curl
COPY . /hwrequest
WORKDIR /hwrequest
RUN pip install -r app/requirements.txt
EXPOSE 5000
ENTRYPOINT ["python"]
CMD ["/hwrequest/app/app.py"]
我可以将-it执行到容器中,当我成功调用时curl 127.0.0.1:5000
现在我正在尝试将此应用程序部署到 Kubernetes 并通过 Ingress 公开它。
这是我的 YAML 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: "hwrequest"
name: "hwrequest"
spec:
replicas: 1
selector:
matchLabels:
app: "hwrequest"
template:
metadata:
labels:
app: "hwrequest"
spec:
containers:
- name: "hwrequest"
image: "myregistry.com/hwrequest:0.0.4"
imagePullPolicy: Always
ports:
- containerPort: 5000
apiVersion: v1
kind: Service
metadata:
name: "hwrequest"
labels:
app: "hwrequest"
spec:
type: ClusterIP
ports:
- port: 5000
targetPort: 5000
selector:
app: "hwrequest"
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: "hwrequest"
spec:
rules:
- http:
paths:
- backend:
serviceName: "hwrequest"
servicePort: 5000
host: "hwrequest.mycompany.com"
当我调用 curl hwrequest.mycompany.com
时,我收到 502 Bad Gateway
我做错了什么?
最佳答案
使用 ingress 在 kubernetes 上公开任何应用程序都是一项艰巨的任务,这里有一些需要注意的事项
- 确保应用程序正在监听
0.0.0.0
而不是127.0.0.1
- curl 请求应包含
Host
header 即-H "Host: hwrequest.mycompany.com"
因为这是入口 Controller 如何根据入口资源中定义的规则知道要应用哪个规则的方式。 - 需要有一个入口 Controller ,例如在集群中运行的 nginx,并且入口 Controller Pod 需要通过
NodePort
公开或LoadBalancer
类型 service 或可以使用hostNetwork: true
进行部署 - 您需要使用
NODEIP
(kubernetes 节点)和NODEPORT
在 curl 中如果NodePort
使用了服务,因此它看起来像curl http://<NODEIP>:NODEPORT -H "Host: hwrequest.mycompany.com"
.
如果您使用hostNetwork
要公开 nginx 入口 Controller pod,那么curl 应该是curl http://-H "Host: hwrequest.mycompany.com"`
如果您使用LoadBalancer
类型服务(适用于AWS、Azure、GCP等云提供商)然后curl应该是curl http://-H“Host:hwrequest.mycompany.com”`
如果您刚刚开始,我建议您看看这个 guide关于在 Minikube 上使用 nginx ingress
关于python - 如何使用 Kubernetes Ingress 公开 Flask App?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63130616/