当前位置: 首页 > 知识库问答 >
问题:

如何使用nginx入口控制器通过TCP公开多个服务?

沃盛
2023-03-14

我有多个运行RDP应用程序的部署,它们都是通过ClusterIP服务公开的。我的k8s群集中有nginx ingress controller,为了允许tcp,我在nginx ingress controller部署中添加了tcp services configmap标志,并为其创建了configmap,如下所示

apiVersion: v1 
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
data:
  3389: “demo/rdp-service1:3389”

这将公开“rdp-service1”服务。我还有10个这样的服务需要在相同的端口号上公开,但如果我在相同的配置图中添加更多服务,就像这样

...
data
  3389: “demo/rdp-service1:3389”
  3389: “demo/rdp-service2:3389”

然后它将删除之前的服务数据,因为在这里我也在k8s中部署了外部dns,所以入口使用host:...创建的所有记录将开始指向与新添加的服务一起附加的部署在confimap中。

现在,我的最终要求是,只要我在入口中添加新创建的部署(RDP应用程序)的规则,然后它就开始允许TCP连接,那么是否有任何方法可以实现这一点。或者是否有任何其他入口控制器可以解决此类用例,也可以轻松地与外部dns集成?

注意:-我正在使用AWS EKS群集和路由器53以及外部dns。

共有2个答案

周和歌
2023-03-14

实际上,我真的不知道你为什么要使用configmap。

据我所知,nginx入口控制器正在路由来自同一端口的流量,并基于主机进行路由。因此,如果要在同一端口上公开应用程序,请尝试使用以下方法:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: {{ .Chart.Name }}-ingress
  namespace: your-namespace
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: your-hostname
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          serviceName: {{ .Chart.Name }}-service
          servicePort: {{ .Values.service.nodeport.port }}

查看您的需求,我觉得您需要的是LoadBalancer而不是入口

云俊美
2023-03-14

将这个答案作为社区wiki发布,以解释问题中的一些主题,并希望指出解决方案

可以随意展开/编辑它。

NGINX Ingress的主要职责是转发HTTP流量。通过添加tcp服务,它还可以将tcp通信转发到各自的endpoint:

  • 库伯内特斯。github。io:Ingress nginx:用户指南:公开tcp udp服务

主要问题是库伯内特斯中的入口资源的基于主机路由专门针对HTTP/HTTPS流量而不是TCPRDP)。

您可以实现以下场景:

  • 入口控制器:
    • 3389-RDP部署
    • 3390-RDP部署
    • 3391部署

    没有基于主机的路由。这更像是端口转发。

    旁注!此设置还取决于负载平衡器分配端口的能力(这可能会受到云提供商规范的限制)

    至于可能的解决方案,可能不那么直截了当,我将查看以下资源:

    • Stackoverflow.com:问题:基于主机名的Nstar TCP转发
    • Doc.traefik.io:Traefik:路由:路由器:配置TCP路由器
    • Github.com:Bolkedebruw:Rdpgw

    我还要查看以下链接:

    >

    Docs.konghq.com:库伯内特斯入口控制器:1.2。X:指南:使用tcpingress

    Haproxy公司:

    • Haproxy公司。com:文档:Aloha:12-0:部署指南:远程桌面:RDP网关
    • Haproxy公司。com:文档:Aloha:10-5:部署指南:远程桌面
    • Haproxy公司。com:博客:Microsoft远程桌面服务rds负载平衡和保护

 类似资料:
  • 我基本上希望通过URL从外部访问Nginx hello页面。我已经为运行kubernetes和Nginx ingress:vps的v服务器的子域创建了一个(工作)a记录。我的域名。通用域名格式 我使用以下教程在CoreOS上通过kubeadm将Kubernetes安装为单节点集群:https://kubernetes.io/docs/setup/independent/install-kubead

  • 我有一个JavaSpring Boot Application,我已经将服务器配置为在SSL上运行,这是强制性的。 我已经为我的域创建了一个证书从LetsEncrypt证书,并通过运行为keystore创建了一个p12文件 我想用Ingress Nginx控制器在Kubernetes上公开它,所以我创建了一个秘密 我已经部署了应用程序,可以看到部署文件,当我将本地8443端口转发到其服务的8443

  • 我正在使用kubeadm工具创建kubernetes v1.7集群。 在我的主机上公开服务“echoheaders”非常简单。库贝。com使用外部ip 创建正在运行的部署: 从部署中公开服务: 从web浏览器访问: 现在,我想使用本指南中基于角色的入口控制器公开相同的服务echoheaders:https://github.com/kubernetes/ingress/tree/master/ex

  • 我创建了一个docker镜像(java Web应用程序),创建了一个包含1个主节点和1个工作节点的kubernetes集群,创建了一个部署和一个服务。所有的资源似乎都运行良好,因为我已经通过“kubectl描述资源资源名”进行了检查。最后,我使用了入口来公开集群之外的服务。入口资源似乎工作正常,因为在描述入口对象时没有错误。但是,在从另一台机器访问浏览器上的主机时,我得到了“您的连接不是私有的”错

  • 如何使用入口控制器本身公开UI而不创建外部LoadBalancer?