我们有一个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
-
答案 0 :(得分:0)
设置应用程序上下文路径的方法很少。
.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
来管理路径前缀剥离和其他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。