Kubernetes -容器在设置端口上不可用

dsekswqp  于 2023-05-06  发布在  Kubernetes
关注(0)|答案(1)|浏览(216)

我无法访问在部署和服务中设置的端口上的容器。我用这个命令创建了一个部署:

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的端口和服务的porttargetPort是如何工作的?

3j86kqsm

3j86kqsm1#

containerPort告诉kubernetes服务将流量路由到哪里。您面临的问题是,在您将流量路由到的端口上没有任何东西在侦听。
如果你需要监听1234,你需要重新配置容器中的软件来绑定到1234。坦率地说,这是没有意义的,考虑到你的pod有专用的网络命名空间,因此它们在80上监听不会与任何其他pod在80上监听冲突,你可以有任何数量的pod绑定到端口80,它们不会冲突/重叠。
除非您有非常具体的原因要更改该默认端口,否则您应该让它保持原样运行,并将您的服务定位在containerPort 80。

相关问题