Сбой проверки готовности/работоспособности приложения Spring boot (сервер конфигурации Spring Cloud)

#spring-boot #kubernetes #kubernetes-helm #spring-boot-actuator

Вопрос:

В настоящее время я пытаюсь запустить сервер конфигурации spring cloud и запустить его как приложение для загрузки spring. Я настроил зависимости в pom.xml для /привода, а также есть шаблон выпуска руля с приложением.свойства в виде конфигурационной карты, как показано ниже. После развертывания, когда я описываю модуль, я продолжаю получать неудачные тесты на живучесть/готовность, из-за которых модуль переходит в бесконечный цикл перезапусков. Любые указания на то, что я делаю неправильно, были бы замечательными.

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.asdf.asdf.configserver</groupId>
    <artifactId>asdf-config-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.version>1.8</java.version>
        <spring-cloud.version>2020.0.3</spring-cloud.version>
    </properties>

    <dependencies>
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-bus-amqp</artifactId>-->
<!--        </dependency>-->      
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-core</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
<repositories>
        <repository>
            <id>maven-public</id>
            <url>https://nexus.tools.asdfasd.asdfasdf.com/repository/maven-public/</url>
        </repository>
        <repository>
            <id>releases</id>
            <url>https://nexus.tools.fxi-asdfasdf.asdf.com/repository/maven-releases/</url>
        </repository>
        <repository>
            <id>snapshots</id>
            <url>https://nexus.tools.asdfasdf.com/repository/maven-snapshots/</url>
        </repository>
    </repositories>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.5.RELEASE</version>
            </plugin>
        </plugins>
    </build>

</project>

 
 replicaCount: 1
java_app: true
memory_limit: 1024

memory_percent: 20

resources:
  limits:
    cpu: "0.5"
    # memory: 256Mi
  requests:
    cpu: "0.1"
    # memory: 256Mi


container:
  ports:
    - name: http
      containerPort: 8080
      servicePort: 80
      protocol: TCP

ingress:
  internal:
    enabled: true
    port: http

healthChecks:
  livenessProbe:
    httpGet:
      path: /actuator/health
      port: http
    initialDelaySeconds: 90
    timeoutSeconds: 25
    periodSeconds: 20
    failureThreshold: 3
  readinessProbe:
    httpGet:
      path: /actuator/health
      port: http
    initialDelaySeconds: 90
    timeoutSeconds: 25
    periodSeconds: 20
    failureThreshold: 3


# Container environment variables
extraVars:
 - name: SPRING_CONFIG_LOCATION
   value: "/spring/config/"


configMaps:
  /spring/config:
    inline:
      - name: application.properties
        content: |-
          server.port=8080
          spring.application.name=asdf-configserver-service 

          spring.cloud.config.server.git.uri=https://github.asdfad.com/asdfa/configs
          spring.cloud.config.server.git.password={GITHUB_TOKEN}

          spring.cloud.config.server.git.default-label=test
          spring.cloud.config.server.git.searchPaths={application}
          
          management.metrics.tags.application=asdf-configserver-service
          management.metrics.tags.version=@project.version@
          management.security.enabled=false
          management.endpoint.info.enabled=true
          management.endpoint.health.enabled=true
          management.endpoint.shutdown.enabled=true
          management.endpoints.jmx.exposure.include=health,info
          management.endpoints.web.exposure.include=*

          endpoints.health.sensitive=false
          security.basic.enabled=false
          management.endpoint.health.show-details=always
          management.server.ssl.enabled=false

          management.endpoint.metrics.enabled=true
          management.endpoint.prometheus.enabled=true
          management.metrics.export.prometheus.enabled=true

          info.app.name=adsfasdf-configserver-service
          info.app.description=asdfasd asdfasdf config server.
          info.app.version=1.0.0

akv2k8s:
  GITHUB_TOKEN:
    vault: asdfasdfasdfasdfzcxva
    type: secret
    secretName: github-token
 

Комментарии:

1. Вы пытались проверить, хорошо ли работает конечная точка /привод/работоспособность? Временно отключите проверки работоспособности, чтобы избежать перезапуска модуля, и разверните приложение. Затем вызовите эту конечную точку вашего приложения и проверьте, возвращает ли оно статус 200 (и некоторый ответ, например «статус»: «ВВЕРХ»). Таким образом, вы сможете определить неисправную часть — будь то невозможность доступа к конечной точке с помощью проверки работоспособности, или конфигурация приложения, из-за которой конечная точка работает неправильно, или что-то не так с приложением, поэтому оно не возвращает 200. Также проверьте журналы вашего приложения.

2. да, спасибо за совет по отладке. Когда я устанавливаю порт-вперед, чтобы увидеть, если /привод/здоровье конечной точки добраться не наедаться «статус»: «до» и я вижу, что приложение записывает нормально, но журналы ошибок в порт-вперед, как показано ниже — E1005 22:26:52.593027 56807 portforward.перейти:340] ошибка при создании потока ошибок на порту 9000 -> 8080: тайм-аут произошел

3. @Avi Можете ли вы попробовать решение из документации Spring для зондов Kubernetes с различными путями для зондов живучести и готовности? путь: /привод/здоровье/жизнестойкость путь: /привод/здоровье/готовность

4. Это не должно иметь никакого значения, потому что в документации Spring также четко указано, что, хотя она предоставляет отдельные конечные точки для проверки живучести и готовности (поэтому ее стоит использовать), она все равно должна работать, если вы используете только /привод/здоровье. Но в целом это правильно, что стоит использовать эти отдельные конечные точки. @Avi, вы определили услугу? Я не вижу этого в вашем коде, и в этом случае ваш контейнер недоступен извне.

5. @PawelWoroniecki — да, вы правы, это не имеет значения, если мы добавим /живость и /готовность к /приводу/здоровью, хотя это хорошая практика. В любом случае, я наконец-то решил проблему с /приводом/конечной точкой работоспособности и вижу ответ ниже: