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

时间:2019-07-26 20:17:12

标签: java tomcat deployment kubernetes

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

ex:如下图

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
            -

1 个答案:

答案 0 :(得分:0)

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

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

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

  • 使用Ingress对象:如果您正在运行并正确配置了Ingress控制器,则可以创建一个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,详细了解入侵。

  • 您可以使用skipper之类的HTTP路由器软件来在群集中处理所有这些HTTP流量配置。

  • 如果您使用Istio之类的服务网格解决方案,它们会在网格内部为您提供many ways to manage the traffic