python - 如何使用 Kubernetes Ingress 公开 Flask App?

标签 python docker flask kubernetes kubernetes-ingress

我有一个简单的 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 上公开任何应用程序都是一项艰巨的任务,这里有一些需要注意的事项

  1. 确保应用程序正在监听 0.0.0.0而不是127.0.0.1
  2. curl 请求应包含 Host header 即 -H "Host: hwrequest.mycompany.com"因为这是入口 Controller 如何根据入口资源中定义的规则知道要应用哪个规则的方式。
  3. 需要有一个入口 Controller ,例如在集群中运行的 nginx,并且入口 Controller Pod 需要通过 NodePort 公开或LoadBalancer类型 service 或可以使用 hostNetwork: true 进行部署
  4. 您需要使用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/

相关文章:

python - django - 验证 - 缺少所需的潜在参数 'self'

docker - 运行多个容器而无需撰写内容?

java - Spring应用程序中的大小写敏感问题

python - 通过 uWSGI 时 Flask debug=True 不起作用

python - 使用 NaN 条件迭代数据帧

Debian 8 上的 Python numba/llvmlite - 我无法构建 llvmlite

python - Python 中的 HLS Live Stream API 从磁盘提供文件

python - 使用 FlaskScript 从 Python 运行 Gunicorn

python - 提高循环 numpy 数组的速度

docker - 了解Docker端口转移