Minikube 运行 flask docker 失败 ERR_CONNECTION_RESET

Minikube run flask docker fail with ERR_CONNECTION_RESET

我是 Kubernetes 的新手,我想 运行 Kubernetes docker 上的简单 flask 程序。 docker 中的图像可以成功运行,但是当我用 kubectl apply -f k8s.yaml 启动 K8s.yaml 并执行 minikube service flask-app-service 时,网络结果回复失败 ERR_CONNECTION_REFUSED,并且 pods状态Error: ErrImageNeverPull.

app.py:

# flask_app/app/app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"


if __name__ == '__main__':
    app.debug = True
    app.run(debug=True, host='0.0.0.0')

Docker 文件:

FROM python:3.9

RUN mkdir /app
WORKDIR /app
ADD ./app /app/
RUN pip install -r requirement.txt

EXPOSE 5000
CMD ["python", "/app/app.py"]

K8s.yaml:

---
    apiVersion: v1
    kind: Service
    metadata:
      name: flask-app-service
    spec:
      selector:
        app: flask-app
      ports:
      - protocol: "TCP"
        port: 5000
        targetPort: 5000


    
---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: flask-app
    spec:
      selector:
        matchLabels:
          app: flask-app
      replicas: 3
      template:
        metadata:
          labels:
            app: flask-app
        spec:
          containers:
          - name: flask-app
            image: flask_app:latest
            imagePullPolicy: Never
            ports:
            - containerPort: 5000

部署后,我尝试从浏览器连接到 http://127.0.0.1:51145,但无法连接 ERR_CONNECTION_REFUSED 消息。如果该详细信息有帮助,我有一个 screenshot showing a more detailed Chinese-language error message。


更新:

imagePullPolicynever切换到AlwaysIfNotPresent后,pod仍然无法运行 我尝试 docker images 命令它显示图像存在: 但是当我用 docker pull 拉图像时,它显示错误: docker 登录后仍然无法正常工作:

p.s。我跟着网址练习:https://lukahuang.com/running-flask-on-minikube/

为什么所有容器都使用同一个端口?我认为那行不通。您需要为每个容器分配不同的端口,或者最好仍然创建不同的实例,如 3737:5000、2020:5000,这样外部端口可以是任何东西,而内部端口保持为 5000。我认为这应该可以工作

根据题中的错误:

pods status Error: ErrImageNeverPull.

pod 未启动,因为您的部署清单中有 imagePullPolicy: Never。也就是说,如果镜像丢失了,无论如何都不会被拉取。

来自官方文档:

The imagePullPolicy for a container and the tag of the image affect when the kubelet attempts to pull (download) the specified image.

您需要将其切换为 IfNotPresentAlways

更多内容见image pull policy

一切正确完成后,pod 状态应为 running,然后您可以连接到 pod 并获取响应。查看示例输出:

$ kubectl get pods
NAME     READY   STATUS    RESTARTS      AGE
ubuntu   1/1     Running   0             4d