Insertar y extraer imágenes de contenedor de un clúster

Los artefactos del sistema se encuentran en Artifact Registry del clúster de infraestructura de la organización. Cuando un administrador de plataforma crea una organización en el dispositivo aislado de Google Distributed Cloud (GDC), todos los artefactos del sistema se replican desde el clúster de infraestructura de la organización.

El operador de infraestructura debe enviar nuevos artefactos del sistema al clúster de infraestructura de la organización. El envío de nuevos artefactos del sistema solo se produce cuando el PA solicita habilitar funciones opcionales o cuando el sistema muestra errores o interrupciones que puedes solucionar aplicando parches a los nuevos artefactos.

Antes de empezar

Para obtener los permisos que necesitas para acceder a los recursos de los proyectos de Artifact Registry del sistema como administrador, pide a tu administrador de seguridad que te conceda los siguientes roles en función del clúster al que quieras enviar la imagen de contenedor.

Después de obtener los permisos necesarios, sigue estos pasos antes de enviar una imagen al registro de artefactos del sistema del clúster de infraestructura:

  1. Descarga e instala la CLI de Distributed Cloud siguiendo las instrucciones de la interfaz de línea de comandos (CLI) de gdcloud.

  2. Instala el componente docker-credential-gdcloud siguiendo las instrucciones de Instalar componentes:

    gdcloud components install docker-credential-gdcloud
    
  3. Inicia sesión con el proveedor de identidades configurado:

    gdcloud auth login
    
  4. Exporta el archivo kubeconfig:

    gdcloud clusters get-credentials CLUSTER_NAME
    

    Sustituye CLUSTER_NAME por el nombre del clúster.

  5. Configura Docker:

    gdcloud auth configure-docker
    

Descargar una imagen de contenedor de un segmento de almacenamiento

Sigue las instrucciones de esta sección cuando el PA solicite descargar la imagen de un segmento de almacenamiento y subirla al Artifact Registry del sistema. El PA debe proporcionar detalles como los nombres del proyecto y del segmento.

Como IO, necesitas permisos para descargar la imagen del contenedor del segmento de almacenamiento:

  • Pide a tu administrador de seguridad que te conceda el rol Lector de objetos de segmentos de proyecto (project-bucket-object-viewer) en el espacio de nombres del proyecto.

Para obtener más información, consulta el runbook IAM R0005.

Obtendrás acceso de solo lectura al segmento del proyecto y a los objetos de ese segmento.

Una vez que hayas obtenido los permisos necesarios, sigue estos pasos para descargar la imagen de contenedor del segmento de almacenamiento del espacio de nombres del proyecto de PA:

  1. Pídele al asistente que te diga el nombre secreto del contenedor. El nombre del secreto es similar al siguiente ejemplo:

    object-storage-key-std-user-ID
    

    El nombre del secreto incluye un valor ID único para acceder al contenedor.

  2. Copia el nombre secreto del segmento.

  3. Obtén las credenciales de acceso al segmento y configura la CLI de gdcloud:

    SECRET_NAME=SECRET_NAME ACCESS_KEY=$(kubectl get secret ${SECRET_NAME} -n object-storage-access-keys -o=jsonpath='{.data.access-key-id}' | base64 -d)
    SECRET_KEY=$(kubectl get secret ${SECRET_NAME} -n object-storage-access-keys -o=jsonpath='{.data.secret-access-key}' | base64 -d)
    S3_ENDPOINT=objectstorage.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
    echo "Access Key: ${ACCESS_KEY}" \
    && echo "Secret Key: ${SECRET_KEY}" \
    && echo "S3 Endpoint: ${S3_ENDPOINT}"
    
    gdcloud config set storage/s3_access_key_id ${ACCESS_KEY}
    gdcloud config set storage/s3_secret_access_key ${SECRET_KEY}
    gdcloud config set storage/s3_endpoint ${S3_ENDPOINT}
    

    Sustituye SECRET_NAME por el valor que has copiado en el paso anterior.

  4. Descarga la imagen de contenedor del segmento de almacenamiento en tu estación de trabajo:

    gdcloud cp s3://BUCKET_NAME/g/CONTAINER_IMAGE_NAME
    

    Haz los cambios siguientes:

    • BUCKET_NAME: nombre del segmento de almacenamiento que contiene la imagen del contenedor. La PA proporciona este nombre.
    • CONTAINER_IMAGE_NAME: el nombre del archivo de imagen del contenedor que quieres descargar del contenedor de almacenamiento.

Envía la imagen a System Artifact Registry

