Сбой развертывания DSpace jspui в Google Kubernetes после обновления GKE

#spring-boot #tomcat #google-kubernetes-engine #dspace

#spring-boot #tomcat #google-kubernetes-engine #dspace

Вопрос:

У нас есть развертывание DSpace 6.3 для Google Kubernetes Engine (GKE), которое всегда работало идеально. Однако, когда мы обновили GKE с версии v1.12.7-gke.24 до 1.14.10-gke.50, контейнер внезапно вышел из строя. Изменение версии k8s — единственное различие между работающим и неисправным узлами k8s. Локально созданные контейнеры docker работают нормально. Мы развертываем другие модули DSpace в отдельных контейнерах (например, solr), они работают нормально, сбой только в модуле jspui.

Ветка DSpace «dspace-6_x» с тегом «dspace-6.3»

Изображение Docker: tomcat: 8-alpine

Развертывание через конвейер gitlab CI / CD

Сбой вызван падением загрузчика Spring при вызове ранней загрузки различных компонентов одноэлементного шаблона DSpace factory service. Это приводит к ошибке 404 при загрузке сайта, поскольку веб-приложение не удалось инициализировать.

Сообщение об ошибке в /usr/local/tomcat/log/localhost .ГГГГ-ММ-дд.журнал:

 28-Oct-2020 23:47:18.668 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.listenerStart 
Exception sending context initialized event to listener instance of class 
[org.dspace.servicemanager.servlet.DSpaceKernelServletContextListener]
        java.lang.RuntimeException: Failure during filter init: Failed to startup the DSpace Service 
Manager: failure starting up spring service manager: Error creating bean with name 
'org.dspace.app.sherpa.submit.SHERPASubmitService' defined in URL 
[jar:file:/dspace/webapps/jspui/WEB-INF/lib/dspace-api-6.3.jar!/spring/spring-dspace-addon-sherpa-services.xml]: 
Cannot resolve reference to bean 'org.dspace.app.sherpa.submit.SHERPASubmitConfigurationService' while setting 
bean property'configuration'; nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'org.dspace.app.sherpa.submit.SHERPASubmitConfigurationService' defined in 
file [/dspace/config/spring/api/sherpa.xml]: Cannot create inner bean 
'org.dspace.app.sherpa.submit.MetadataValueISSNExtractor#1b511285' of type 
[org.dspace.app.sherpa.submit.MetadataValueISSNExtractor] while setting bean property 
'issnItemExtractors' with key [0]; nestedexception is 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'org.dspace.app.sherpa.submit.MetadataValueISSNExtractor#1b511285': Injection of autowired dependencies 
failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire 
field: public org.dspace.content.service.ItemService 
org.dspace.app.sherpa.submit.MetadataValueISSNExtractor.itemService; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'org.dspace.content.ItemServiceImpl#0': Injection of autowireddependencies failed; nested exception is
 org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected 
org.dspace.handle.service.HandleService org.dspace.content.DSpaceObjectServiceImpl.handleService; ...

  

Сообщение об ошибке «сбой при запуске Spring Service manager» появляется при:

org.dspace.servicemanager.DSpaceServiceManager (dspace-servicessrcmainjavaorgdspaceservicemanagerDSpaceServiceManager.java строка 215)

в операторе catch из строки 212, который вызывает:

org.dspace.servicemanager.spring.SpringServiceManager.startup() (dspace-servicessrcmainjavaorgdspaceservicemanagerspringSpringServiceManager.java строка 177)

который использует Spring framework для ранней загрузки заводских компонентов.

Нашей первой мыслью было, что новой версии k8s может потребоваться больше памяти. Итак, мы увеличили объем памяти Tomcat с 1,5 ГБ до 4 ГБ. Это не решило проблему.

Мы изучили примечания к выпуску промежуточных версий GKE между нашими обновлениями, но не нашли ничего полезного.

Мы пытались использовать другие образы Tomcat docker, но безрезультатно. Итак, мы не считаем, что это проблема с ОС.

Удаленная отладка не будет подключаться к Tomcat достаточно быстро, чтобы перехватить исключения. Мы попробовали Google Cloud Debugger для Java, но в Alpine Linux отсутствуют некоторые необходимые библиотеки. Несмотря на это, я не думаю, что мы нашли бы что-то более полезное, чем регистрируемое сообщение об ошибке.

Если у кого-нибудь есть какие-либо идеи, мы были бы очень благодарны.

Our production k8s config yaml file:

 ingress:
  hosts:
    - our.url.uts.edu.au

