Personnaliser le plan de migration pour les serveurs Tomcat
Vous devez examiner le fichier de plan de migration résultant de la création d'une migration. Personnalisez le fichier avant d'exécuter la migration. Les détails de votre plan de migration sont utilisés pour extraire les artefacts de conteneur de charge de travail de la source.
Cette section décrit le contenu de la migration et les types de personnalisations que vous pouvez envisager avant d'exécuter la migration et de générer des artefacts de déploiement.
Avant de commencer
Cet article suppose que vous avez déjà créé une migration et que vous disposez du fichier de plan de migration.
Modifier le plan de migration
Une fois le système de fichiers copié et analysé, vous trouverez le plan de migration dans le nouveau répertoire qui est créé dans le chemin de sortie spécifié : ANALYSIS_OUTPUT_PATH/config.yaml
.
Modifiez le plan de migration si nécessaire et enregistrez les modifications.
Passez en revue les détails de votre plan de migration et les commentaires d'orientation, et ajoutez des informations si nécessaire. Vous pouvez plus précisément envisager des modifications telles qu'elles sont décrites dans les sections suivantes.
Spécifier l'image Docker
Dans le plan de migration, nous générons un tag d'image de la communauté Docker basé sur la version Tomcat, la version Java et le fournisseur Java.
- Version Tomcat : la version Tomcat est détectée et convertie en version majeure (les versions mineures ne sont pas compatibles). Si nous ne parvenons pas à détecter une version Tomcat,
baseImage.name
contient une chaîne vide. - Version Java : la version de Java dépend du paramètre
java-version
. Cette valeur est définie par défaut sur11
. - Fournisseur Java : le fournisseur Java est défini sur une constante :
temurin
.
Par exemple, le tag d'image de la communauté Docker généré pour Tomcat version 9.0, Java version 11 et le fournisseur Java temurin
est tomcat:9.0-jre11-temurin
.
Sur le plan de migration, le champ baseImage.name
représente le tag d'image Docker utilisé comme base de l'image du conteneur.
Les versions d'origine Tomcat et Java détectées sur la VM source sont contenues dans le fichier discovery-report.yaml
, généré par la découverte initiale.
Si vous souhaitez modifier l'image de la communauté Docker ou fournir votre propre image Docker, vous pouvez modifier le tag baseImage.name
dans votre plan de migration au format suivant :
tomcatServers: - name: latest . . . images: - name: tomcat-latest . . . baseImage: name: BASE_IMAGE_NAME
Remplacez BASE_IMAGE_NAME par l'image Docker que vous souhaitez utiliser comme base de l'image du conteneur.
Mettre à jour le chemin d'installation de Tomcat
Au cours du processus de migration, si votre image cible comporte un chemin d'accès CATALINA_HOME
autre que celui par défaut, vous pouvez spécifier un chemin d'accès CATALINA_HOME
personnalisé. Modifiez le champ catalinaHome
cible directement dans votre plan de migration :
tomcatServers: - name: latest . . . images: - name: tomcat-latest . . . baseImage: name: BASE_IMAGE_NAME catalinaHome: PATH
Remplacez PATH par le chemin d'installation Tomcat.
Personnaliser l'utilisateur et le groupe
Au cours du processus de migration, si votre image cible s'exécute avec un utilisateur et un groupe différents de root:root
, vous pouvez spécifier un utilisateur et un groupe personnalisés sous lesquels vous souhaitez exécuter l'application. Modifiez l'utilisateur et le groupe directement dans votre plan de migration :
tomcatServers: - name: latest . . . images: - name: tomcat-latest . . . userName: USERNAME groupName: GROUP_NAME
Remplacez les éléments suivants :
- USERNAME : nom d'utilisateur que vous souhaitez utiliser
- GROUP_NAME : nom du groupe que vous souhaitez utiliser
Configurer SSL
Lorsque vous créez une migration Tomcat, un processus de découverte analyse le serveur par rapport aux différentes applications détectées.
Après la découverte, les champs suivants sont automatiquement renseignés dans le plan de migration :
excludeFiles
: répertorie les fichiers et répertoires à exclure de la migration.Par défaut, tous les chemins et certificats sensibles détectés lors de la découverte sont automatiquement ajoutés à ce champ et exclus de la migration. Si vous supprimez un chemin d'accès de cette liste, le fichier ou répertoire est importé dans l'image de conteneur. Pour exclure un fichier ou un répertoire de l'image de conteneur, ajoutez son chemin d'accès à cette liste.
sensitiveDataPaths
: répertorie tous les chemins d'accès et certificats sensibles situés par le processus de découverte.Pour importer les certificats dans le dépôt, définissez le champ
includeSensitiveData
surtrue
:# Sensitive data which will be filtered out of the container image. # If includeSensitiveData is set to true the sensitive data will be mounted on the container. includeSensitiveData: true tomcatServers: - name: latest catalinaBase: /opt/tomcat/latest catalinaHome: /opt/tomcat/latest # Exclude files from migration. excludeFiles: - /usr/local/ssl/server.pem - /usr/home/tomcat/keystore - /usr/home/tomcat/truststore images: - name: tomcat-latest ... # If set to true, sensitive data specified in sensitiveDataPaths will be uploaded to the artifacts repository. sensitiveDataPaths: - /usr/local/ssl/server.pem - /usr/home/tomcat/keystore - /usr/home/tomcat/truststore
Une fois la migration terminée, les secrets sont ajoutés au fichier de secrets
secrets.yaml
dans le dépôt d'artefacts.
Journalisation des applications Web
Migrate to Containers accepte la journalisation avec log4j v2
, logback
et log4j v1.x
qui résident dans CATALINA_HOME
.
Migrate to Containers crée un fichier d'archive supplémentaire avec des configurations de journal modifiées et convertit tous les avenants de type de fichier en appenders de console. Vous pouvez utiliser le contenu de cette archive comme référence pour activer la collecte de journaux et la diffusion vers une solution de collecte de journaux (telle que Google Cloud Logging).
Allocation de mémoire
Au cours du processus de migration, vous pouvez spécifier les limites de mémoire des applications migrées vers des conteneurs individuels. Modifiez les limites de mémoire directement dans votre plan de migration au format suivant :
tomcatServers:
- name: latest
. . .
images:
- name: tomcat-latest
. . .
resources:
memory:
limit: 2048M
requests: 1280M
La valeur recommandée pour limit
est de 200 % de Xmx
, qui est la taille maximale du tas de mémoire Java. La valeur recommandée pour requests
est de 150 % de Xmx
.
Pour afficher la valeur de Xmx
, exécutez la commande suivante :
ps aux | grep catalina
Si des limites de mémoire ont été définies dans votre plan de migration, le fichier Dockerfile généré avec d'autres artefacts après une migration réussie reflète votre déclaration :
FROM tomcat:8.5-jdk11-openjdk
# Add JVM environment variables for tomcat
ENV CATALINA_OPTS="${CATALINA_OPTS} -XX:MaxRAMPercentage=50.0 -XX:InitialRAMPercentage=50.0 -XX:+UseContainerSupport <additional variables>"
Ce fichier définit la taille initiale et la taille maximale à 50 % de la valeur limite. La taille d'allocation de segments de mémoire Java Tomcat peut ainsi évoluer en fonction de modifications qui seraient apportées à la limite de mémoire du pod.
Définir des variables d'environnement Tomcat
Si vous souhaitez définir CATALINA_OPTS
dans votre fichier Dockerfile généré avec d'autres artefacts après une migration réussie, vous pouvez d'abord ajouter le champ catalinaOpts
à votre plan de migration : L'exemple suivant montre un champ catalinaOpts
mis à jour :
tomcatServers:
- name: latest
. . .
images:
- name: tomcat-latest
. . .
resources:
. . .
catalinaOpts: "-Xss10M"
Migrate to Containers analyse vos données catalinaOpts
vers votre fichier Dockerfile. L'exemple suivant montre le résultat de l'analyse :
FROM 8.5-jdk11-openjdk-slim
## setenv.sh script detected.
## Modify env variables on the script and add definitions to the migrated
## tomcat server, if needed (less recommended than adding env variables directly
## to CATALINA_OPTS) by uncomment the line below
#ADD --chown=root:root setenv.sh /usr/local/tomcat/bin/setenv.sh
# Add JVM environment variables for the tomcat server
ENV CATALINA_OPTS="${CATALINA_OPTS} -XX:MaxRAMPercentage=50.0 -XX:InitialRAMPercentage=50.0 -Xss10M"
Vous pouvez également définir des variables d'environnement Tomcat à l'aide du script setenv.sh
(situé dans le dossier /bin
de votre serveur Tomcat). Pour en savoir plus sur les variables d'environnement Tomcat, consultez la documentation Tomcat.
Si vous choisissez d'utiliser setenv.sh
pour définir vos variables d'environnement Tomcat, vous devez modifier le Dockerfile.
Définir des vérifications d'état Tomcat
Vous pouvez surveiller l'état d'arrêt et l'état de préparation de vos conteneurs gérés en spécifiant des vérifications dans le plan de migration de votre serveur Web Tomcat. La surveillance de l'état peut réduire les temps d'arrêt des conteneurs migrés et améliorer la surveillance.
Des états de santé inconnus peuvent entraîner une dégradation des disponibilités, une surveillance des disponibilités suggérant un faux positif et une perte potentielle de données. Sans vérification d'état, kubelet ne peut supposer que l'état d'un conteneur et peut envoyer du trafic vers une instance de conteneur qui n'est pas prête. Cela peut entraîner une perte de trafic. Le kubelet peut aussi ne pas détecter les conteneurs à l'état figé et donc ne pas les redémarrer.
Une vérification de l'état fonctionne en exécutant une petite instruction scriptée au démarrage du conteneur. Le script recherche les conditions de réussite, qui sont définies par le type de vérification utilisé, à chaque période. La période est définie dans le plan de migration par un champ periodSeconds
. Vous pouvez exécuter ou définir ces scripts manuellement.
Pour en savoir plus sur les vérifications de kubelet, consultez la section Configurer des vérifications d'activité, d'aptitude et de démarrage dans la documentation de Kubernetes.
Vous pouvez configurer deux types de vérifications. Les deux vérifications sont définies par probe-v1-core dans la documentation de référence de probe-v1-core et partagent la même fonction que les champs correspondants de container-v1-core.
- Vérification d'activité : les vérifications d'activité permettent de savoir quand redémarrer un conteneur.
- Vérification d'aptitude : les vérifications d'aptitude permettent de savoir quand un conteneur est prêt à accepter du trafic. Pour commencer à envoyer du trafic à un pod uniquement lorsqu'une vérification réussit, spécifiez une vérification d'aptitude. Une vérification d'aptitude peut agir de la même manière qu'une vérification d'activité, mais une vérification d'aptitude indiquée dans les spécifications indique qu'un pod démarre sans recevoir de trafic et ne commence à recevoir du trafic qu'une fois la vérification réussie.
Une fois la détection effectuée, la configuration de la vérification est ajoutée au plan de migration. Les vérifications peuvent être utilisées dans leur configuration par défaut, comme indiqué dans l'exemple suivant. Pour désactiver les vérifications, supprimez la section probes
du fichier YAML.
tomcatServers: - name: latest images: - name: tomcat-latest ports: - 8080 probes: livenessProbe: tcpSocket: port: 8080 readinessProbe: tcpSocket: port: 8080
Vous pouvez modifier ce plan de migration pour utiliser un point de terminaison HTTP Tomcat existant.
tomcatServers: - name: latest images: - name: tomcat-latest ports: - 8080 probes: livenessProbe: httpGet: path: /healthz port: 8080 httpHeaders: - name: Custom-Header value: Awesome initialDelaySeconds: 3 periodSeconds: 3 readinessProbe: httpGet: tcpSocket: port: 8080
Il existe quatre méthodes prédéfinies pour vérifier un conteneur à l'aide d'une vérification. Chaque vérification doit définir exactement l'un de ces quatre mécanismes :
exec
: exécute une commande spécifiée dans le conteneur. L'exécution est considérée comme réussie si le code d'état de sortie est 0.grpc
: effectue un appel de procédure à distance à l'aide de gRPC. Les vérifications gRPC sont une fonctionnalité alpha.httpGet
: exécute une requête HTTP GET sur l'adresse IP du pod sur un port et un chemin d'accès spécifiés. La requête est considérée comme réussie si le code d'état est supérieur ou égal à 200 et inférieur à 400.tcpSocket
: effectue une vérification TCP sur l'adresse IP du pod sur un port spécifié. Le diagnostic est considéré comme réussi si le port est ouvert.
Par défaut, un plan de migration active la méthode de vérification tcpSocket
. Utilisez la configuration manuelle de votre plan de migration pour utiliser différentes méthodes de vérification.
Vous pouvez également définir des commandes et des scripts personnalisés via le plan de migration.
Pour ajouter des dépendances externes pour la vérification d'aptitude tout en utilisant la vérification d'activité par défaut, définissez une vérification d'aptitude d'exécution et un script qui met en œuvre la logique.
Vérifier la configuration du clustering Tomcat
Le clustering Tomcat est utilisé pour répliquer les informations de session sur tous les nœuds Tomcat, ce qui vous permet d'appeler n'importe quel serveur d'applications backend sans perdre les informations de session client. Pour en savoir plus sur la configuration du clustering, consultez le guide d'utilisation du clustering/de la réplication de session dans la documentation Tomcat.
La classe de clustering de Tomcat est appelée SimpleTcpListener
. Elle utilise des messages de pulsation de multidiffusion pour la découverte de pairs. Les environnements cloud ne sont pas compatibles avec la multidiffusion. Vous devez donc modifier la configuration du clustering ou la supprimer, lorsque cela est possible.
Lorsqu'un équilibreur de charge est configuré pour s'exécuter et conserver une session persistante sur le serveur backend Tomcat, il peut utiliser la propriété jvmRoute
configurée dans la configuration Engine
Si votre environnement source utilise une configuration de clustering non compatible, modifiez le fichier server.xml
pour désactiver la configuration ou utiliser une configuration compatible.
- Tomcat v8.5 ou version ultérieure : le clustering doit être désactivé sur Tomcat version 8.5.
Pour désactiver le clustering, vous devez commenter la section
<Cluster … />
dansserver.xml
. Tomcat v9 ou version ultérieure : dans Tomcat version 9 ou ultérieure, vous pouvez activer la classe
Cluster
à l'aide deKubernetesMembershipService
.KubernetesMembershipService
est une classe spécifique à Kubernetes qui utilise les API Kubernetes pour la découverte de pairs.Fournisseur Kubernetes : voici un exemple de configuration pour un fournisseur Kubernetes :
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.cloud.CloudMembershipService" membershipProviderClassName="org.apache.catalina.tribes.membership.cloud.KubernetesMembershipProvider"/> </Channel> </Cluster>
Fournisseur DNS : utilisez
DNSMembershipProvider
pour utiliser les API DNS pour la découverte de pairs. Voici un exemple de configuration pour un fournisseur DNS :<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.cloud.CloudMembershipService" membershipProviderClassName="org.apache.catalina.tribes.membership.cloud.DNSMembershipProvider"/> </Channel> </Cluster>
jvmRoute : lorsque votre équilibreur de charge repose sur une valeur jvmRoute, la valeur statique doit être remplacée par l'utilisation du nom du pod. Cela configure Tomcat pour ajouter un suffixe au cookie de session avec le nom du POD. L'équilibreur de charge frontal peut utiliser ce code pour diriger le trafic vers le pod Tomcat approprié. Modifiez la valeur du fichier
server.xml
pour utiliser ce qui suit :<Engine name="Catalina" defaultHost="localhost" jvmRoute="${HOSTNAME}">
Vérifier la configuration du proxy Tomcat
Si Tomcat est configuré pour s'exécuter derrière un proxy inverse ou en utilisant plusieurs paramètres de configuration de proxy dans la section Connector
du fichier server.xml
, vous devez vérifier que les mêmes configurations de proxy sont toujours applicables après la migration pour une exécution dans Kubernetes.
Pour exécuter une application Tomcat en conteneur fonctionnelle, choisissez l'une des modifications de configuration suivante pour la configuration du proxy inverse :
- Désactiver la configuration du proxy : si l'application migrée ne s'exécute plus derrière un proxy inverse, vous pouvez désactiver la configuration du proxy en supprimant
proxyName
etproxyPort
de la configuration du connecteur. - Migrer le proxy : migrez la VM proxy et conservez toutes les configurations Tomcat existantes.
Configurer Ingress pour remplacer le proxy inverse : si aucune logique personnalisée ni sophistiquée n'a été mise en œuvre pour votre proxy inverse, vous pouvez configurer une ressource Ingress pour exposer votre application Tomcat migrée. Ce processus utilise le même nom de domaine complet que celui utilisé avant la migration. Pour configurer un objet Ingress, vous devez vérifier que votre service Kubernetes Tomcat est de
type: Nodeport
. Voici un exemple de configuration d'un objet Ingress :apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-tomcat-ingress spec: rules: - host: APP_DOMAIN http: paths: - pathType: ImplementationSpecific backend: service: name: my-tomcat-service port: name: my-tomcat-port
Configurer un service Cloud Service Mesh avec Cloud Load Balancing : si vous utilisez GKE Enterprise, vous pouvez choisir d'exposer votre application à l'aide de Cloud Service Mesh. Pour en savoir plus sur l'exposition d'applications de maillage de services, consultez la page De la périphérie au réseau : Exposer les applications de maillage de services via GKE Ingress.
Vérifier la configuration du proxy Java
Lors de la migration vers des conteneurs, vous devez vérifier la disponibilité des serveurs proxy dans votre nouvel environnement. Lorsque le serveur proxy n'est pas disponible, choisissez l'une des modifications de configuration suivantes pour le proxy :
- Désactiver le proxy : si le proxy d'origine n'est plus utilisé, désactivez la configuration du proxy. Supprimez tous les paramètres de proxy du script
setenv.sh
ou du fichier de configuration où ils sont gérés sur votre serveur Tomcat. - Modifier les paramètres de proxy : si votre environnement Kubernetes utilise un proxy de sortie différent, vous pouvez modifier vos paramètres de proxy dans
setenv.sh
, ou un autre fichier, pour qu'il pointe vers le nouveau proxy.
Étapes suivantes
- Découvrez comment exécuter la migration.