You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署Spring Boot到Minikube后无法访问REST端点的解决方法

问题描述

我有一个Spring Boot Web应用,已Docker化,希望通过Minikube部署到本地Kubernetes集群并访问其REST端点。

相关代码与配置

REST API代码

@RestController
public class SampleController {

    @RequestMapping("/x")
    public String example(){
        return "hello world";
    }
}

Dockerfile

FROM eclipse-temurin:17
ARG JAR_FILE=target/k8s-example-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

docker-compose.yml

version: '3.1'
services:
  app:
    container_name: first-docker-container
    restart: always
    image: first-docker-image
    build: ./
    ports:
      - "8082:8080"

执行docker build -t first-docker-image .和docker-compose up后,可正常通过localhost:8082/x访问端点。

Kubernetes Deployment配置(deployment.yml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: first-kubernetes-example
spec:
  selector:
    matchLabels:
      app: first-kubernetes-example
  replicas: 1
  template:
    metadata:
      labels:
        app: first-kubernetes-example
    spec:
      containers:
        - name: first-kubernetes-example
          image: first-docker-image
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8082

Kubernetes Service配置(service.yml)

apiVersion: v1
kind: Service
metadata:
  name: my-service-with-nodeport
spec:
  type: NodePort
  ports:
    - port: 9090
      targetPort: 8082
      nodePort: 30008
      protocol: "TCP"
  selector:
    app: first-kubernetes-example

执行kubectl apply -f deployment.yml和kubectl apply -f service.yml后,应用已成功部署到Kubernetes Pod。kubectl get services输出如下:

NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes                 ClusterIP   10.96.0.1       <none>        443/TCP          122m
my-service-with-nodeport   NodePort    10.104.11.180   <none>        9090:30008/TCP   121m

Minikube IP为192.168.59.2,但无法通过192.168.59.2:30008/x访问端点,不想使用端口转发,求解决方案。


解决方案

问题核心是容器端口配置不匹配,修复步骤如下:

  1. 明确端口对应关系
    Spring Boot应用默认监听8080端口,Dockerfile未修改端口配置,容器内应用实际运行在8080端口。docker-compose的8082:8080只是宿主机到容器的端口映射,但Kubernetes配置里错误地将containerPort和targetPort设为了8082,导致服务无法正确路由到容器内的应用端口。

  2. 修正Kubernetes配置

    • 更新deployment.yml,将容器端口改为8080:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: first-kubernetes-example
      spec:
        selector:
          matchLabels:
            app: first-kubernetes-example
        replicas: 1
        template:
          metadata:
            labels:
              app: first-kubernetes-example
          spec:
            containers:
              - name: first-kubernetes-example
                image: first-docker-image
                imagePullPolicy: IfNotPresent
                ports:
                  - containerPort: 8080  # 修正为应用实际监听的端口
      
    • 更新service.yml,将targetPort改为8080:
      apiVersion: v1
      kind: Service
      metadata:
        name: my-service-with-nodeport
      spec:
        type: NodePort
        ports:
          - port: 9090
            targetPort: 8080  # 修正为容器内应用的端口
            nodePort: 30008
            protocol: "TCP"
        selector:
          app: first-kubernetes-example
      
  3. 重新部署配置
    执行命令更新部署:

    kubectl apply -f deployment.yml
    kubectl apply -f service.yml
    
  4. 额外验证点
    若Pod启动异常,检查Minikube是否能访问本地构建的镜像:执行eval $(minikube docker-env)切换到Minikube的Docker环境,重新构建镜像docker build -t first-docker-image .,确保Kubernetes能拉取到镜像。

等待Pod重启完成后,访问192.168.59.2:30008/x即可获取"hello world"响应。


内容的提问来源于stack exchange,提问作者EMRE BİNNAZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:20:38