docker - 如何在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
?
解决方案
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 上,而是在主服务器本身上。
登录 Docker 虚拟机:
将以下行添加到 pod 规范中:
spec: containers: - command: - kube-apiserver ... - --service-node-port-range=xxxxx-yyyyy # <-- add this line ...
保存并退出。Pod kube-apiserver 将使用新参数重新启动。
退出 Docker 虚拟机(对于
screen
:Ctrl-a,k
,对于容器Ctrl-d
:)检查结果:
$ kubectl get pod kube-apiserver-docker-desktop -o yaml -n kube-system | less
推荐阅读
- javascript - IE 支持的 javascript URL 替代方案
- python - 用python写一个excel公式所有列
- ios - 通过 Diawi 将 iOS 应用程序安装到非测试设备
- python - 使用 Python 从具有多个条目的 JSON 数组中获取值
- elasticsearch - 折叠字段“xxx”的未知类型,只接受关键字和数字错误
- python - Django 使用 OnetoOneField 创建数据
- r - Lapack 例程 dgesv:系统完全是奇异的:U[6,6] = 0
- java - 如何从 Java 中的 ElasticSearch 响应中解析 GeoPoint 值?
- druid - 在 druid 中从 kafka 消费时,roll up 将两行合并为 1 而不是添加它们
- java - 使用 POST 请求未正确上传文件