【问题标题】:Minikube springboot receive request and doesn't respond correctlyMinikube springboot 收到请求并没有正确响应
【发布时间】:2019-12-06 21:44:32
【问题描述】:

我从 kubernetes 和 docker 开始,遇到了一个问题。

在将其转换为 docker 映像(使用 minikube 的 docker)后在 minikube 上部署了一个 springboot 应用程序...该应用程序在线并接收请求,如下面的屏幕截图所示,但没有按预期回复。

例如,当我正常部署应用程序时(像往常一样在我的计算机上)一切正常,我可以继续所有 html 页面等,但一旦部署在 minikube 中,它就无法正确回复。 (所有工作部分都是spring favicon的接收)

用于部署应用的 YAML:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: esse-deployment-1
  labels:
    app: esse
spec:
  replicas: 1
  selector:
    matchLabels:
      app: esse-1
  template:
    metadata:
      labels:
        app: esse-1
    spec:
      containers:
      - image: mysql:5.7
        name: esse-datasource
        ports:
        - containerPort: 3306
        env: 
          - name: MYSQL_ROOT_PASSWORD
            value: esse_password 
      - image: esse_application
        name: esse-app-1
        imagePullPolicy: Never
        ports:
        - containerPort: 8080
      volumes:
        - name: esse-1-mysql-persistent-storage
          persistentVolumeClaim:
            claimName: mysql-persistent-storage-claim
---

apiVersion: v1
kind: Service
metadata:
  name: esse-service-1
spec:
  selector:
    app: esse-1
  ports:
    - protocol: TCP
      port: 8080
  type: NodePort

----

kind: PersistentVolume
apiVersion: v1
metadata:
  name: mysql-persistent-storage
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/home/docker/data"

---

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-persistent-storage-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 200Mi

构建镜像的Docker文件:

FROM openjdk:8
ADD ESSE_Application.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

【问题讨论】:

  • 这可能是一个复制粘贴错误,但似乎在 Service 和 PersistentVolume 定义之间缺少 YAML 文档分隔符 ---
  • 是的,抱歉忘记添加 --- 一旦我复制了 yaml 代码(我在单独的文件中有这些 yaml 定义)
  • 如果你这样做curl http://pod_ip:8080会有更好的结果吗?这样我们应该能够判断问题是来自您的应用还是您的服务配置。
  • 不,我得到相同的结果,在 minikube 内运行 curl 172.17.0.4:8080(在运行 minikube ssh 之后),其中 172.17.0.4 是 pod_ip,它给出:{"timestamp":1564484568041,"status" :404,"error":"Not Found","message":"No message available","path":"/"} ...但请注意,当应用程序在我的计算机上运行时,它工作得很好://
  • 好的,所以问题不在于您的 K8S 服务,而可能来自您在 K8S 中的应用程序配置。你在 K8S 中启动应用后查看 spring-boot 日志了吗?

标签: spring-boot docker kubernetes web-deployment minikube


【解决方案1】:

我可以看到您有 .yml 文件来定义部署和服务,但我看不到“入口”。需要一个kind: Route 的 .yml 文件来告诉 kubernetes 应该有一个指向您的服务的外部 url;一个最小的 Ingress 资源示例:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        backend:
          serviceName: test
          servicePort: 80

**请不要从字面上理解这段代码,我只是想在这里起草一些示例代码,可能与您的命名/数据不完全匹配:)

【讨论】:

  • kind: Route 是 Kubernetes 或 OpenShift 特定的资源吗?
  • 对不起,我理解 minishift !我的错,那你需要一个入口吗? kubernetes.io/docs/concepts/services-networking/ingress
  • 我认为没有必要避免这个问题,我已经公开了其他应用程序(在练习 kubernetes 基础知识时)并且从未使用过入口插件,仅通过添加 TypeNode 类型服务来公开。 .. 问题可能出在其他地方
【解决方案2】:

终于解决了问题。

一切正常,因为我从 Eclipse IDE 启动应用程序,并且在打包 .jar 文件时,/webapp 中包含的 jps 文件/WEB-INF/jsps 文件夹未包含在 .jar 文件中,甚至将它们包含在 pom.xml 文件中的 <resources> 标记也无法解决问题,因为jar 打包不适合 jsp 文件。

我通过在 pom.xml 文件中添加 <packaging>war</packaging> 来解决问题,以更改打包方法,因为 .jsp 文件在 .war 文件中感觉很舒服。

感谢@Marc 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2021-11-04
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多