我的用例需要传递SSL,因此我们不能在Openshift中本地使用基于路径的路由。我们的下一个最佳解决方案是设置内部NGINX代理,以将路径中的流量路由到另一个Web UI的Openshift路由。我这样做时会遇到错误。
这是我简化的NGINX配置:
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /etc/nginx/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
upstream app1-ui-1-0 {
server app1-1-0.192.168.99.100.nip.io:443;
}
server {
listen 8443 ssl default_server;
location /apps/app1/ {
proxy_pass https://app1-ui-1-0/;
}
}
}
我的app1路由配置如下:
apiVersion: v1
kind: Route
metadata:
name: app1-1-0
spec:
host: app1-1-0.192.168.99.100.nip.io
to:
kind: Service
name: app1-1-0
tls:
insecureEdgeTerminationPolicy: Redirect
termination: passthrough
当我点击https://app1-1-0.192.168.99.100.nip.io
时,应用程序正常运行。
当我点击NGINX代理路由网址(https://proxier-1-0.192.168.99.100.nip.io
)时,它会正确加载nginx的标准index.html位置。
但是,当我尝试通过https://proxier-1-0.192.168.99.100.nip.io/apps/apps1/
通过代理点击app1时,我收到以下Openshift错误:
Application is not available
The application is currently not serving requests at this endpoint. It may not have been started or is still starting.
通过日志和测试,我知道请求进入/apps/app1/
位置块,但它永远不会到达app1的NGINX。我也确认此错误来自app1的路由器或服务,但我不知道如何排除故障,因为它们都没有日志。有什么想法吗?
答案 0 :(得分:2)
当您想要对在同一个OpenShift群集中运行的其他应用程序发出请求时,在大多数情况下,正确的解决方案是使用内部DNS。
OpenShift附带一个SDN,可以在Pod之间启用通信。这比通过其路由与另一个Pod通信更有效,因为这通常会在请求再次到达OpenShift路由器之前将请求路由回公共互联网,并且此时通过SDN转发。
可以联系到<service>.<pod_namespace>.svc.cluster.local
服务,在您的情况下,NGINX可以通过server apps1-1-0.myproject.svc.cluster.local
进行代理
路由通常应用于将外部流量路由到群集中。
有关网络的详细信息,请参阅OpenShift docs
答案 1 :(得分:0)
根据上面的评论,我最终放弃了路线并在NGINX的上游引用了服务的内部DNS:
upstream finder-ui-1-0 {
server apps1-1-0.myproject.svc.cluster.local:443;
}
这非常适合我的需求并且运作良好。