kubernetes 如何将nodePortMap到自己定义的端口

um6iljoc  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(3)|浏览(99)

我在8081上有一个可以访问的服务。如果我通过docker-compose或swarm来做,而不对端口进行任何特定的更改,那么它就可以工作。

http://$(minikube ip):8081

但是当我通过Kubernetes(minikube)运行我的应用程序时,分配了一个范围为30000-32767的nodePort。那么我必须打电话如下:

http://$(minikube ip):30546

这是我不能接受的有没有办法将随机给定的端口Map到我自己定义的端口?当调用第二个网址,然后我得到连接拒绝,我还使用

kubectl port forward my-service 8081

但还是没有成功

0qx6xfy6

0qx6xfy61#

kubectl port-forward命令不正确。尝试低于1

kubectl port-forward svc/my-service 8081:8081

那么你应该能够访问http//:127.0.0.1:8081上的服务

wkyowqbh

wkyowqbh2#

这个答案并不特定于Minikube,但适用于在Docker容器内运行的任何Kubernetes集群。
为了将请求从主机发送到容器中运行的Kubernetes pod,您必须将端口从主机Map到pod。
下面是你如何做到这一点:
1.使用--publish-p将您要在容器内使用的NodePort发布到主机。

# Map port 8080 on host machine to 31080 inside the container
docker run -p 8080:31080 ...

1.创建服务时使用自定义NodePort:

# You need to specify the exposed port as the nodePort value
# Otherwise Kubernetes will generate a random nodePort for you 
kubectl create service nodeport myservice --node-port=31080 --tcp=3000:80

Pod中的应用程序监听端口80,该端口在端口3000上公开为服务。在Kubernetes节点上的端口31080接收的流量将定向到此服务。
您发送到主机上的8080的查询将遵循以下路径:

Request -> Host Machine -> Docker Container -> Kubernetes Node -> Service -> Pod
               ↑                   ↑                 ↑              ↑         ↑
          localhost:8080         :31080           :31080          :3000      :80

参考文献:

vdzxcuhz

vdzxcuhz3#

在非云环境中实现此目的的一种方法是使用type: NodePort和外部IP配置。我在这里定义了这个API服务:

apiVersion: v1
kind: Service
metadata:
  labels:
    service: api
  name: api
spec:
  externalIPs:
  - <ip of your node>
  type: NodePort
  ports:
  - name: "http"
    port: 80
    protocol: TCP
    targetPort: 80

现在,当应用服务时,它将具有定义的外部IP:

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
api          NodePort    10.43.138.4    <specified IP>  80:30685/TCP   41m

当您使用此服务的IP地址和端口组合时,流量将根据服务的选择器转发到服务的Pod。现在,我可以访问集群curl <specified IP>:80外部的API了。当您希望控制可以使用哪些特定IP访问服务时,此方法非常有效。

相关问题