Esegui l'upgrade dei carichi di lavoro dei container per un runtime migliorato

Se hai carichi di lavoro dei container esistenti creati utilizzando Migrate to Containers nelle versioni 1.7.x e 1.8.x, puoi convertirli in modo che utilizzino il gestore dei servizi Linux semplificato. Questa conversione ti consente di eseguire questi container sui cluster GKE Autopilot.

Per eseguire la conversione, modifica il file Dockerfile e il file deployment_spec.yaml creato durante la migrazione originale. Una volta modificato, puoi eseguire il deployment del carico di lavoro del container sui cluster Autopilot.

Informazioni sulla conversione dei carichi di lavoro con container

La procedura per la conversione dei carichi di lavoro esistenti dipende dal fatto che si stia convertendo un carico di lavoro stateless o stateful.

Un carico di lavoro stateful è un carico di lavoro che gestisce o memorizza informazioni sullo stato. Per i carichi di lavoro stateful, spesso monti volumi aggiuntivi utilizzando StatefulSet in spec.containers.volumeMounts. Assicurati di conservare le definizioni di volumeMounts rimuovendole contemporaneamente per /sys/fs/cgroup. Per ulteriori informazioni, consulta Montaggio di volumi esterni.

La procedura generale per la conversione di un workload esistente richiede la modifica di:

  • Dockerfile

    • Imposta la versione di Migrate to Containers su 1.15.0.
    • Inserisci due comandi ADD per copiare il file logs.yaml nell'immagine del contenitore.
    • Inserisci un comando RUN per l'utilità servicemanager_generate_config.
  • File deployment_spec.yaml a:

    • Elimina le definizioni di hostPath e volumeMounts per /sys/fs/cgroup.
    • Elimina la definizione di securityContext.
    • Elimina la definizione di readinessProbe.
    • Puoi lasciare le definizioni di mountPath e configMap per logs-config, tuttavia la registrazione non funziona attualmente con il gestore dei servizi Linux semplificato.

Per la procedura di conversione specifica, consulta le sezioni seguenti:

Convertire un carico di lavoro stateless

L'esempio seguente mostra come convertire un carico di lavoro del contenitore senza stato:

  1. Individua la directory contenente gli elementi di migrazione esistenti, incluso il file deployment_spec.yaml.

  2. Modifica il Dockerfile per impostare la versione del prodotto, copiare il file logs.yaml e eseguire l'utilità servicemanager_generate_config:

    ...
    # Set the product version to 1.15.0:
    FROM anthos-migrate.gcr.io/v2k-run-embedded:v1.15.0 as migrate-for-anthos-runtime
    
    ...
    
    ADD blocklist.yaml /.m4a/blocklist.yaml
    # Insert the ADD commands to copy the `logs.yaml` file to the container image:
    ADD logs.yaml /code/config/logs/logsArtifact.yaml
    ADD logs.yaml /code/config/logs/logs.yaml
    
    # Insert the RUN command for servicemanager_generate_config:
    RUN /servicemanager_generate_config build-all -o /.m4a/
    
    # Migrate to Containers image includes entrypoint
    ENTRYPOINT [ "/.v2k.go" ]
  3. Apri il file deployment_spec.yaml in un editor. Ad esempio:

    vi  deployment_spec.yaml
  4. Individua la seguente sezione nel file ed elimina le righe indicate:

    apiVersion: apps/v1 
    kind: Deployment
    metadata: 
      creationTimestamp: null 
      name: IMAGE_NAME  
          
        spec:
          containers:
          - image: gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL
            name: IMAGE_NAME
    # Delete the following lines:
            readinessProbe:
              exec:
                command:
                - /code/ready.sh
            resources: {}
            securityContext:
              privileged: true
            volumeMounts:
            - mountPath: /sys/fs/cgroup
              name: cgroups
            - mountPath: /code/config/logs
              name: logs-config
          volumes:
          - hostPath:
              path: /sys/fs/cgroup
              type: Directory
            name: cgroups
          - configMap:
              name: suitecrm-crddefault-logs
            name: logs-config
    # Stop the delete here.
  5. Aggiungi le righe riportate di seguito per impostare la variabile di ambiente HC_V2K_SERVICE_MANAGER.

    spec:
      containers:
      - image: gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL
        name: IMAGE_NAME
    # Add the following lines:
        env:
          - name: HC_V2K_SERVICE_MANAGER
            value: "true"
  6. Salva il file.

  7. Assicurati che il cluster di destinazione abbia accesso in lettura al registry delle immagini Docker come descritto in Assicurati che il cluster di destinazione abbia accesso in lettura al registry delle immagini Docker.

  8. Crea l'immagine aggiornata ed esegui il push in Container Registry con un tag della versione aggiornato, assicurandoti di attendere il tempo necessario per il completamento della build. Nell'esempio seguente, l'immagine si trova nella directory corrente:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  9. Esegui il deployment del contenitore:

    kubectl apply -f deployment_spec.yaml

    Se applichi la specifica di deployment a un cluster Autopilot senza le modifiche necessarie in deployment_spec.yaml, viene visualizzato un messaggio di errore nel seguente formato:

    "Trying to run without root privileges is not possible. Did you try to use the new runtime? In that case please pass the environment variable HC_V2K_SERVICE_MANAGER=true to the pod"

  10. Visualizza i pod di cui viene eseguito il deployment nel cluster.

    kubectl get pods

