docker - 将流量重定向到Kubernetes服务中的Tomcat上下文路径

标签 docker kubernetes jira nginx-ingress

在通过更改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/

相关文章:

deployment - 如何将版本控制系统修订与 Docker 镜像版本同步?

docker - 使用 nginx 的动态 ssl 证书

kubernetes - 如何启动和停止 Kubernetes 1.8.5 集群?

docker - 哦,我的 Zsh 在 docker 中安装失败

docker - Dockerfile 中的路径解释

jira - 通过解决方案过渡 Jira 问题

JIRA 将票证标记为已接受/确认

json - 当我使用 JIRA REST API 发布时,我发送什么 JSON?

docker - 在Kubernetes上运行dotnet core 3.0 docker镜像时出错

kubernetes - CommonAnnotations 不适用于 AlertManager