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 中工作。
我有一个带有控制器 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 中工作。