为何Flask应用未使用deployment.yaml指定的containerPort仍运行在5000端口?
问题分析
你的核心问题是Flask默认监听5000端口,虽然Kubernetes的Deployment和Service配置里指定了6000端口,但你没有修改Flask应用本身的监听端口,导致端口不匹配,最终Service无法正确转发流量。
解决方案
以下三种方法都能让Flask监听6000端口,可根据你的场景选择:
方法1:修改Flask代码指定端口
在代码里显式指定启动端口和监听地址(必须设为0.0.0.0,否则仅容器内部可访问):
from flask import Flask, jsonify app = Flask(__name__) @app.route("/") def index(): return jsonify({"hey":"test6"}) if __name__ == "__main__": app.run(host="0.0.0.0", port=6000)
修改后重新构建镜像并部署即可。
方法2:通过环境变量配置(推荐K8s场景)
无需修改代码,直接在Deployment的容器配置中添加Flask支持的环境变量,灵活控制端口:
apiVersion: apps/v1 kind: Deployment metadata: name: mqttdemob namespace: default spec: replicas: 1 selector: matchLabels: app: mqttdemob strategy: {} template: metadata: labels: app: mqttdemob spec: containers: - image: ****/fluxdemo:main-584db7b6-1687862454 # {"$imagepolicy": "flux-system:mqttdemob"} name: app ports: - containerPort: 6000 env: - name: FLASK_RUN_PORT value: "6000" - name: FLASK_RUN_HOST value: "0.0.0.0"
更新Deployment后,Flask会自动读取环境变量切换端口。
方法3:修改容器启动命令
如果镜像默认启动命令是flask run,可直接在Deployment里指定启动参数:
apiVersion: apps/v1 kind: Deployment metadata: name: mqttdemob namespace: default spec: replicas: 1 selector: matchLabels: app: mqttdemob strategy: {} template: metadata: labels: app: mqttdemob spec: containers: - image: ****/fluxdemo:main-584db7b6-1687862454 # {"$imagepolicy": "flux-system:mqttdemob"} name: app ports: - containerPort: 6000 command: ["flask"] args: ["run", "--host=0.0.0.0", "--port=6000"]
验证效果
重新部署后,执行以下命令确认端口监听状态:
kubectl exec <pod name> -- netstat -tulpn
若输出显示0.0.0.0:6000处于LISTEN状态,说明配置生效,此时Service的30400端口就能正常转发到Flask的6000端口了。
内容的提问来源于stack exchange,提问作者Kspr
相关产品推荐
相关产品推荐

