部署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访问端点,不想使用端口转发,求解决方案。
问题核心是容器端口配置不匹配,修复步骤如下:
明确端口对应关系
Spring Boot应用默认监听8080端口,Dockerfile未修改端口配置,容器内应用实际运行在8080端口。docker-compose的8082:8080只是宿主机到容器的端口映射,但Kubernetes配置里错误地将containerPort和targetPort设为了8082,导致服务无法正确路由到容器内的应用端口。修正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
- 更新
重新部署配置
执行命令更新部署:kubectl apply -f deployment.yml kubectl apply -f service.yml额外验证点
若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

