Kubernetes:通过Ingress将非HTTP请求路由到容器

时间:2018-03-22 23:11:20

标签: kubernetes kubernetes-ingress

  1. 我在Mac OS上使用与docker捆绑在一起的本地kubernetes。
  2. 我已经安装了nginx-ingress-controller
  3. 我管理员将外部http request via ingress发送到我的kubernetes托管容器(例如,从我的本地浏览器)。所有请求都通过nginx端口80或443发送。
  4. 问题是,我只能通过我的ngnix控制器路由http或https请求。 如何通过入口向我的容器发送非HTTP请求(例如数据库或corba)?

2 个答案:

答案 0 :(得分:10)

This is not well supported via the ingress mechanism and is an open issue.
There is a work around for tcp or udp traffic using nginx-ingress which will map an exposed port to a kubernetes service using a configmap.
See this doc.

Start the ingress controller with the tcp-services-configmap (and/or udp-services-configmap) argument.

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

deploy configmap:

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

where 9000 is the exposed port and 8080 is the service port

答案 1 :(得分:2)

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

该解决方案效果很好,并且Ingress规范的更新已完美集成。

为了使TS Server可用,我更改了nginx-ingress-controller.yml中Pods的args,如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,因此在检查Pods时,我仍然有旧的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,最后端口在主机网络上可用。

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