首页 > 解决方案 > 如何在Docker Desktop自带的kubernetes mini-cluster中暴露低号端口

问题描述

我正在使用Docker Desktop 中内置的 kubernetes 集群来开发我的应用程序。

我想将集群内的服务公开为localhost.

我可以这样做kubectl expose deployment foobar --type=NodePort --port=30088,它会创建这样的服务:

apiVersion: v1
kind: Service
metadata:
  labels:
    role: web
  name: foobar
spec:
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 30088
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    role: web
  type: NodePort

但它仅适用于编号非常高的端口。如果我尝试更低的东西,我会得到:

The Service "kafka-external" is invalid: spec.ports[0].nodePort: Invalid value: 9092: provided port is not in the valid range. The range of valid ports is 30000-32767

似乎有一个名为 kubernetes apiserver 的设置ServiceNodePortRange可以让我覆盖这个限制,但我不知道如何在 Docker 的内置集群上设置它。

所以我的问题是:如何在 Docker 的 kubernetes 集群上公开一个特定的、低编号的端口(如 9092)?有没有办法覆盖该设置?还是比 暴露服务更好的方法NodePort

标签: dockerkubernetes

解决方案


NodePort旨在成为负载平衡器或其他
入口模式的构建块。这意味着只要
你有一个端口,你得到哪个端口并不重要。这使得直接使用有点笨拙——你不能
只拥有任何端口。您可以更改端口范围,但您会面临
与节点上运行的真实事物以及任何 pod HostPorts 发生冲突的风险。

默认范围确实是 30000-32767 但可以通过设置--service-node-port-range更新文件/etc/kubernetes/manifests/kube-apiserver.yaml并添加行来更改它--service-node-port-range=xxxxx-yyyyy

在 Kubernetes 集群 kube-apiserver.yaml中,目录中有一个文件 -/etc/kubernetes/manifests/kube-apiserver.yaml但不在 kube-apiserver 容器/pod 上,而是在主服务器本身上。

  1. 登录 Docker 虚拟机:

  2. 将以下行添加到 pod 规范中:

    spec:
      containers:
      - command:
        - kube-apiserver
        ...
        - --service-node-port-range=xxxxx-yyyyy  # <-- add this line
        ...
    
    

保存并退出。Pod kube-apiserver 将使用新参数重新启动。

  1. 退出 Docker 虚拟机(对于 screenCtrl-a,k ,对于容器 Ctrl-d :)

  2. 检查结果:

$ kubectl get pod kube-apiserver-docker-desktop -o yaml -n kube-system | less

看一下:service-pod-range改变 pod range改变-nodeport-range


推荐阅读