Personalizza il piano di migrazione per i server Tomcat

Ti consigliamo di esaminare il file del piano di migrazione risultante dalla creazione di una migrazione. Personalizza il file prima di eseguire la migrazione. I dettagli del piano di migrazione vengono utilizzati per estrarre gli artefatti dei container dei carichi di lavoro dall'origine.

Questa sezione descrive i contenuti della migrazione e i tipi di personalizzazioni che potresti prendere in considerazione prima di eseguire la migrazione e generare artefatti di deployment.

Prima di iniziare

Questo argomento presuppone che tu abbia già creato una migrazione e disponga del file del piano di migrazione.

Modifica il piano di migrazione

Dopo aver copiato e analizzato il file system, puoi trovare il piano di migrazione nella nuova directory creata nel percorso di output specificato: ANALYSIS_OUTPUT_PATH/config.yaml.

Modifica il piano di migrazione in base alle esigenze e salva le modifiche.

Rivedi i dettagli del piano di migrazione e i commenti guida per aggiungere informazioni, se necessario. In particolare, prendi in considerazione le modifiche apportate alle sezioni seguenti.

Specifica l'immagine Docker

Nel piano di migrazione, generiamo un tag immagine della community Docker basato sulla versione di Tomcat, sulla versione Java e sul fornitore di Java.

  • Versione Tomcat: la versione Tomcat viene rilevata e convertita in una versione principale (le versioni secondarie non sono supportate). Se non viene rilevata una versione di Tomcat, baseImage.name contiene una stringa vuota.
  • Versione Java: la versione Java dipende dal parametro java-version. Il valore è 11 per impostazione predefinita.
  • Fornitore Java: il fornitore Java è impostato su una costante temurin.

Ad esempio, il tag immagine della community Docker generato per Tomcat versione 9.0, Java versione 11 e il fornitore Java temurin è tomcat:9.0-jre11-temurin.

Nel piano di migrazione, il campo baseImage.name rappresenta il tag immagine Docker utilizzato come base dell'immagine container.

Le versioni originali di Tomcat e Java rilevate sulla VM di origine sono contenute in discovery-report.yaml, generato dal rilevamento iniziale.

Se vuoi cambiare l'immagine della community Docker o fornire la tua immagine Docker, puoi modificare baseImage.name nel tuo piano di migrazione utilizzando il seguente formato:

tomcatServers:
    - name: latest
      . . .
      images:
        - name: tomcat-latest
          . . .
          baseImage:
            name: BASE_IMAGE_NAME

Sostituisci BASE_IMAGE_NAME con l'immagine Docker che vuoi utilizzare come base dell'immagine container.

Aggiorna il percorso di installazione di Tomcat

Durante il processo di migrazione, se l'immagine di destinazione ha un percorso CATALINA_HOME non predefinito, puoi specificare un percorso CATALINA_HOME personalizzato. Modifica il campo catalinaHome di destinazione direttamente nel piano di migrazione:

tomcatServers:
  - name: latest
    . . .
    images:
      - name: tomcat-latest
        . . .
        baseImage:
          name: BASE_IMAGE_NAME
          catalinaHome: PATH

Sostituisci PATH con il percorso di installazione di Tomcat.

Personalizza utente e gruppo

Durante il processo di migrazione, se l'immagine di destinazione viene eseguita con un utente e un gruppo diversi da root:root, puoi specificare un utente e un gruppo personalizzati in base ai quali vuoi eseguire l'applicazione. Modifica l'utente e il gruppo direttamente nel piano di migrazione:

tomcatServers:
  - name: latest
    . . .
    images:
      - name: tomcat-latest
        . . .
        userName: USERNAME
        groupName: GROUP_NAME

Sostituisci quanto segue:

  • USERNAME: il nome utente che vuoi utilizzare
  • GROUP_NAME: il nome del gruppo che vuoi utilizzare

Configura SSL

Quando crei una nuova migrazione Tomcat, un processo di rilevamento analizza il server rispetto alle diverse applicazioni rilevate.