Convertire un carico di lavoro stateful

L'esempio seguente mostra come convertire un carico di lavoro del contenitore con stato:

  1. Individua la directory contenente gli elementi di migrazione esistenti, incluso il file deployment_spec.yaml.

  2. Modifica il Dockerfile per impostare la versione del prodotto ed esegui l'utilitàservicemanager_generate_config:

    ...
    # Set the product version to 1.15.0:
    FROM anthos-migrate.gcr.io/v2k-run-embedded:v1.15.0 as migrate-for-anthos-runtime
    
    ...
    
    ADD blocklist.yaml /.m4a/blocklist.yaml
    # Insert the ADD commands to copy the `logs.yaml` file to the container image:
    ADD logs.yaml /code/config/logs/logsArtifact.yaml
    ADD logs.yaml /code/config/logs/logs.yaml
    
    # Insert the RUN command for servicemanager_generate_config:
    RUN /servicemanager_generate_config build-all -o /.m4a/
    
    # Migrate to Containers image includes entrypoint
    ENTRYPOINT [ "/.v2k.go" ]
  3. Apri il file deployment_spec.yaml in un editor. Ad esempio:

    vi  deployment_spec.yaml
  4. Individua le tre sezioni seguenti nel file ed elimina le righe indicate:

    apiVersion: apps/v1 
    kind: StatefulSet  
    ... 
    spec: 
      containers: 
      - image: gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL 
        name: IMAGE_NAME 
    # Delete the following lines:
        readinessProbe: 
          exec: 
            command: 
            - /code/ready.sh 
        resources: {} 
        securityContext: 
          privileged: true 
    # Stop the delete here.
        volumeMounts: 
    # Delete the following lines:
        - mountPath: /sys/fs/cgroup 
          name: cgroups 
    # Stop the delete here.
        - mountPath: /opt/suitecrm-7.10.5-0/mysql/data 
          name: data-pvc-0-1b12-d0af-48b3-9f5e-6c25fa5 
          subPath: opt/suitecrm-7.10.5-0/mysql/data 
      volumes:
    # Delete the following lines:
      - hostPath:
          path: /sys/fs/cgroup 
          type: Directory 
        name: cgroups 
    # Stop the delete here.
      - name: data-pvc-2-d0af-48b3-9f5e09c25fa5 
        persistentVolumeClaim: 
          claimName: data-pvc-0-1a2-d0af-48b3-9f5e-605fa5

    Tieni presente che devi rimuovere solo le definizioni di volumeMounts e volumes per cgroups e lasciare le altre definizioni.

  5. Aggiungi le seguenti righe per impostare la variabile di ambiente HC_V2K_SERVICE_MANAGER:

    spec: 
      containers: 
      - image: gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL
        name: IMAGE_NAME 
    # Add the following lines:
        env:
        - name: HC_V2K_SERVICE_MANAGER 
          value: "true" 
    # Stop the add here.
        volumeMounts: 
        - mountPath: /opt/suitecrm-7.10.5-0/mysql/data 
          name: data-pvc-0-1b12-d0af-48b3-9f5e-6c25fa5 
          subPath: opt/suitecrm-7.10.5-0/mysql/data 
      volumes:
      - name: data-pvc-2-d0af-48b3-9f5e09c25fa5 
        persistentVolumeClaim: 
          claimName: data-pvc-0-1a2-d0af-48b3-9f5e-605fa5
  6. Salva il file.

  7. Assicurati che il cluster di destinazione abbia accesso in lettura al registry delle immagini Docker come descritto in Assicurati che il cluster di destinazione abbia accesso in lettura al registry delle immagini Docker.

  8. Crea l'immagine aggiornata ed esegui il push in Container Registry con un tag della versione aggiornato, assicurandoti di attendere il tempo necessario per il completamento della build. Nell'esempio seguente, l'immagine si trova nella directory corrente:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  9. Esegui il deployment del contenitore:

    kubectl apply -f deployment_spec.yaml

    Se applichi la specifica di deployment a un cluster Autopilot senza le modifiche necessarie in deployment_spec.yaml, viene visualizzato un messaggio di errore nel seguente formato:

    "Trying to run without root privileges is not possible. Did you try to use the new runtime? In that case please pass the environment variable HC_V2K_SERVICE_MANAGER=true to the pod"

  10. Visualizza i pod di cui viene eseguito il deployment nel cluster.

    kubectl get pods

