在通过更改server.xml
文件来设置Tomcat服务器的上下文路径的情况下,如下所示:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="${catalinaContextPath}" docBase="${catalina.home}/atlassian-jira" reloadable="false" useHttpOnly="true">
<Resource name="UserTransaction" auth="Container" type="javax.transaction.UserTransaction"
factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60"/>
<Manager pathname=""/>
<JarScanner scanManifest="false"/>
<Valve className="org.apache.catalina.valves.StuckThreadDetectionValve" threshold="120" />
</Context>
</Host>
如果
catalinaContextPath
设置为/my/new/context
,则服务器将使用以下网址在Pod中启动:localhost:8080/my/new/context
。如何更改服务,以便它将到达服务端口80的所有流量发送到容器路径<pod_ip>:8080/my/new/context
这是我目前的服务:
apiVersion: v1
kind: Service
metadata:
namespace: jira
name: jira
spec:
selector:
app: jira
component: jira
ports:
- protocol: TCP
name: serverport
port: 80
targetPort: 8080
我的用例是,我将这个this JIRA docker image部署在Pod中,并使用this documentation中指定的环境变量
CATALINA_CONTEXT_PATH
设置上下文路径。 ,当我尝试访问它时,结果为404。我认为这是因为流量已重定向到<pod_ip>:8080
,并且自tomt在<pod_ip>:8080
上启动以来,<pod_ip>:8080/my/new/context
上没有任何运行编辑:
这是我正在使用的
ingress.yaml
:apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: {{ .Values.global.app }}
name: jira-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: myhost
http:
paths:
- path: /dev/jira(/|$)(.*)
backend:
serviceName: jira
servicePort: 80
- path: /prod/jira(/|$)(.*)
backend:
serviceName: jira
servicePort: 80
每当我访问
myhost/dev/jira
时,都需要它去我的JIRA实例。
最佳答案
由于您的应用程序的“真实”根目录是/my/new/context
,因此您可以使用Nginx's /dev/jira
重写每个与AppRoot
URI匹配的传入请求:
If the Application Root is exposed in a different path and needs to be redirected, set the annotation nginx.ingress.kubernetes.io/app-root to redirect requests for /.
如果使用这种方法,则无需将捕获组与
rewrite-target
一起使用。apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: {{ .Values.global.app }}
name: jira-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/app-root: /my/new/context
spec:
rules:
- host: myhost
http:
paths:
- path: /dev/jira(/|$)(.*)
backend:
serviceName: jira
servicePort: 80
- path: /prod/jira(/|$)(.*)
backend:
serviceName: jira
servicePort: 80
关于docker - 将流量重定向到Kubernetes服务中的Tomcat上下文路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57658020/