问题是,我只能通过我的ngnix控制器路由http或https请求。 如何通过入口向我的容器发送非HTTP请求(例如数据库或corba)?
答案 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,最后端口在主机网络上可用。
我知道情况可能有所不同,但是希望有人可以为此节省几分钟。