java - Helm Chart Spring Boot 应用程序启动后立即关闭

标签 java spring spring-boot kubernetes kubernetes-helm

我正在尝试使用 Helm Chart 在 kubernetes 集群上部署 Spring Boot 微服务。但我注意到一个奇怪的问题,我的 Spring Boot 应用程序启动,但之后立即关闭

这是日志

Started JhooqK8sApplication in 3.431 seconds (JVM running for 4.149)
2020-06-25 20:57:24.460  INFO 1 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
2020-06-25 20:57:24.469  INFO 1 --- [extShutdownHook] o.e.jetty.server.AbstractConnector       : Stopped ServerConnector@548a102f{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2020-06-25 20:57:24.470  INFO 1 --- [extShutdownHook] org.eclipse.jetty.server.session         : node0 Stopped scavenging
2020-06-25 20:57:24.474  INFO 1 --- [extShutdownHook] o.e.j.s.h.ContextHandler.application     : Destroying Spring FrameworkServlet 'dispatcherServlet'
2020-06-25 20:57:24.493  INFO 1 --- [extShutdownHook] o.e.jetty.server.handler.ContextHandler  : Stopped o.s.b.w.e.j.JettyEmbeddedWebAppContext@56528192{application,/,[file:///tmp/jetty-docbase.4637295322181051129.8080/],UNAVAILABLE}

Spring Boot版本:2.2.7.RELEASE Spring Boot 的 Docker Hub 公共(public)镜像:rahulwagh17/kubernetes:jhooq-k8s-springboot-jetty

当我手动使用 kubectl 命令创建部署和服务 Spring Boot 部署时,我注意到一件奇怪的事情,一切都很好。

vagrant@kmaster:~$ kubectl create deployment demo --image=rahulwagh17/kubernetes:jhooq-k8s-springboot-jetty

vagrant@kmaster:~$ kubectl expose deployment demo --type=LoadBalancer --name=demo-service --external-ip=1.1.1.1 --port=8080

(我按照本指南在 kubernete 上部署 Spring Boot - Deploy spring boot on kubernetes cluster )

我只是想知道 Spring Boot 或我的 Helm 设置是否有问题?

这是我的 Helm 模板 -

---
# Source: springboot/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: RELEASE-NAME-springboot
  labels:
    helm.sh/chart: springboot-0.1.0
    app.kubernetes.io/name: springboot
    app.kubernetes.io/instance: RELEASE-NAME
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
---
# Source: springboot/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: RELEASE-NAME-springboot
  labels:
    helm.sh/chart: springboot-0.1.0
    app.kubernetes.io/name: springboot
    app.kubernetes.io/instance: RELEASE-NAME
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: springboot
    app.kubernetes.io/instance: RELEASE-NAME
---
# Source: springboot/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: RELEASE-NAME-springboot
  labels:
    helm.sh/chart: springboot-0.1.0
    app.kubernetes.io/name: springboot
    app.kubernetes.io/instance: RELEASE-NAME
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: springboot
      app.kubernetes.io/instance: RELEASE-NAME
  template:
    metadata:
      labels:
        app.kubernetes.io/name: springboot
        app.kubernetes.io/instance: RELEASE-NAME
    spec:
      serviceAccountName: RELEASE-NAME-springboot
      securityContext:
        {}
      containers:
        - name: springboot
          securityContext:
            {}
          image: "rahulwagh17/kubernetes:jhooq-k8s-springboot-jetty"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          resources:
            {}
---
# Source: springboot/templates/tests/test-connection.yaml
apiVersion: v1
kind: Pod
metadata:
  name: "RELEASE-NAME-springboot-test-connection"
  labels:
    helm.sh/chart: springboot-0.1.0
    app.kubernetes.io/name: springboot
    app.kubernetes.io/instance: RELEASE-NAME
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
  annotations:
    "helm.sh/hook": test-success
spec:
  containers:
    - name: wget
      image: busybox
      command: ['wget']
      args: ['RELEASE-NAME-springboot:80']
  restartPolicy: Never

最佳答案

2020-06-25 20:57:24.469 INFO 1 --- [extShutdownHook] o.e.jetty.server.AbstractConnector : Stopped ServerConnector@548a102f{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}

         ports:
           - name: http
             containerPort: 80

看来 active 探针(配置为联系名为 http 的端口)正在杀死您的 Pod,因为您的容器似乎正在监听 :8080,但您已告诉 kubernetes 它正在监听 :80

由于 kubectl 创建的部署不会有任何此类特殊性,因此 kubernetes 不会使用 active 探针,因此您就可以了

如果您想测试该理论,通常可以通过环境变量配置 spring 应用程序:

      containers:
        - name: springboot
          env:
          - name: SERVER_PORT
            value: '80'
          # and its friend, which is the one that 
          # you should be using for liveness and readiness
          - name: MANAGEMENT_SERVER_PORT
            value: '8080'
          securityContext:
            {}
          image: "rahulwagh17/kubernetes:jhooq-k8s-springboot-jetty"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
              protocol: TCP

关于java - Helm Chart Spring Boot 应用程序启动后立即关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62584555/

相关文章:

c# - 将构建器方法与服务方法相结合 - 不好的做法?

reactjs - 如何将 axios 中的数组参数传递到 Spring Controller ?

spring-boot - 在 Mac 上使用 Jhipster 和 maven 构建(并成功运行)一个 Jar,但无法在 Ubuntu 上运行

java - 使用枚举的工厂

java - 如何得到所有相加成一个数的连续数集?

java - 为什么我们要在 Spring Boot 中更改 servlet 上下文路径?

java - 带有 Spring Data REST 的不同 REST API 的多个调度程序 servlet 的 Spring Boot (JAR)

java - 在数据迁移时,出现错误 : operator does not exist: boolean = integer Hint: No operator matches the given name and argument types

java - 如何使用 JDK 7 区分文件删除和目录删除?

java - Bean创建异常