如何通过K8s DNS地址执行测试Pod中的Python CLI代码?
如何通过K8s DNS地址执行Pod中的test.py脚本
首先需要明确你的test.py类型,不同类型对应不同的实现方式:
场景1:test.py是Web服务接口(如Flask/FastAPI编写)
如果test.py本身是监听端口的Web服务,需要先完善现有配置,确保Service能正确转发流量到容器的Web服务:
完善容器端口配置
在Deployment的容器定义中添加端口映射,让targetPort: test-api对应容器实际监听的端口:containers: - name: test-api image: test-image ports: - containerPort: 8080 name: test-api # 和Service的targetPort名称匹配确保容器启动时运行Web服务
可以通过Dockerfile添加启动命令:# 在dockerfile.test末尾添加 CMD ["python3", "test.py"]或直接在Deployment的容器中指定
command:containers: - name: test-api image: test-image command: ["python3", "test.py"] ports: - containerPort: 8080 name: test-api触发脚本执行
配置完成后,直接访问K8s DNS地址http://test-api.test-system.svc.cluster.local:8080(如果脚本有特定接口路径,比如/run,则访问http://test-api.test-system.svc.cluster.local:8080/run)即可触发test.py中的Web接口逻辑。
场景2:test.py是普通脚本(无Web服务,仅需执行逻辑)
这种情况下,K8s Service的DNS地址无法直接触发脚本执行(Service仅转发端口流量,普通脚本不监听端口),可以通过以下方式实现:
方法1:在集群内Pod中远程执行脚本
- 启动临时调试Pod,进入交互模式:
kubectl run tmp-debug-pod --image=python:3.9 -n test-system --rm -it -- bash - 在临时Pod中,通过
kubectl直接执行目标Pod内的脚本:# 获取test标签对应的Pod名称 POD_NAME=$(kubectl get pods -n test-system -l app=test -o jsonpath='{.items[0].metadata.name}') # 执行脚本 kubectl exec -n test-system $POD_NAME -- python3 /test/test.py
方法2:将普通脚本改造为可HTTP触发的Web接口
给test.py添加轻量Web框架支持,使其能通过HTTP请求触发执行:
- 修改
requirements.txt,添加Flask依赖:flask - 修改
test.py,添加Web接口逻辑:from flask import Flask app = Flask(__name__) def your_original_script_logic(): # 这里写原来test.py的业务逻辑 return "脚本执行完成" @app.route('/run', methods=['GET']) def run_script(): result = your_original_script_logic() return result if __name__ == '__main__': app.run(host='0.0.0.0', port=8080) - 按照场景1的步骤完善Deployment和Service配置,之后访问
http://test-api.test-system.svc.cluster.local:8080/run即可触发脚本执行。
方法3:用Job资源按需执行脚本
如果不需要通过DNS触发,仅需按需执行脚本,可以创建K8s Job资源:
apiVersion: batch/v1 kind: Job metadata: name: run-test-script namespace: test-system spec: template: spec: containers: - name: test-script-runner image: test-image command: ["python3", "/test/test.py"] restartPolicy: OnFailure
执行以下命令触发脚本:
kubectl apply -f job.yaml
内容的提问来源于stack exchange,提问作者ccd
相关产品推荐
相关产品推荐

