【问题标题】:Using custom ports for nginx ingress in k8s在 k8s 中为 nginx 入口使用自定义端口
【发布时间】:2020-05-19 17:57:02
【问题描述】:

我有多个服务在端口 80 上运行。

我现在正在部署另一个在端口 3310(病毒扫描程序)上运行的服务,如果我尝试使用 nginx,我似乎无法让端口正常工作。我在某处读到 nginx 仅适用于标准端口。

所以我走上了使用负载平衡器服务的路线。这非常有效,但需要额外的 IP 地址等成本。

是否有继续为这个非标准端口使用 nginx 入口?从而消除了对集群的额外外部访问的需要?

【问题讨论】:

  • 该病毒扫描程序应该可以从 Internet 访问还是仅在本地访问?您可以控制您的域名吗?第一个想法是通过服务公开该扫描仪,如果扫描仪支持 http:https,则在 Nginx 入口中创建重写规则。
  • 不一定,我希望它对功能应用程序开放,但它并不完全在集群中。我使用的是 azure,所以如果我使用 loaf balancer 路由,我可以使用 nsg。是的,我可以控制域,并已将一条记录指向该 IP 地址。

标签: nginx-ingress azure-aks clamav


【解决方案1】:

如果端口 3310 上的病毒扫描程序接受 HTTP/HTTPS 连接,那么您可以使用入口控制器。入口资源将仅接受端口 80 和 443 上的传入流量。您需要将该服务公开给不同的主机名或路径,以识别将哪些请求发送到您的防病毒服务。

如果你需要 TCP/UDP 连接到服务,你可以create a ConfigMap which is read by nginx ingress controller。您需要在启动时将参数 --tcp-services-configmap 传递给 nginx 入口控制器(通过入口控制器 Deployment 资源中的容器参数)。

鉴于此sample ingress controller Deployment resource,您可以将参数--tcp-service-configmap=default/tcp-controller-configmap 添加到文件末尾作为args 列表中的另一个元素。

ConfigMap 看起来像这样:

apiVersion: v1
kind: ConfigMap
metadata:
    name: tcp-controller-configmap
    namespace: default
data:
    3310: "default/name-of-your-av-service:3310"

【讨论】:

  • 我认为不会,但我怎么能确定呢?我最初确实尝试过 inginx 入口并将域指向 k8s ip,然后尝试使用服务将端口 80 映射到 3310,但它不起作用,因此采用负载均衡器方式。这没什么大不了的
  • @Kevin,我假设您正在运行 ClamAV,它接受 TCP 套接字连接。这不是您应该向公共互联网公开的服务。确保您能够将端口 3310 上的传入连接仅限于您控制的系统。我已经更新了我的答案,提供了有关公开 TCP 端口所需的配置更改的更多详细信息。
  • 你绝对是正确的。现在,我使用负载均衡器方法并使用 azure nsg 来限制从“允许”的 ips 和服务到端口的连接,但是如果我要使用 nginx 入口,我会使用 nginx 注释白名单。我会看看那些确认的东西没有意识到你可以做到这一点。谢谢
【解决方案2】:

您可以通过NodePort Service 访问您的病毒扫描程序。您应该已经为您的节点分配了外部 IP 地址,因此无需额外费用。

关于 Ingress 实体仅使端口 80 和 442 对外可用,您是对的。根据K8s Documentation,它们似乎是这样设计的。

【讨论】:

  • 我不想使用nodeport,因为它会在所有节点上打开相同的端口,并且端口范围非常有限,我真的想不出我会在哪里使用节点端口。但是,是的,你是对的,这种方式不需要另一个 ip
猜你喜欢
  • 2015-07-22
  • 2019-08-12
  • 2021-03-04
  • 2018-04-08
  • 1970-01-01
  • 2021-05-16
  • 2020-09-27
  • 1970-01-01
  • 2018-07-17
相关资源
最近更新 更多