Kubernetes:通过 Ingress 将非 HTTP 请求路由到容器
Kubernetes: Routing non HTTP Request via Ingress to Container
- 我在 Mac OS 上使用与 docker 捆绑的本地 kubernetes。
- 我已经安装了 nginx-ingress-controller。
- 我设法将外部 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"
- 我在 Mac OS 上使用与 docker 捆绑的本地 kubernetes。
- 我已经安装了 nginx-ingress-controller。
- 我设法将外部 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"