Dopo il rilevamento, i seguenti campi vengono compilati automaticamente nel piano di migrazione:

  • excludeFiles: elenca i file e le directory da escludere dalla migrazione.

    Per impostazione predefinita, tutti i percorsi e i certificati sensibili situati durante il rilevamento vengono aggiunti automaticamente a questo campo e vengono esclusi dalla migrazione. Se rimuovi un percorso da questo elenco, il file o la directory vengono caricati nell'immagine container. Per escludere un file o una directory dall'immagine container, aggiungi il percorso a questo elenco.

  • sensitiveDataPaths: elenca tutti i percorsi e i certificati sensibili rilevati dal processo di rilevamento.

    Per caricare i certificati nel repository, imposta il campo includeSensitiveData su true:

    # 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
    

    Al termine della migrazione, i secret vengono aggiunti al file dei secret secrets.yaml nel repository degli artefatti.

Logging delle app web

Migrate to Containers supporta il logging con log4j v2, logback e log4j v1.x che risiedono in CATALINA_HOME.

Migrate to Containers crea un file di archivio aggiuntivo con configurazioni dei log modificate e converti tutti gli appendici di tipi di file in aggiunte della console. Puoi utilizzare i contenuti di questo archivio come riferimento per abilitare la raccolta dei log e trasmetterli in flussi a una soluzione di raccolta di log, ad esempio Google Cloud Logging.

Allocazione memoria

Durante il processo di migrazione, puoi specificare i limiti di memoria delle applicazioni di cui è stata eseguita la migrazione in singoli container. Modifica i limiti di memoria direttamente nel piano di migrazione utilizzando il seguente formato:

tomcatServers:
    - name: latest
      . . .
      images:
        - name: tomcat-latest
          . . .
          resources:
            memory:
              limit: 2048M
              requests: 1280M

Il valore consigliato per limit è il 200% di Xmx, che corrisponde alla dimensione massima heap Java. Il valore consigliato per requests è 150% di Xmx.

Per visualizzare il valore di Xmx, esegui questo comando:

ps aux | grep catalina

Se nel piano di migrazione sono stati definiti limiti di memoria, il Dockerfile generato insieme ad altri artefatti dopo una migrazione riuscita riflette la tua dichiarazione:

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>"

In questo modo, la dimensione iniziale e quella massima devono essere pari al 50% del valore limite. In questo modo, la dimensione di allocazione heap Java di Tomcat può variare in base a qualsiasi modifica al limite di memoria del pod.

Imposta le variabili di ambiente Tomcat

Se vuoi impostare CATALINA_OPTS nel Dockerfile generato insieme ad altri artefatti dopo una migrazione riuscita, puoi prima aggiungere il campo catalinaOpts nel tuo piano di migrazione. L'esempio seguente mostra un campo catalinaOpts aggiornato:

tomcatServers:
    - name: latest
      . . .
      images:
        - name: tomcat-latest
          . . .
          resources:
            . . .
          catalinaOpts: "-Xss10M"

Migrate to Containers analizza i tuoi dati catalinaOpts nel Dockerfile. L'esempio seguente mostra l'output dell'analisi:

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"

Puoi anche impostare le variabili di ambiente Tomcat utilizzando lo script setenv.sh, che si trova nella cartella /bin sul server Tomcat. Per ulteriori informazioni sulle variabili di ambiente Tomcat, consulta la documentazione di Tomcat.

Se scegli di utilizzare setenv.sh per impostare le variabili di ambiente Tomcat, devi modificare il Dockerfile.

Imposta probe di integrità Tomcat

Puoi monitorare i tempi di inattività e lo stato di pronto dei container gestiti specificando i probe nel tuo piano di migrazione del server web Tomcat. Il monitoraggio del probe di integrità può aiutare a ridurre i tempi di inattività dei container di cui è stata eseguita la migrazione e a fornire un monitoraggio migliore.

Gli stati di integrità sconosciuti possono causare un peggioramento della disponibilità, il monitoraggio della disponibilità di falsi positivi e la potenziale perdita di dati. Senza un probe di integrità, kubelet può assumere solo l'integrità di un container e potrebbe inviare traffico a un'istanza di container non pronta. Ciò può causare una perdita di traffico. Inoltre, kubelet potrebbe non rilevare i container in stato bloccato e non riavviarli.

