Kubernetes问题:设置的端口无法访问容器
问题
我无法通过在Deployment和Service中设置的端口访问容器,操作步骤如下:
- 创建Deployment:
kubectl create deploy mydeploy --image nginx --replicas 2 --port 1234
- 创建Service暴露Deployment的Pod:
kubectl expose deploy mydeploy --port 4444 --target-port 1234 --name my-svc
- 创建临时Pod测试Service:
kubectl run tmp-pod --image nginx:alpine -i --rm --restart Never -- curl <cluser-ip-of-service>:4444
但未得到预期响应。直接测试Pod/容器时,端口1234无法访问,而使用端口80则可以正常访问:
kubectl run tmp --image nginx:alpine -i --rm --restart Never -- curl 192.168.1.18:80 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...
查看Pod配置,端口已设置但Nginx仍使用80端口:
apiVersion: v1 kind: Pod metadata: labels: app: mydeploy pod-template-hash: 86bd9fc56c name: mydeploy-86bd9fc56c-shd9z namespace: default spec: containers: - image: nginx imagePullPolicy: Always name: nginx ports: - containerPort: 1234 # 这里设置了端口,但Nginx还是在80端口提供服务 protocol: TCP
请问为何为Deployment Pod设置的端口无法生效?我设置的端口不应作为Service的targetPort吗?我是否误解了Pod端口与Service的port、targetPort的工作逻辑?
解答
核心误解:Pod的containerPort不是用来修改容器应用的监听端口
你在Deployment里设置的--port 1234,最终对应Pod配置里的containerPort:1234,这个字段只是一个声明性的元数据——它的作用是告诉Kubernetes“这个容器预期会使用这个端口”,但不会主动修改容器内部应用的配置。
Nginx官方镜像默认就是监听80端口,你没有修改Nginx的配置,所以不管Pod里声明了什么containerPort,容器内的Nginx依然只会在80端口提供服务。
Service的port和targetPort的工作逻辑
port:是Service自身在集群内暴露的端口,其他Pod访问Service时用这个端口,你设置的4444是没问题的。targetPort:是Service要转发流量到的容器实际监听的端口,这个端口必须和容器内应用真正在运行的端口一致。你之前把它设为1234,但容器里的Nginx根本没在1234端口监听,所以流量转发过去自然没有响应。
修复方案
方案1:修改Service的targetPort为80(最简单)
直接重新创建Service,把targetPort改成Nginx实际监听的80端口:
kubectl expose deploy mydeploy --port 4444 --target-port 80 --name my-svc --overwrite
之后再用临时Pod测试curl <cluster-ip-of-service>:4444就能正常得到响应了。
方案2:修改Nginx配置,让它监听1234端口
如果你确实想让Nginx用1234端口,需要修改Nginx的配置文件,比如:
- 自定义构建Nginx镜像,修改配置里的监听端口为1234
- 用ConfigMap挂载自定义的Nginx配置文件到Pod中
修改后,Pod的containerPort:1234就和应用实际监听端口一致了,此时Service的targetPort:1234就能正常工作。
总结
Pod的containerPort是“声明”而非“配置”,它不改变容器内应用的行为;Service的targetPort必须严格对应容器内应用真正在监听的端口,两者匹配才能实现流量的正确转发。
内容的提问来源于stack exchange,提问作者KJ0797
相关产品推荐
相关产品推荐

