如何在内部调用部署在 k8 集群中的 springboot 服务?

How to call springboot services deployed in a k8 cluster internally?

提问人:Ali Hamza 提问时间:11/18/2023 最后编辑:Ali Hamza 更新时间:11/18/2023 访问量:22

问:

我有 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-serviceprometapi-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-serviceprometapi-gm-service

但是,我检查了运行服务的 pod 的日志,并看到了以下错误:prometapi-ll-service

error image

我尝试连接到服务后立即出现错误: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 服务快照:

services running

所有 API 都是 MAVEN 项目

这些 API 如何在集群内相互调用?如果我遗漏了什么,请指导我。它与我打包和构建 docker 映像的方式有什么关系吗?的任何角色?server.servlet.context.path

我需要我的服务能够在集群内相互通信。

提前致谢!

Java Spring Docker Maven Kubernetes

评论


答: 暂无答案