提问人:Ali Hamza 提问时间:11/18/2023 最后编辑:Ali Hamza 更新时间:11/18/2023 访问量:22
如何在内部调用部署在 k8 集群中的 springboot 服务?
How to call springboot services deployed in a k8 cluster internally?
问:
我有 4 个 springboot API,我已经在笔记本电脑上的 kubernetes 集群上解耦并部署了 docker 映像。我还设置了处理不同 URL 和重定向到每个 API 的入口。
以下是我的入口:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: prometapi-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
ingressClassName: nginx
rules:
- host: localhost
http:
paths:
- path: /promet/api/auth/.*
pathType: ImplementationSpecific
backend:
service:
name: prometapi-auth-service
port:
number: 80
- path: /promet/api/gm/.*
pathType: ImplementationSpecific
backend:
service:
name: prometapi-gm-service
port:
number: 80
- path: /promet/api/ll/.*
pathType: ImplementationSpecific
backend:
service:
name: prometapi-ll-service
port:
number: 80
- path: /promet/api/srch/.*
pathType: ImplementationSpecific
backend:
service:
name: prometapi-search-service
port:
number: 80
当我尝试直接从浏览器访问服务时,它们工作正常。下面是一个示例 URL:http://localhost:8089/promet/api/srch/exist/1
另请注意,我构建了我的 docker 映像,也正确指定了以下内容:(与每个应用程序的入口路径规则相同)
--server.servlet.context-path=/promet/api/gm
下面是我用来构建映像的 Docker 文件之一(其余 3 个是 ASME,除了 jar 文件名和上下文路径)。
FROM maven:3.9.1-amazoncorretto-17 AS build
# Set the working directory in the container
WORKDIR /app
# Copy the Maven project file
COPY pom.xml .
# Copy your custom settings.xml into the Maven container
COPY settings.xml /usr/share/maven/ref/
# Download and install the project dependencies
ARG USERNAME
ARG PASSWORD
RUN sed -i "s|\${promet.server.username}|${USERNAME}|" /usr/share/maven/ref/settings.xml && \
sed -i "s|\${promet.server.password}|${PASSWORD}|" /usr/share/maven/ref/settings.xml
# Download and install the project dependencies
RUN mvn --settings /usr/share/maven/ref/settings.xml dependency:go-offline -B
# Copy the application source code
COPY src src
# Build the application
RUN mvn clean package -DskipTests
# Use AdoptOpenJDK as the base image for the runtime image
FROM amazoncorretto:17-alpine-jdk
# Set the working directory in the container
WORKDIR /app
# Copy the JAR file built in the previous stage
COPY --from=build /app/target/live-language-metadata-manager-0.2.0.jar .
# Specify the command to run on container start
CMD ["java", "-jar", "live-language-metadata-manager-0.2.0.jar", "--server.servlet.context-path=/promet/api/ll"]
下面给出的是同一 API 的部署 + 服务文件(除了图像名称和应用程序标签外,其他文件都相似)
prometapi-ll-service.yaml
kind: Deployment
metadata:
name: prometapi-ll
spec:
replicas: 1
selector:
matchLabels:
app: prometapi-ll
template:
metadata:
labels:
app: prometapi-ll
spec:
containers:
- name: prometapi-ll
image: prometapi-ll:v1.3
# imagePullPolicy: Never #Always for live
ports:
- containerPort: 8083
volumeMounts:
- name: config-volume
mountPath: /app/config
env:
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: prometapi-auth-secrets
key: postgres-password
volumes:
- name: config-volume
configMap:
name: prometapi-ll-config
---
apiVersion: v1
kind: Service
metadata:
name: prometapi-ll-service
spec:
selector:
app: prometapi-ll
ports:
- protocol: TCP
port: 80
targetPort: 8083 # Adjust the target port for each service
现在的问题是我的 API 端点在内部发出和 HTTP 请求,以达到以下 url:prometapi-ll-service
prometapi-gm-service
http://prometapi-gm-service:80/my-endpoint-of-gm-api
我用于启动第一个服务的 URL:http://localhost:8089/promet/api/ll/my-ll-endpoint
Ingress 将我的请求从浏览器重定向到正确的位置,在一些业务逻辑之后,稍后调用给出以下错误的服务。prometapi-ll-service
prometapi-gm-service
但是,我检查了运行服务的 pod 的日志,并看到了以下错误:prometapi-ll-service
我尝试连接到服务后立即出现错误:prometapi-gm-service
我的 java 代码(以前在本地工作正常)行返回错误:
HttpRequest.newBuilder()
.POST(HttpRequest.BodyPublishers.ofString(content))
.version(HttpClient.Version.HTTP_2)
.header("Content-Type", "application/json")
.uri(URI.create("http://prometapi-gm-service:80" + id))
.build(),
HttpResponse.BodyHandlers.ofString());
以前,我在不同端口的 localhost 上运行所有这些 API,一切都是工作文件。自从构建映像并迁移到 docker 以来,我看到了这个问题。所有服务都在同一个集群中,并且是 ClusterIp 服务:
另请参阅下面的 docker 服务快照:
所有 API 都是 MAVEN 项目
这些 API 如何在集群内相互调用?如果我遗漏了什么,请指导我。它与我打包和构建 docker 映像的方式有什么关系吗?的任何角色?server.servlet.context.path
我需要我的服务能够在集群内相互通信。
提前致谢!
答: 暂无答案
评论