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 -itsee 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 请求路由到容器的主要内容,如果未能解决你的问题,请参考以下文章