我无法访问在部署和服务中设置的端口上的容器。我用这个命令创建了一个部署:
kubectl create deploy mydeploy --image nginx --replicas 2 --port 1234
然后,我创建了一个服务,它应该公开这个部署的Pod:
kubectl expose deploy mydeploy --port 4444 --target-port 1234 --name my-svc
为了测试我的服务是否正常工作,我创建了一个临时pod来curl服务:
kubectl run tmp-pod --image nginx:alpine -i --rm --restart Never -- curl <cluser-ip-of-service>:4444
但是这种 curl 没有得到预期的响应。我决定直接测试pod/container。1234端口不工作。但是,如果我使用端口80 curl 其中一个pod,它可以工作:
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的配置显示端口设置正确,但端口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 # the port is set here, but still nginx is available on 80
protocol: TCP
为什么我为部署Pod设置的端口不起作用?我设置的端口不应该用作服务中的targetPort
吗?我是否误解了pod的端口和服务的port
和targetPort
是如何工作的?
1条答案
按热度按时间3j86kqsm1#
containerPort
告诉kubernetes服务将流量路由到哪里。您面临的问题是,在您将流量路由到的端口上没有任何东西在侦听。如果你需要监听
1234
,你需要重新配置容器中的软件来绑定到1234。坦率地说,这是没有意义的,考虑到你的pod有专用的网络命名空间,因此它们在80上监听不会与任何其他pod在80上监听冲突,你可以有任何数量的pod绑定到端口80,它们不会冲突/重叠。除非您有非常具体的原因要更改该默认端口,否则您应该让它保持原样运行,并将您的服务定位在containerPort 80。