首页 > 解决方案 > 无法使用 NodePort 转发流量

问题描述

我有一个在 minikube K8 集群内运行的应用程序。这是一个简单的 REST 端点。问题是部署后我无法从本地计算机访问该应用程序。

使用http://{node ip}:{node port}端点。

但是,如果我这样做:

kubectl port-forward (actual pod name) 8000:8000

该应用程序可以在以下位置访问:127.0.0.1:8000从我的本地桌面。

这是正确的方法吗?我相信这不是正确的方法吗?因为我直接将我的流量转发到 pod,并且一旦删除了这个 pod,这个端口转发就不会保留。

我在这里缺少什么以及解决此问题的正确方法是什么?

我还配置了一个NodePort服务,它应该可以处理这个问题,但恐怕它似乎不起作用:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: rest-api
  name: rest-api-np
  namespace: rest-api-namespace
spec:
  type: NodePort
  ports:
  - port: 8000
  selector:
    app: rest-api


apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: rest-api
  name: rest-api-deployment
  namespace: rest-api-namespace
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rest-api
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: rest-api
    spec:
      containers:
      - image: oneImage:latest
        name: rest-api

标签: kubernetesminikube

解决方案


您遇到问题是因为您的服务放置在default命名空间中,而您的部署位于rest-api-namespace命名空间中。

我已经为您部署了 yaml 文件,并且在描述服务时没有端点:

➜  k describe svc rest-api-np 
Name:                     rest-api-np
Namespace:                default
Labels:                   app=rest-api
Annotations:              <none>
Selector:                 app=rest-api
Type:                     NodePort
IP:                       10.100.111.228
Port:                     <unset>  8000/TCP
TargetPort:               8000/TCP
NodePort:                 <unset>  31668/TCP
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

解决方案是在同一个命名空间中创建服务。一旦你这样做了,一个IP地址和端口将出现在该Endpoints字段中:

➜ k describe svc -n rest-api-namespace rest-api-np 
Name:                     rest-api-np
Namespace:                rest-api-namespace
Labels:                   app=rest-api
Annotations:              <none>
Selector:                 app=rest-api
Type:                     NodePort
IP:                       10.99.49.24
Port:                     <unset>  8000/TCP
TargetPort:               8000/TCP
NodePort:                 <unset>  32116/TCP
Endpoints:                172.18.0.3:8000
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

另一种方法是手动添加端点:

apiVersion: v1
kind: Endpoints
metadata:
  name: my-service # please note that endpoints and service needs to have the same name
subsets:
  - addresses:
      - ip: 192.0.2.42 #ip of the pod 
    ports:
      - port: 8000

推荐阅读