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。
更新:
将imagePullPolicy
从never
切换到Always
或IfNotPresent
后,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.
您需要将其切换为 IfNotPresent
或 Always
。
更多内容见image pull policy。
一切正确完成后,pod 状态应为 running
,然后您可以连接到 pod 并获取响应。查看示例输出:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
ubuntu 1/1 Running 0 4d
我是 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。
更新:
将imagePullPolicy
从never
切换到Always
或IfNotPresent
后,pod仍然无法运行
docker images
命令它显示图像存在:
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.
您需要将其切换为 IfNotPresent
或 Always
。
更多内容见image pull policy。
一切正确完成后,pod 状态应为 running
,然后您可以连接到 pod 并获取响应。查看示例输出:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
ubuntu 1/1 Running 0 4d