Micronaut 应用程序 URL 在本地工作但在 kubernetes 中不工作

Micronaut application URL works locally but not in kubernetes

我有一个带有控制器 class 的 Micronaut 应用程序,如下所示:

@Controller("/murugesso")
public class Server {

  @Get("debug/loadVins")
  public MutableHttpResponse<String> loadVins(HttpRequest<?> request) {

    new VinLoader().load();
    return HttpResponse.ok().body("VIN load in progress...");
  }
}

Kubernetest 清单如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: murugesso
  labels:
    app: murugesso
spec:
  selector:
    matchLabels:
      app: murugesso
  template:
    metadata:
      labels:
        app: murugesso
    spec:
      containers:
        - name: murugesso
          image: murugesso:latest"
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
              name: murugesso
              hostPort: 8080

当我在本地 运行 应用程序(通过 IDE 或 JAR)时,以下 URL 有效: http://localhost:8080/murugesso/debug/loadVins

但是当我将相同的应用程序部署到 kubernetes 时,我收到一个 Micronaut 错误,指出找不到这样的 URL:

{"message":"Page Not Found","_links":{"self":{"href":"/murugesso/debug/loadVins","templated":false}}}

我已经检查过我使用的是相同的 URL 并且该错误是 Micronaut 错误,而不是 kubernetes 或网络错误。

编辑:我检查了 /routes 端点,看起来我的控制器中定义的路由 none 出现了。为什么 Micronaut 无法识别其中的任何一个? (同样,我已经尝试在 minikube 上部署相同的图像并且它完美运行!)

我假设您没有使用反向代理或 Ingress 可能会重写您的路径,从而导致此错误。

根据有限的信息,我的假设是您在应用程序的后期添加了控制器/路径并重建了映像。 Kubernetes 会检查是否有更新的镜像可用,因为在创建新的 Pod.

时镜像标签是 :latest

但是如果通过 imagePullPolicy: IfNotPresent 配置已经存在具有匹配标签的图像,则您配置节点不应检查更新的图像。

如果这确实是问题,我建议使用独特的图像标签(f.e。git 提交哈希)或将 imagePullPolicy 更改为 Always,这样您获取创建 Pod 时的最新映像版本。

我想通了。 Micronaut 或 Kubernetes 从来没有出现过这个问题。

我的 pom 中有多余的条目,具体如下:

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.11</source>
          <target>1.11</target>
        </configuration>
</plugin>

这导致构建了一个空的 JAR。它在本地工作的原因是因为 IntelliJ 能够以某种方式构建正确的 JAR(而且它似乎在绕过 pom)。

一旦我修复了我的 pom,就构建了正确的 JAR,它在 kubernetes 中工作。