database:
  secret: our_password
  name: our_db_name
  host: "our.db.instance.url"
  port: "5432"

dspace:
  env:
    - name: DSPACE_HOSTNAME
      value: our.url.uts.edu.au
    - name: SOLR_PORT
      value: "8080"
      # Include colon if port is specified
    - name: DSPACE_PORT
      value: ""
    - name: MAX_DB_CONNECTIONS
      value: "50"
    - name: "MAX_IDLE_DB_CONNECTIONS"
      value: "30"
    - name: INITIAL_DB_CONNECTIONS
      value: "20"
    - name: S3_ASSETSTORE_SUBFOLDER
      value: "our_folder"
    - name: S3_CONNECTION_TTL
      value: "120000"
    - name: S3_MAX_CONNECTIONS
      value: "50"
    - name: REST_EVENT_WEBHOOK_URL
      value: http://our.rest.service.url/dspace/v2/webhook
    - name: UTSLIB_FRAMEWORK_DSPACE_TOKEN
      value: OUR_TOKEN
    - name: CATALINA_OPTS
      value: "-Xms1512m -Xmx1512m"

  resources:
    requests:
      memory: "1640Mi"
      cpu: 100m
    limits:
      memory: "1896Mi"
      cpu: "450m"

solr:
  pvc:
    accessModes:
      - ReadWriteOnce
    annotations: {}
    size: 35Gi

  env:
    - name: CATALINA_OPTS
      value: "-Xms3904m -Xmx3904m -XX: UseG1GC"

  resources:
    requests:
      memory: "4032Mi"
      cpu: 50m
    limits:
      memory: "4096Mi"
      cpu: "800m"

cron:
  env:
    - name: SOLR_PORT
      value: "8080"
    - name: MAX_DB_CONNECTIONS
      value: "3"
    - name: MAX_IDLE_DB_CONNECTIONS
      value: "1"
    - name: INITIAL_DB_CONNECTIONS
      value: "0"
    - name: S3_ASSETSTORE_SUBFOLDER
      value: "our_folder"
    - name: S3_CONNECTION_TTL
      value: "120000"
    - name: S3_MAX_CONNECTIONS
      value: "50"
    - name: JAVA_OPTS
      value: "-Xms32m -Xmx384m"
    - name: REST_EVENT_WEBHOOK_URL
      value: http://our.rest.service.url/dspace/v2/webhook
    - name: UTSLIB_FRAMEWORK_DSPACE_TOKEN
      value: OUR_TOKEN
  

Our Dockerfiles are divided into build and runtime processes.
Dockerfile.build

 FROM maven:3-jdk-8

# Modules that should be excluded from depdendency resolution
ARG EXCLUDE_MODULES=!dspace-rdf,!dspace-sword,!dspace-xmlui,!dspace-xmlui-mirage2

ENV DSPACE_VERSION=6.3 
    DSPACE_SHA1=e60db8dee2726933fcc7b7949c16757a510a79c5

ENV ANT_VERSION=1.10.8
ENV ANT_HOME=/opt/ant-$ANT_VERSION
ENV PATH=$ANT_HOME/bin:$PATH 
    ANT_SHA1=20658b765bed8a7c3d18daa71a108e15d1937da2

WORKDIR /dspace-src

# Download DSpace source and install Ant
RUN curl -fSL "https://github.com/DSpace/DSpace/releases/download/dspace-${DSPACE_VERSION}/dspace-${DSPACE_VERSION}-src-release.tar.gz" -o dspace.tar.gz amp;amp; 
    echo "${DSPACE_SHA1} *dspace.tar.gz" | sha1sum -c - amp;amp; 
    tar -xz -f dspace.tar.gz --strip-components=1 amp;amp; 
    rm -f dspace.tar.gz amp;amp; 
    curl -fSL "https://archive.apache.org/dist/ant/binaries/apache-ant-${ANT_VERSION}-bin.tar.gz" -o ant.tar.gz amp;amp; 
    echo "${ANT_SHA1} *ant.tar.gz" | sha1sum -c - amp;amp; 
    mkdir ${ANT_HOME} amp;amp; 
    tar -xz -f ant.tar.gz -C ${ANT_HOME} --strip-components=1 amp;amp; 
    rm -rf ant.tar.gz

# Copy in custom artifacts
COPY ./src/artifacts/ ./artifacts

# Copy in pom.xml files
COPY ./src/dspace/pom.xml                          ./dspace/
COPY ./src/dspace/modules/pom.xml                  ./dspace/modules/
COPY ./src/dspace/modules/jspui/pom.xml            ./dspace/modules/jspui/
COPY ./src/dspace/modules/utslib-copyright/pom.xml ./dspace/modules/utslib-copyright/
COPY ./src/dspace/modules/utslib-taglib/pom.xml    ./dspace/modules/utslib-taglib/

