无法连接到 Kubernetes NodePort 服务

Vis*_*rez 5 kubernetes kubernetes-pod kubernetes-service

我有一个使用以下内容创建的正在运行的 Pod pod-definition.yaml

apiVersion: v1
kind: Pod
metadata:
    name: microservice-one-pod-name
    labels:
        app: microservice-one-app-label
        type: front-end
spec:
    containers:
    - name: microservice-one
      image: vismarkjuarez1994/microserviceone
      ports:
      - containerPort: 2019
Run Code Online (Sandbox Code Playgroud)

然后我使用以下命令创建了一个服务service-definition.yaml

kind: Service
apiVersion: v1
metadata:
  name: microserviceone-service
spec:
  ports:
    - port: 30008
      targetPort: 2019
      protocol: TCP
  selector:
    app: microservice-one-app-label
  type: NodePort
Run Code Online (Sandbox Code Playgroud)

然后我跑去kubectl describe node minikube寻找我应该连接的节点 IP——结果是:

Addresses:
  InternalIP:  192.168.49.2
  Hostname:    minikube
Run Code Online (Sandbox Code Playgroud)

但是当我运行以下curl命令时没有得到任何响应:

curl 192.168.49.2:30008
Run Code Online (Sandbox Code Playgroud)

192.168.49.2:30008当我尝试从浏览器访问时,请求也会超时。

Pod 日志显示容器已启动并正在运行。为什么我无法访问我的服务?

And*_*ndD 6

问题是您尝试通过参数访问您的服务,port该参数是将公开服务的内部端口,即使使用NodePort类型也是如此。

您正在搜索的参数称为,可以选择将其与和nodePort一起指定。引用文档porttargetPort

默认情况下,为了方便起见,Kubernetes 控制平面将从一个范围中分配一个端口(默认30000-32767:)

由于您没有指定nodePort,因此会自动选取该范围内的一个。您可以通过以下方式检查是哪一个:

kubectl get svc -owide
Run Code Online (Sandbox Code Playgroud)

然后在该端口从外部访问您的服务。

作为替代方案,您可以将服务定义更改为:

kind: Service
apiVersion: v1
metadata:
  name: microserviceone-service
spec:
  ports:
    - port: 30008
      targetPort: 2019
      nodePort: 30008
      protocol: TCP
  selector:
    app: microservice-one-app-label
  type: NodePort
Run Code Online (Sandbox Code Playgroud)

但请记住,您可能需要删除服务并重新创建它才能更改nodePort分配的服务。