问题描述
在一个使用 k3s 集群(版本:v1.24.4+k3s1
)中,用户在 nginx ingress(使用 helm 部署:ingress-nginx/ingress-nginx
)后面运行了多个服务。nginx ingress 会创建一个类型为 LoadBalancer 的控制器服务,该服务使用了两个额外的 NodePorts:31895/TCP
和 24843/TCP
。这使得该服务可以通过这两个端口从集群外部访问(除了端口 80
和 443
)。
用户有以下问题需要解决:
1. 为什么 nginx ingress 使用了这两个 NodePorts?
2. 如何禁用这两个 NodePorts 或禁止它们从集群外部访问?(每次创建服务时,这两个 NodePorts 都会随机分配)
用户尝试过设置 allocateLoadBalancerNodePorts 为 false
,但并没有成功。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
为什么使用 NodePorts?
NodePort 是 Kubernetes 服务的一种类型,它允许集群外部通过节点的 IP 地址和 NodePort 端口访问服务。在 nginx ingress 控制器中,这两个额外的 NodePorts(31895/TCP
和 24843/TCP
)是为了允许外部流量通过这些端口访问 Ingress 资源所定义的规则。这样可以将 HTTP 和 HTTPS 流量定向到适当的后端服务。
如何禁用 NodePorts 或限制外部访问?
要禁用这两个 NodePorts 或者限制从集群外部访问它们,可以采取以下步骤:
步骤 1:修改 Ingress Controller 的配置
- 找到你的 nginx ingress 控制器的配置文件或 Helm 部署值。
- 查找相关的配置项,可能是类似于
controller.service.nodePorts.http
和controller.service.nodePorts.https
这样的设置。 - 将这些配置项的值设置为
null
或者删除它们,这将阻止控制器为这些协议分配 NodePorts。
步骤 2:更新现有的 Ingress 资源
如果你已经创建了 Ingress 资源并希望阻止流量通过这些 NodePorts,请按照以下步骤操作:
- 找到现有的 Ingress 资源。
- 对于每个需要更改的 Ingress 资源,将规则中的端口映射(
80
和443
)更改为你希望的端口。 - 更新 Ingress 资源,让它们使用新的端口映射。
请注意,禁用或更改 NodePorts 可能会影响外部访问和流量的传递,请确保在修改之前做好适当的测试和备份。
注意事项
在禁用 NodePorts 时,请注意以下几点:
– 如果你使用的是 Helm 部署,你可能需要通过 values.yaml
文件或 Helm 的命令行选项来设置相应的配置值。
– 请确保你的更改在控制器和 Ingress 资源中保持一致,以避免潜在的配置不一致问题。
总结
通过修改 nginx ingress 控制器的配置以及更新现有的 Ingress 资源,你可以禁用或限制 NodePorts 的外部访问。但在进行任何更改之前,请务必做好适当的备份和测试,以确保更改不会导致意外的问题。