# Install custom artifacts and prime the Maven repository 
RUN mvn clean install --batch-mode --fail-never -f ./artifacts/JRis-master amp;amp; 
    mvn install -P ${EXCLUDE_MODULES} --batch-mode --fail-never -T 5
  

Dockerfile.runtime:

 ARG BUILD_IMAGE=our.git.url/dspace/build:latest

FROM ${BUILD_IMAGE} as build

# Copy in our source changes
COPY ./src/dspace ./dspace

# We don't use these modules, but they'll be built anyway if not excluded
ARG EXCLUDE_MODULES=!dspace-rdf,!dspace-xmlui,!dspace-sword

# Unzip the MaxMind GeoLite database (IP location stuff for Solr).
# (MaxMind changed their privacy policy so you now have to login to download,
# which makes it fail for the standard DSpace installation)
# Build dspace with our source changes and move it to the installation directory
# Build only our customisations (skip building the specified modules)
# Could multithread the maven build, but there's dependency resolution problems
RUN tar -zxf ./dspace/config/GeoLite2-City_20191224.tar.gz --strip-components=1 -C ./dspace/config amp;amp; 
    rm ./dspace/config/GeoLite2-City_20191224.tar.gz amp;amp; 
    mvn package --batch-mode -P ${EXCLUDE_MODULES} -f ./dspace/pom.xml amp;amp; 
    cd ./dspace/target/dspace-installer amp;amp; 
    ant copy_webapps install_code

FROM tomcat:8-alpine
#FROM tomcat:8-jre8

ARG DSPACE_INSTALL_DIR=/dspace

ENV DSPACE_HOME=${DSPACE_INSTALL_DIR}

# Copy built source into this image
COPY --from=build ${DSPACE_INSTALL_DIR} ${DSPACE_INSTALL_DIR}

# Copy in our config overrides
# (These are not used in compilation, but are applied at runtime)
COPY ./src/local.cfg ${DSPACE_INSTALL_DIR}/config/

# Symlink all webapps and create temp upload directory
RUN ln -s ${DSPACE_INSTALL_DIR}/webapps/* ./webapps/
  

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

1. Возможно ли обновить этот кластер до текущей версии GKE по умолчанию (1.16.13-gke.401)? Не могли бы вы предоставить файлы конфигурации и шаги для воспроизведения этой проблемы?

2. Спасибо, что вернулись к нам. Мы воздерживаемся от дальнейшего обновления, учитывая, что вы можете обновлять только одну основную версию за раз, поэтому нам придется выполнять два обновления, что отнимает много времени. Также у нас есть несколько других приложений, работающих на узлах в этом кластере, и мы считаем, что риск их взлома слишком велик, а некоторые используемые нами вещи устарели, что требует существенной работы по перенастройке нашего процесса развертывания gitlab CI / CD. Я опубликую файлы конфигурации ниже.

3. Добавлены файлы конфигурации к исходному вопросу.

Ответ №1:

После реализации наиболее подробного уровня ведения журнала как в DSpace, так и в Tomcat, стало доступно больше информации об источнике ошибки Spring.

Проблема была с одним из наших пользовательских заводских классов. Извлечение журнала ошибок:

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'org.dspace.storage.bitstore.BitstreamStorageService' defined in file 
[/dspace/config/spring/api/bitstore.xml]: Cannot resolve reference to bean 's3Store' while 
setting bean property 'stores' with key [TypedStringValue: value [0], target type [null]]; 
nested exception is org.springframework.beans.factory.BeanCreationException: Error 
creating bean with name 's3Store' defined in file 
[/dspace/config/spring/api/bitstore.xml]: Error setting property values; nested exception 
is org.springframework.beans.NotWritablePropertyException: Invalid property 
's3ConnectionTTL' of bean class [org.dspace.storage.bitstore.S3BitStoreService]: Bean 
property 's3ConnectionTTL' is not writable or has an invalid setter method. Does the 
parameter type of the setter match the return type of the getter?
  

Нарушающее свойство доступно для записи, имеет действительный получатель и установщик, а получатель и установщик имеют длинный тип. Я удалил код набора свойств и просто оставил его по умолчанию. Развертывание работает.

Как простое обновление версии k8s может вызвать эту ошибку, мы не знаем. В модулях с предыдущей версией GKE точно такой же код выполняется нормально.