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

Kubernetes: Routing non HTTP Request via Ingress to Container

  1. 我在 Mac OS 上使用与 docker 捆绑的本地 kubernetes。
  2. 我已经安装了 nginx-ingress-controller
  3. 我设法将外部 http request via ingress 发送到我的 kubernetes 托管容器(例如从我的本地浏览器)。所有请求都通过 nginx 端口 80 或 443 发送。

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

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

使用 tcp-services-configmap (and/or 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是服务端口

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

解决方案运行良好,Ingress 规范更新完美集成。

为了使 TS 服务器可用,我更改了 nginx-ingress-controller.yml 中 Pods 的参数,如 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 没有自动重新创建 Pods,因此在检查 Pods 时,我仍然有旧的参数:

/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 命名空间内的 Pods 使控制器创建新的 Pods,最终端口在主机网络上可用。

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

(其中一条评论谈到了 Helm)。
对于那些正在使用 ingress-nginx helm chart 的人 - 大多数配置已经完成。

您只需要转到相关协议部分(tcp or udp)并在其下添加相关端口和服务url。

例如:

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