java - 通过 kubernetes 和 helm 将单个 docker 镜像部署为 2 个不同的服务。更改应用程序的上下文路径

标签 java tomcat deployment kubernetes

我们有一个 docker 镜像,它通过 kubernetes 和 helm 部署为 2 个不同的服务,名称如“ServiceA”和“ServiceB”。在部署时,需要将 Tomcat 的上下文路径设置为不同的内容,例如/ServiceA 和/ServiceB。如何才能做到这一点 ?有什么可以直接在 yaml 上设置的吗?

例如:看起来像下面

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "fullname" . }}-bg
  {{- include "labels" . }}

spec:
  replicas: {{ .replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "name" . }}-bg
      app.kubernetes.io/instance: {{ .Release.Name }}
  strategy:
    type: Recreate 
    rollingUpdate: null 
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "name" . }}-bg
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .image.repository }}:{{ .image.tag }}"
          imagePullPolicy: {{ .image.pullPolicy }}
          env:           
            - name: SERVICE_NAME
              value: "ServiceB"
            - name: background.jobs.enabled
              value: "true"
          envFrom:
            - configMapRef:
                name: {{ include "commmonBaseName" . }}-configmap
            -

最佳答案

设置应用上下文路径的方法很少。

  • 来自应用本身:这取决于您的应用使用的语言/框架/运行时。例如,如果它是在 Tomcat 上运行的传统 Java Web 应用程序,默认情况下将从 .war 名称的上下文路径提供服务。您放入 webapp 中的文件目录。或者,如果它是 Spring Boot 2.X 应用程序,您可以使用 Spring Boot 属性 server.servlet.context-path 对其进行设置。 ,也可以通过环境变量传递,特别是 SERVER_SERVLET_CONTEXT_PATH .因此,举个例子,在您的部署 pod 规范中的容器中:
env:           
  - name: SERVER_SERVLET_CONTEXT_PATH
    value: "/ServiceB"

但是,在大多数情况下,Kubernetes 不需要这种特定于应用程序的设置,因为您可以在外层处理这些问题。

  • 使用 Ingress 对象:如果你有一个 Ingress Controller 正在运行并正确配置,你可以创建一个 Ingress它将管理路径前缀剥离和其他 HTTP Layer7 问题。这意味着,您可以保持应用程序本身不变(例如从根上下文 / 提供服务),但从 Ingress 配置上下文路径。示例如下,假设您使用 Nginx Ingress Controller
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: service-a-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: service-a.yourdomain.com
      http:
        paths:
          - path: /ServiceA/(.*)
            backend:
              serviceName: service-a
              servicePort: service-a-port

注意捕获组 (.*)path , 和 $1在重写目标中-它将重写请求路径,如 /ServiceA/something/something在将数据包转发到您的后端之前。

参见 this page了解更多关于入口的信息。

  • 您可以使用 HTTP 路由器软件,例如 skipper在集群内处理所有这些 HTTP 流量配置。

  • 如果您使用服务网格解决方案,例如 Istio , 他们给你 many ways to manage the traffic网格内部。

关于java - 通过 kubernetes 和 helm 将单个 docker 镜像部署为 2 个不同的服务。更改应用程序的上下文路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57226550/

相关文章:

java - Spring批量集成

css - Apache2 重写规则导致错误

java - 使用 tomcat 7 从项目中删除 SSL 证书

tomcat - 如何在 tomcat6 中使用带有 BASIC 身份验证的散列密码?

visual-studio - 如何部署和注册支持多个版本的 Visual Studio(2005、2008、2010)的 VSPackage?

c# - 是否有必要在类库中部署 XML 文件?

Java Stream.collect groupingBy 和聚合类

java - 内部类的实例化

java - Spring RestTemplate 配置策略从单个 API 调用多个 rest 服务

java - 在运行的生产环境中添加类文件