【问题标题】:Kubernetes: Routing non HTTP Request via Ingress to ContainerKubernetes:通过入口将非 HTTP 请求路由到容器
【发布时间】:2018-09-01 13:18:13
【问题描述】:
  1. 我在 Mac OS 上使用与 docker 捆绑的本地 kubernetes。
  2. 我已经安装了nginx-ingress-controller
  3. 我设法将外部 http request via ingress 发送到我的 kubernetes 托管容器(例如,从我的本地浏览器)。所有请求都通过 nginx 端口 80 或 443 发送。

问题是,我只能通过我的 ngnix 控制器路由 http 或 https 请求。 如何通过入口向我的容器发送非 HTTP 请求(例如数据库或 corba)?

【问题讨论】:

  • 谁能提供服务、configMap 和 ingress 的完整清单文件,以便使用 ingress 在 kubernetes 中部署一个简单的 sftp 应用程序?

标签: kubernetes kubernetes-ingress


【解决方案1】:

这通过入口机制没有得到很好的支持,并且是open issue
使用 nginx-ingress 可以解决 tcp 或 udp 流量问题,它会使用 configmap 将暴露的端口映射到 kubernetes 服务。
this doc

使用tcp-services-configmap(和/或udp-services-configmap)参数启动入口控制器。

args: 
- "/nginx-ingress-controller"
- "--tcp-services-configmap=default/nginx-tcp-configmap"
- "--v=2"

部署配置图:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-tcp-configmap
data:
  9000: "default/example-service:8080"

其中9000 是公开端口,8080 是服务端口

【讨论】:

  • 结合入口控制器参数是否正确?所以我有两个配置图: --configmap=nginx-ingress/nginx PLUS --tcp-services-configmap=default/nginx-tcp-configmap"
  • 不幸的是,该解决方案对我不起作用:无法访问暴露的端口。我是否必须告诉 kubernetes 在其他地方公开该端口? configmap真的够用吗?
  • 从上面的示例中,端口 9000 暴露在 nginx-ingress-controller 内部。您可以通过执行 kubectl exec -it bash 和执行 netstat -nltp | 来检查它。 grep 9000。但是,我看不到这个端口是如何从外部访问的?
  • 你知道用helm怎么做吗?
  • see this doc 链接已失效
【解决方案2】:

我在裸机服务器上使用 nginx-ingress-controller。为了从所有节点访问托管站点,我将其创建为 DaemonSet 而不是部署 (Bare-metal considerations)。

该解决方案运行良好,并且完美集成了 Ingress 规范的更新。

为了使 TS 服务器可用,我更改了 nginx-ingress-controller.yml 中 Pod 的参数,如 stacksonstacks 所述:

/nginx-ingress-controller
  --configmap=$(POD_NAMESPACE)/nginx-configuration
  --publish-service=$(POD_NAMESPACE)/ingress-nginx
  --annotations-prefix=nginx.ingress.kubernetes.io
  --tcp-services-configmap=default/tcp-ingress-configmap
  --udp-services-configmap=default/udp-ingress-configmap

不幸的是,在应用更改后的规范时,DaemonSet 没有自动重新创建 Pod,所以在检查 Pod 时,我仍然有旧的 args:

/nginx-ingress-controller
  --configmap=$(POD_NAMESPACE)/nginx-configuration
  --publish-service=$(POD_NAMESPACE)/ingress-nginx
  --annotations-prefix=nginx.ingress.kubernetes.io

使用 kubectl --namespace ingress-nginx delete pod --all 删除 ingress-nginx 命名空间内的 Pod 使控制器创建新的 Pod,最终端口在主机网络上可用。

我知道情况可能会有所不同,但希望有人可以为此节省几分钟。

【讨论】:

    【解决方案3】:

    (其中一位 cmets 谈到了 Helm)。
    对于使用ingress-nginx helm chart 的用户,大部分配置已经完成。

    你只需要到相关的协议部分(tcpudp)并在其下添加相关的端口和服务url。

    例如:

    tcp: 
      8080: "default/example-tcp-svc:9000"
    

    【讨论】:

      猜你喜欢
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2011-11-17
      • 1970-01-01
      相关资源
      最近更新 更多