我们有一个 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/