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

Posted

技术标签:

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

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

【问题讨论】:

谁能提供服务、configMap 和 ingress 的完整清单文件,以便使用 ingress 在 kubernetes 中部署一个简单的 sftp 应用程序? 【参考方案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 的用户,大部分配置已经完成。

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

例如:

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

【讨论】:

以上是关于Kubernetes:通过入口将非 HTTP 请求路由到容器的主要内容,如果未能解决你的问题,请参考以下文章

kubernetes ingress traefik 入门

Kubernetes流量入口Ingresss实战-aliyun-ingress-controller

Nginx 入口控制器返回 404 Kubernetes

kubernetes 不健康的入口后端

Kubernetes 的动态通配符子域入口

解决入口服务不可用 503