Los artefactos del sistema existen en Artifact Registry del clúster de infraestructura de la organización. Cuando un administrador de la plataforma (PA) 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 (IO) debe enviar artefactos nuevos del sistema al clúster de infraestructura de la organización. La inserción de artefactos nuevos del sistema solo se produce cuando el PA solicita habilitar funciones opcionales o cuando el sistema muestra errores o interrupciones que puedes corregir aplicando parches a artefactos nuevos.
Antes de comenzar
Para obtener los permisos que necesitas para acceder a los recursos en los proyectos del sistema de Artifact Registry como administrador, pídele a tu administrador de seguridad que te otorgue los siguientes roles según el clúster al que deseas enviar la imagen del contenedor.
Después de obtener los permisos necesarios, sigue estos pasos antes de enviar una imagen al registro de Artifact Registry del sistema del clúster de infraestructura:
Descarga e instala la CLI de Distributed Cloud siguiendo las instrucciones de la interfaz de línea de comandos (CLI) de gdcloud.
Instala el componente
docker-credential-gdcloud
siguiendo las instrucciones de Instala componentes:gdcloud components install docker-credential-gdcloud
Accede con el proveedor de identidad configurado:
gdcloud auth login
Exporta el archivo kubeconfig:
gdcloud clusters get-credentials CLUSTER_NAME
Reemplaza
CLUSTER_NAME
por el nombre del clúster.Configura Docker:
gdcloud auth configure-docker
Descarga una imagen de contenedor desde un bucket de almacenamiento
Sigue las instrucciones de esta sección cuando la PA solicite descargar la imagen de un bucket de almacenamiento y subirla al Artifact Registry del sistema. El PA debe proporcionar detalles como los nombres del proyecto y del bucket.
Como IO, necesitas permisos para descargar la imagen del contenedor del bucket de almacenamiento:
- Pídele a tu administrador de seguridad que te otorgue el rol de visualizador de objetos del bucket del proyecto (
project-bucket-object-viewer
) en el espacio de nombres del proyecto.
Para obtener más detalles, consulta el manual de ejecución IAM R0005.
Obtienes acceso de solo lectura al bucket dentro del proyecto y a los objetos de ese bucket.
Después de obtener los permisos necesarios, sigue estos pasos para descargar la imagen del contenedor del bucket de almacenamiento del espacio de nombres del proyecto de PA:
Pídele al PA el nombre secreto del bucket. El nombre del secreto se ve como el siguiente ejemplo:
object-storage-key-std-user-ID
El nombre del secreto incluye un valor
ID
único para acceder al bucket.Copia el nombre secreto del bucket.
Obtén credenciales de acceso al bucket y configura la CLI de gcloud:
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}
Reemplaza
SECRET_NAME
por el valor que copiaste en el paso anterior.Descarga la imagen de contenedor del bucket de almacenamiento a tu estación de trabajo:
gdcloud cp s3://BUCKET_NAME/g/CONTAINER_IMAGE_NAME
Reemplaza lo siguiente:
BUCKET_NAME
: Es el nombre del bucket de almacenamiento que contiene la imagen de contenedor. La PA proporciona este nombre.CONTAINER_IMAGE_NAME
: Es el nombre del archivo de imagen de contenedor que deseas descargar del bucket de almacenamiento.
Envía la imagen al registro de Artifact Registry del sistema
Sigue estos pasos para enviar el archivo de la imagen de contenedor que tienes en tu estación de trabajo al registro de Artifact Registry del sistema en el servidor de la API de Management:
Abre la consola.
Obtén la ruta de acceso al extremo de Artifact Registry del sistema del clúster en el que deseas enviar la imagen del contenedor:
export REGISTRY_ENDPOINT=harbor.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
Carga, etiqueta y envía la imagen del contenedor al extremo de Artifact Registry del sistema 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
Reemplaza
CONTAINER_IMAGE_PATH
por la ruta de acceso al archivo de imagen del contenedor en tu sistema de archivos local. Un valor válido para esta ruta es, por ejemplo,oracle_db.tar
.
Cómo extraer el 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 extremos, es posible que debas realizar esta operación de forma manual. Sigue estos pasos para extraer manualmente la imagen del artefacto de Harbor:
Establece los detalles del artefacto que definas para cada aplicación:
APP_NAME=APP HARBOR_PROJECT=HARBOR_PROJECT_NAME REPOSITORY=REPOSITORY
Reemplaza lo siguiente:
APP
: Es el nombre de la aplicación.HARBOR_PROJECT_NAME
: Es el nombre del proyecto de Harbor.REPOSITORY
: es el nombre del repositorio,
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://}
Obtén la etiqueta del artefacto. Existen dos métodos para recuperar la etiqueta:
Método 1: Esta es la opción preferida:
- Enumera los artefactos en el paquete local y obtén la etiqueta correspondiente:
TAG=$(gdcloud artifacts tree ${BUNDLE_SUB_FOLDER:?} | grep ${HARBOR_PROJECT:?}/${REPOSITORY:?} | cut -d ":" -f2 | grep -v '.sig')
Segundo método: Usa este método solo si el primero no funciona según lo esperado:
Enumera las etiquetas en 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}'
El resultado debe ser similar al siguiente ejemplo:
{ "tag": "<tag1>", "updated": "<date1>" } { "tag": "<tag2>", "updated": "<date2>" }
Exporta el valor de la etiqueta con la fecha y hora de actualización más recientes:
TAG=MOST_RECENT_TAG
Reemplaza
MOST_RECENT_TAG
por la etiqueta con la hora de actualización más reciente.
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 de forma segura:
tee: '/root/logs/artifacts_pull_--single-manifest-repo_2023.07.13:14.59.24.log': Permission denied
Problemas conocidos
Existen varios problemas conocidos asociados con la extracción del artefacto de Harbor:
- Es posible que debas agregar el argumento:
--kubeconfig ${INFRA_ORG_KUBECONFIG:?}
. El comando
curl
podría mostrar el siguiente mensaje de error:certificate signed by unknown authority
. Para mitigar este error, usa uno de los siguientes métodos:- Solución temporal: Agrega la marca
--insecure
al comandogdcloud artifacts pull
. - Corrección confiable: Confía en la CA de la infraestructura de la organización. Para obtener más información, consulta Error de extracción de imágenes.
- Solución temporal: Agrega la marca
Es posible que debas extraer el contenido:
gdcloud artifacts extract ${APP_NAME:?}-${TAG:?} ${APP_NAME:?}-${TAG:?}-extracted