Attività post-conversione

Dopo aver convertito una migrazione esistente per utilizzare il gestore dei servizi Linux semplificato, potresti volerla modificare per:

  • Aggiorna i servizi utilizzati dal carico di lavoro sottoposto a migrazione.
  • Aggiungi nuovi servizi.

Per entrambi gli scenari, devi modificare il Dockerfile e poi ricreare l'immagine container.

Aggiornamento servizi

In questa sezione modifichi il file Dockerfile per aggiornare il file services-config.yaml nel contenitore in base alle modifiche apportate in /etc/systemd al workload sottoposto a migrazione.

Per aggiornare l'immagine del contenitore per una modifica a un servizio esistente:

  1. Aggiungi il comando servicemanager_generate_config nel Dockerfile:

    ...
    FROM anthos-migrate.gcr.io/v2k-run-embedded:v1.15.0 as migrate-for-anthos-runtime
    
    ...
    
    ADD blocklist.yaml /.m4a/blocklist.yaml
    
    # Use the update command for servicemanager_generate_config to update the configuration:
    RUN /servicemanager_generate_config update -u /.m4a/
    
    # Migrate to Containers image includes entrypoint
    ENTRYPOINT [ "/.v2k.go" ]
  2. Crea l'immagine aggiornata ed esegui il push in Container Registry con un tag della versione aggiornato, assicurandoti di attendere il tempo necessario per il completamento della build. Nell'esempio seguente, l'immagine si trova nella directory corrente:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  3. Esegui il deployment dell'immagine appena creata:

    kubectl set image deployment/myWorkload my-app=gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL --record

Aggiungi servizi

Per aggiungere un servizio all'immagine del contenitore:

  1. Aggiungi il comando servicemanager_generate_config nel Dockerfile:

    ...
    FROM anthos-migrate.gcr.io/v2k-run-embedded:v1.15.0 as migrate-for-anthos-runtime
    
    ...
    
    ADD blocklist.yaml /.m4a/blocklist.yaml
    
    # This example adds the redis-server service.
    # Add the following lines to install redis-server.
    RUN apt-get update && apt-get -y install redis-server
    
    # Use the servicemanager_generate_config add command to add
    # redis-server to the configuration:
    RUN /servicemanager_generate_config add redis-server -u /.m4a/
    
    # Migrate to Containers image includes entrypoint
    ENTRYPOINT [ "/.v2k.go" ]
  2. Crea l'immagine aggiornata ed esegui il push in Container Registry con un tag della versione aggiornato, assicurandoti di attendere il tempo necessario per il completamento della build. Nell'esempio seguente, l'immagine si trova nella directory corrente:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  3. Esegui il deployment dell'immagine appena creata:

    kubectl set image deployment/myWorkload my-app=gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL --record

Sintassi di servicemanager_generate_config

L'utilità servicemanager_generate_config accetta le seguenti opzioni:

  • build-all -o /.m4a/: ricostruisce la migrazione e scrive la configurazione nella directory m4a. Non modificare il nome della directory.

    Utilizza questa forma del comando la prima volta che esegui la conversione della migrazione per utilizzare il gestore dei servizi Linux semplificato.

  • update -u /.m4a/: aggiorna l'elenco dei servizi esistenti nella directory m4a. Non modificare il nome della directory.

  • add SERVICE_NAME -u /.m4a/: aggiunge il nome del servizio alla migrazione e scrive la configurazione nella directory m4a. Non modificare il nome della directory.

    Per aggiungere più servizi, aggiungi più comandi RUN /servicemanager_generate_config, uno per servizio.

Passaggi successivi