Un probe di integrità funziona eseguendo una piccola istruzione basata su script all'avvio del container. Lo script verifica a ogni periodo la presenza di condizioni riuscite, definite in base al tipo di probe utilizzato. Il periodo è definito nel piano di migrazione da un campo periodSeconds. Puoi eseguire o definire questi script manualmente.

Per scoprire di più sui probe kubelet, consulta Configurare probe di attività, idoneità e avvio nella documentazione di Kubernetes.

Sono disponibili due tipi di probe da configurare. Entrambi i probe sono probe-v1-core definiti nel riferimento probe-v1-core e condividono la stessa funzione dei campi corrispondenti di container-v1-core

  • Probe di attività: i probe di attività vengono utilizzati per sapere quando riavviare un container.

  • Probe di idoneità: i probe di idoneità vengono utilizzati per sapere quando un container è pronto per iniziare ad accettare traffico. Per iniziare a inviare traffico a un pod solo quando un probe ha esito positivo, specifica un probe di idoneità. Un probe di idoneità potrebbe funzionare in modo simile a un probe di attività, ma un probe di idoneità nelle specifiche indica che un pod si avvia senza ricevere traffico e inizia a ricevere traffico solo dopo l'esito positivo del probe.

Dopo il rilevamento, la configurazione del probe viene aggiunta al piano di migrazione. I probe possono essere utilizzati nella loro configurazione predefinita, come mostrato nell'esempio che segue. Per disattivare i probe, rimuovi la sezione probes dal file YAML.

tomcatServers:
- name: latest
  images:
  - name: tomcat-latest
    ports:
    - 8080
    probes:
      livenessProbe:
        tcpSocket:
          port: 8080
      readinessProbe:
        tcpSocket:
          port: 8080

Puoi modificare questo piano di migrazione in modo da utilizzare un endpoint HTTP Tomcat esistente.

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

Esistono quattro modi predefiniti per controllare un container utilizzando un probe. Ogni probe deve definire esattamente uno di questi quattro meccanismi:

  • exec: esegue un comando specificato all'interno del container. L'esecuzione viene considerata riuscita se il codice di stato di uscita è 0.
  • grpc: esegue una chiamata di procedura remota utilizzando "gRPC". I probe "gRPC" sono una funzionalità alpha.
  • httpGet: esegue una richiesta HTTP GET sull'indirizzo IP del pod su una porta e un percorso specificati. La richiesta viene considerata riuscita se il codice di stato è maggiore o uguale a 200 e inferiore a 400.
  • tcpSocket: esegue un controllo TCP rispetto all'indirizzo IP del pod su una porta specificata. La diagnostica viene considerata riuscita se la porta è aperta.

Per impostazione predefinita, un piano di migrazione attiva il metodo di probe tcpSocket. Utilizza la configurazione manuale del piano di migrazione per utilizzare metodi di probe diversi. Nel piano di migrazione puoi anche definire comandi e script personalizzati.

Per aggiungere dipendenze esterne per il probe di idoneità, mentre utilizzi il probe di attività predefinito, definisci un probe di idoneità exec e uno script che implementa la logica.

Verifica la configurazione del clustering Tomcat

Il clustering Tomcat viene utilizzato per replicare le informazioni sulle sessioni in tutti i nodi Tomcat, in modo da poter chiamare qualsiasi server delle applicazioni di backend senza perdere le informazioni sulle sessioni client. Per scoprire di più sulla configurazione del clustering, consulta la sezione Istruzioni per il clustering/la replica delle sessioni nella documentazione di Tomcat.

La classe di clustering Tomcat è denominata SimpleTcpListener e utilizza messaggi heartbeat multicast per la scoperta peer. Gli ambienti cloud non supportano il multicast, quindi devi modificare o rimuovere la configurazione di clustering, se possibile.

Quando un bilanciatore del carico è configurato per eseguire e mantenere una sessione fissa per il server Tomcat di backend, può utilizzare la proprietà jvmRoute configurata nella configurazione Engine server.xml.

