无法连接到 Kubernetes NodePort 服务

Cannot connect to Kubernetes NodePort Service

我有一个 运行ning 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

然后我使用以下 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

然后我 运行 kubectl describe node minikube 找到我应该连接到的节点 IP -- 结果:

Addresses:
  InternalIP:  192.168.49.2
  Hostname:    minikube

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

curl 192.168.49.2:30008

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

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

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

您正在搜索的参数称为 nodePort,可以选择与 porttargetPort 一起指定。引用 documentation:

By default and for convenience, the Kubernetes control plane will allocate a port from a range (default: 30000-32767)

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

kubectl get svc -owide

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

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

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

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

我认为您错过了服务中的端口:

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

你的服务应该是这样的:

kind: Service
apiVersion: v1
metadata:
  name: microserviceone-service
spec:
  ports:
    - port: 2019
      targetPort: 2019
      nodePort: 30008
      protocol: TCP
  selector:
    app: microservice-one-app-label
  type: NodePort

如果您想使用 Minikube 尝试 Ingress,您可以在启用 Minikube ingress 后访问您的应用程序。

minikube addons enable ingress