[JAVA] Une histoire sur l'exécution de Sprint-boot avec kubernetes (GKE) et l'échec de la connexion à CloudSQL

TL;DR

  1. J'utilise gke + CloudSQL Proxy et j'ai essayé de spécifier le fichier de configuration de configmap avec spring-boot. cf. Se connecter de GKE à CloudSQL Proxy
  2. J'ai préparé une API Java qui renvoie le résultat de la requête à l'écran et l'ai frappée, mais je n'ai pas pu me connecter à CloudSQL.
  3. J'ai changé le mountPath et cela a bien fonctionné.
  4. Il est préférable de spécifier mountPath dans un emplacement qui n'a rien à voir avec le répertoire de travail du conteneur.
ex.
/deployment/config
/daemonset/config
/pod/config
etc...

Paramètres prérequis

Dockerfile

FROM frolvlad/alpine-glibc:alpine-3.9

###########################################################################
# variables:
###########################################################################

ENV JAVA_VERSION=8 \
    JAVA_UPDATE=201 \
    JAVA_BUILD=09 \
    JAVA_PATH=42970487e3af4f5aa5bca3f542482c60 \
    JAVA_HOME="/usr/lib/jvm/default-jvm" \
    MYSQL_CONNECTOR_JAVA_VERSION=5.1.40

###########################################################################
# default:
###########################################################################

RUN apk add --no-cache tzdata bash dumb-init

###########################################################################
# jdk:
###########################################################################

RUN apk add --no-cache --virtual=build-dependencies wget ca-certificates unzip && \
    cd "/tmp" && \
    wget --header "Cookie: oraclelicense=accept-securebackup-cookie;" \
        "http://download.oracle.com/otn-pub/java/jdk/${JAVA_VERSION}u${JAVA_UPDATE}-b${JAVA_BUILD}/${JAVA_PATH}/jdk-${JAVA_VERSION}u${JAVA_UPDATE}-linux-x64.tar.gz" && \
    tar -xzf "jdk-${JAVA_VERSION}u${JAVA_UPDATE}-linux-x64.tar.gz" && \
    mkdir -p "/usr/lib/jvm" && \
    mv "/tmp/jdk1.${JAVA_VERSION}.0_${JAVA_UPDATE}" "/usr/lib/jvm/java-${JAVA_VERSION}-oracle" && \
    ln -s "java-${JAVA_VERSION}-oracle" "$JAVA_HOME" && \
    ln -s "$JAVA_HOME/bin/"* "/usr/bin/" && \
    rm -rf "$JAVA_HOME/"*src.zip && \
    wget --header "Cookie: oraclelicense=accept-securebackup-cookie;" \
        "http://download.oracle.com/otn-pub/java/jce/${JAVA_VERSION}/jce_policy-${JAVA_VERSION}.zip" && \
    unzip -jo -d "${JAVA_HOME}/jre/lib/security" "jce_policy-${JAVA_VERSION}.zip" && \
    rm "${JAVA_HOME}/jre/lib/security/README.txt" && \
    apk del build-dependencies && \
    rm "/tmp/"*

###########################################################################
# Install mysql client & mysql-connector-java for hivemetastore
###########################################################################

RUN apk add --no-cache --no-progress mysql-client && \
    apk add --no-cache --virtual=build-dependencies wget ca-certificates tar && \
    wget -q -O - http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-${MYSQL_CONNECTOR_JAVA_VERSION}.tar.gz | tar -xzf - -C /tmp && \
    mv /tmp/mysql-connector-java-${MYSQL_CONNECTOR_JAVA_VERSION}/mysql-connector-java-${MYSQL_CONNECTOR_JAVA_VERSION}-bin.jar ${JAVA_HOME}/lib && \
    apk del build-dependencies && \
    rm -rf /tmp/mysql-connector-java-${MYSQL_CONNECTOR_JAVA_VERSION}

ENV app_dir /opt/apps
WORKDIR ${app_dir}
COPY ./build/libs/test.jar .
COPY ./src/main/resources/log4j2.xml .
COPY ./src/main/resources/application.yml .

EXPOSE ####

COPY docker-entrypoint.sh /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["java", "-jar", "-Dserver.port=####", "-Dlog4j.configurationFile=log4j2.xml", "test.jar"]

docker-entrypoint.sh

#!/usr/bin/dumb-init /bin/bash
set -e

if [ "${1:0:1}" = '-' ]; then
    set -- java "@"
fi

exec "$@"

configmap.yml

apiVersion: v1
kind: ConfigMap
metadata:
  name: application-yml
data:
  application.yml: |+
    server:
      port: ####

    datasource:
      testCommonDb:
        protocol: jdbc:mysql
        host: 127.0.0.1
        port: 3306
        driverClassName: com.mysql.jdbc.Driver
        database: ${ENV:dev}_test
        username: ${MYSQL_USERNAME}
        password: ${MYSQL_PASSWORD}

résultat de l'inspection

## NG!!!

・ ・ ・
command: ['java', '-jar', '-Dserver.port=####', '-Dlog4j.configurationFile=log4j2.xml', '-Dspring.config.location="file:/opt/apps/config/application.yml"', 'test.jar']
・ ・ ・
volumeMounts:
- name: application-yml-volume
  mountPath: "/opt/apps/config"
  readOnly: true
・ ・ ・
- name: application-yml-volume
  configMap:
    name: application-yml

## OK!
・ ・ ・
command: ['java', '-jar', '-Dserver.port=####', '-Dlog4j.configurationFile=log4j2.xml', '-Dspring.config.location="file:/deployments/config/application.yml"', 'test.jar']
・ ・ ・
volumeMounts:
- name: application-yml-volume
  mountPath: "/deployments/config"
  readOnly: true
・ ・ ・
- name: application-yml-volume
  configMap:
    name: application-yml

Ref. --Je me suis référé aux paramètres ici. https://dzone.com/articles/configuring-spring-boot-on-kubernetes-with-configm --Spring Boot sur Kubernetes: étude de cas Yahoo! Zubatoku #jjug_ccc https://www.slideshare.net/techblogyahoo/spring-boot-on-kubernetes-yahoo-jjugccc

Recommended Posts

Une histoire sur l'exécution de Sprint-boot avec kubernetes (GKE) et l'échec de la connexion à CloudSQL
Une histoire sur la connexion à un serveur CentOS 8 avec un ancien Ansible
Lors de l'introduction de JOOQ dans Spring Boot, une histoire qui a été traitée parce qu'une erreur s'est produite autour de Liquidbase
Une histoire où j'ai essayé de faire une vidéo en liant Traitement et Resolume
Une histoire dans laquelle j'étais vraiment quand j'ai fait triple DES avec ruby
Une histoire qui a mis du temps à établir une connexion
Notez que j'étais accro au traitement par lots avec Spring Boot
Une histoire à laquelle j'étais accro lors de l'obtention d'une clé qui a été automatiquement essayée sur MyBatis
Java: Une histoire qui m'a mis mal à l'aise quand on m'a appris à comparer des chaînes avec des égaux sans raison.
Une histoire d'essayer de s'entendre avec Mockito
Une histoire sur la réduction de la consommation de mémoire à 1/100 avec find_in_batches
Une note gênante lorsque vous essayez d'utiliser nginx avec des conteneurs distants de vscode
Une histoire qui a fini par prendre une pause lors de l'utilisation de la liste liée avec une sensation de légèreté
Une histoire qui a rendu aussi facile que possible la vérification de l'opération lors de la création automatique d'une mise à jour de bibliothèque PR avec Github Dependabot