Se il tuo ambiente di origine utilizza una configurazione di clustering non supportata, modifica il file server.xml in modo da disabilitare la configurazione o utilizza una configurazione supportata.

  • Tomcat 8.5 o versioni successive: il clustering deve essere disabilitato su Tomcat versione 8.5. Per disabilitare il clustering, devi commentare la sezione <Cluster … /> in server.xml.
  • Tomcat v9 o versioni successive: in Tomcat 9 o versioni successive, puoi abilitare la classe Cluster utilizzando KubernetesMembershipService. KubernetesMembershipService è una classe Kubernetes specifica, che utilizza le API Kubernetes per il rilevamento peer.

    • Provider Kubernetes: di seguito è riportata una configurazione di esempio per un provider 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>
      
    • Provider DNS: utilizza DNSMembershipProvider per usare le API DNS per il rilevamento peer. Di seguito è riportata una configurazione di esempio per un provider 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: quando il bilanciatore del carico si basa su un valore jvmRoute, il valore deve essere modificato da statico a utilizzando il nome del pod. Questo configura Tomcat in modo che aggiunga un suffisso al cookie di sessione con il nome del pod. Può essere utilizzato dal bilanciatore del carico frontend per indirizzare il traffico al POD Tomcat corretto. Modifica il valore nel file server.xml per utilizzare quanto segue:

      <Engine name="Catalina" defaultHost="localhost" jvmRoute="${HOSTNAME}">
      

Verifica la configurazione del proxy Tomcat

Se Tomcat è configurato per l'esecuzione tramite un proxy inverso o utilizzando diverse impostazioni di configurazione del proxy nella sezione Connector di server.xml, devi verificare che le stesse configurazioni proxy siano ancora applicabili dopo la migrazione per l'esecuzione in Kubernetes.

Per eseguire un'applicazione Tomcat containerizzata funzionale, scegli una delle seguenti modifiche alla configurazione per la configurazione del proxy inverso:

  • Disattiva configurazione proxy: se l'applicazione di cui è stata eseguita la migrazione non viene più eseguita tramite un proxy inverso, puoi disattivare la configurazione proxy rimuovendo proxyName e proxyPort dalla configurazione del connettore.
  • Esegui la migrazione del proxy: esegui la migrazione della VM proxy e conserva tutte le configurazioni di Tomcat esistenti.
  • Configura Ingress per sostituire il proxy inverso: se non è stata implementata alcuna logica personalizzata o sofisticata per il proxy inverso, puoi configurare una risorsa Ingress per esporre l'applicazione Tomcat di cui è stata eseguita la migrazione. Questo processo utilizza lo stesso nome di dominio completo utilizzato prima della migrazione. Per configurare un Ingress, devi verificare che il servizio Tomcat Kubernetes sia di type: Nodeport. Di seguito è riportata una configurazione di esempio di una risorsa 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
    
  • Configura un Anthos Service Mesh con Cloud Load Balancing: se utilizzi GKE Enterprise, puoi scegliere di esporre la tua applicazione utilizzando Anthos Service Mesh. Per saperne di più sull'esposizione delle applicazioni mesh di servizi, consulta Da perimetro a mesh: esposizione delle applicazioni del mesh di servizi tramite GKE Ingress.

Verifica la configurazione del proxy Java

Quando esegui la migrazione ai container, devi verificare la disponibilità dei server proxy nel nuovo ambiente. Quando il server proxy non è disponibile, scegli una delle seguenti modifiche di configurazione per il proxy:

  • Disattiva proxy:se il proxy originale non è più in uso, disattiva la configurazione proxy. Rimuovi tutte le impostazioni proxy dallo script setenv.sh o dal file di configurazione in cui sono gestite sul server Tomcat.
  • Modifica le impostazioni del proxy: se il tuo ambiente Kubernetes utilizza un proxy in uscita diverso, puoi modificare le impostazioni del proxy in setenv.sh o in un altro file in modo che rimandino al nuovo proxy.

Passaggi successivi