(Kubernetes)从 NodePort 端口转发到其范围之外的端口

(Kubernetes)从 NodePort 端口转发到其范围之外的端口

我有一个在本地机器(我的 Mac)上的 Kubernetes 上运行的 pod,并且定义为可通过 nodePort 30036 访问

  - protocol: TCP
    targetPort: 8081
    nodePort: 30036

我希望能够使用为 nodePort 使用定义的范围 (30000-32768) 之外的端口访问此节点。比如说 8080。我有什么选择?谢谢!

答案1

由于没有关于所使用的确切 Kubernetes 解决方案的信息,因此很难确定确切的解决方案。

假设有两个选项:

  • Docker Desktop with Kubernetes
  • Minikube

针对这些问题的一些解决方案可能是:


带有 Kubernetes 的 Docker Desktop

Service类型LoadBalancer

您的 Kubernetes 集群可以使用Service类型LoadBalancer并链接到您的localhost(您的 Mac localhost)。

您可以通过运行以下示例来检查这一点:

  • $ kubectl create deployment nginx --image=nginx
  • $ kubectl expose deployment nginx --port=80 --type=LoadBalancer
  • $ kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP        10d
nginx        LoadBalancer   10.111.214.48   localhost     80:30032/TCP   77s
  • curl 127.0.0.1:80/curl kubernetes.docker.internal:80
<-- REDACTED --> 
<title>Welcome to nginx!</title>
<-- REDACTED --> 

附注!

--port您可以在使用时使用(您的端口localhost)和--targetPort(您的监听端口Pod)参数进一步修改它$ kubectl expose ...

更改NodePort端口范围

您可以按照这个深入的答案,它将向您展示如何修改kubeapi-server以更改NodePort端口范围(通过登录到 Docker VM):

使用Ingress控制器

您还可以使用一个Ingress控制器,该控制器将绑定到您的 Mac localhost,并允许您使用Ingress资源(它主要用于HTTP/,HTTPS但经过一些调整,它可以传递TCP/UDP流量)。您可以在此处找到有关该主题的更多信息:


迷你库

由于使用不同Minikube,可能会有很多变化--driver

更改NodePort端口范围

您可以再次按照以下答案来更改minikube NodePort端口范围:

使用metallb

您还可以使用金属Service为您的类型分配地址LoadBalancer

执行步骤如下:

  • $ minikube start --driver=hyperkit
  • $ minikube addons enable metallb
  • $ minikube node list(注意你的 IP 地址minikube
  • $ minikube addons configure metallb(将分配的范围放在minikubeIP 附近,例如:
    • minikube ip192.168.64.11
    • metallb start192.168.64.100
    • metallb end192.168.64.110
  • 创建工作负载并将其公开为Service类型LoadBalancer
  • $ curl SVC_EXTERNAL_IP:PORT

附注!

--driver=hyperkit之所以使用,是因为:

因为您在 darwin 上使用 Docker 驱动程序,所以需要打开终端才能运行它。

minikube此消息与使用时实例的访问及其限制有关--driver=docker。您需要使用minikube service SERVICE_NAME来访问Service(并且您在使用时终端必须处于运行状态)。


附注!

我认为作为一种解决方法您也可以使用$ kubectl port-forward

其他资源:

相关内容