Sigue estos pasos para enviar el archivo de la imagen de contenedor que tienes en tu estación de trabajo al registro de artefactos del sistema en el servidor de la API Management:

  1. Abre la consola.

  2. Obtén la ruta al endpoint de System Artifact Registry del clúster en el que quieras enviar la imagen de contenedor:

    export REGISTRY_ENDPOINT=harbor.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
  3. Carga, etiqueta y envía la imagen de contenedor al endpoint de System Artifact Registry del clúster:

    docker load --input CONTAINER_IMAGE_PATH
    
    docker tag CONTAINER_IMAGE_PATH ${REGISTRY_ENDPOINT}/CONTAINER_IMAGE_PATH
    
    docker push ${REGISTRY_ENDPOINT}/CONTAINER_IMAGE_PATH
    

    Sustituye CONTAINER_IMAGE_PATH por la ruta del archivo de imagen del contenedor en tu sistema de archivos local. Un valor válido para esta ruta es, por ejemplo, oracle_db.tar.

Extraer artefacto de Harbor

En la mayoría de los casos, el sistema de GDC interactúa automáticamente con el registro de artefactos del sistema (SAR) para extraer el artefacto más reciente de Harbor. En algunos casos concretos, puede realizar esta operación manualmente. Sigue estos pasos para extraer manualmente la imagen del artefacto de Harbor:

  1. Defina los detalles de los artefactos por aplicación:

    APP_NAME=APP
    HARBOR_PROJECT=HARBOR_PROJECT_NAME
    REPOSITORY=REPOSITORY
    

    Haz los cambios siguientes:

    • APP: el nombre de la aplicación.
    • HARBOR_PROJECT_NAME: el nombre del proyecto de Harbor.
    • REPOSITORY: el nombre del repositorio.
  2. Obtén la información de Harbor:

    HARBOR_URL=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} get harborcluster harbor -n harbor-system -o=jsonpath='{.spec.externalURL}')
    HARBOR_IP=${HARBOR_URL#https://}
    
  3. Obtén la etiqueta del artefacto. Hay dos métodos para obtener la etiqueta:

    • Método 1: esta es la opción preferida:

      1. Lista los artefactos del paquete local y obtiene la etiqueta correspondiente:
      TAG=$(gdcloud artifacts tree ${BUNDLE_SUB_FOLDER:?} | grep ${HARBOR_PROJECT:?}/${REPOSITORY:?} | cut -d ":" -f2 | grep -v '.sig')
      
    • Método 2: utiliza este método solo si el método 1 no funciona como esperabas:

      1. Enumera las etiquetas de Harbor y selecciona la más reciente:

          ADMIN_PASS=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} -n harbor-system get secret harbor-admin -o jsonpath="{.data.secret}" | base64 -d)
        
          curl -k -X GET \
            --header 'Accept: application/json' \
            --header "authorization: Basic $(echo -n admin:${ADMIN_PASS:?} | base64)" \
          "${HARBOR_URL}/api/v2.0/projects/${HARBOR_PROJECT:?}/repositories/${REPOSITORY:?}/artifacts?with_tag=true" | jq -r '.[] | select(.tags != null) | .tags[] | {tag: .name, updated:.push_time}'
        

        La salida debe ser similar al siguiente ejemplo:

        {
          "tag": "<tag1>",
          "updated": "<date1>"
        }
        {
          "tag": "<tag2>",
          "updated": "<date2>"
        }
        
      2. Exporta el valor de la etiqueta con la hora de actualización más reciente:

        TAG=MOST_RECENT_TAG
        

        Sustituye MOST_RECENT_TAG por la etiqueta con la hora de actualización más reciente.

  4. Descarga los artefactos de Harbor:

    gdcloud artifacts pull --single-manifest-repo \
    ${HARBOR_IP:?}/${HARBOR_PROJECT:?}/${REPOSITORY:?}:${TAG:?} \
    ${APP_NAME:?}-${TAG:?}
    

    Si ves el siguiente mensaje de error, puedes ignorarlo:

    tee: '/root/logs/artifacts_pull_--single-manifest-repo_2023.07.13:14.59.24.log': Permission denied
    

Problemas conocidos

Hay varios problemas conocidos asociados a la extracción del artefacto de Harbor:

  • Es posible que tengas que añadir el argumento --kubeconfig ${INFRA_ORG_KUBECONFIG:?}.
  • El comando curl puede mostrar el siguiente mensaje de error: certificate signed by unknown authority. Para solucionar este error, utilice uno de los siguientes métodos:

    • Solución temporal: añade la marca --insecure al comando gdcloud artifacts pull.
    • Corrección fiable: confía en la AC de la infraestructura de la organización. Para obtener más información, consulta Error al extraer la imagen.
  • Es posible que tengas que extraer el contenido:

    gdcloud artifacts extract ${APP_NAME:?}-${TAG:?} ${APP_NAME:?}-${TAG:?}-extracted