Envie e extraia imagens de contentores de um cluster

Os artefactos do sistema existem no Artifact Registry do cluster de infraestrutura da organização. Quando um administrador da plataforma (PA) cria uma organização no dispositivo isolado do Google Distributed Cloud (GDC), todos os artefactos do sistema são replicados a partir do cluster de infraestrutura da organização.

O operador de infraestrutura (IO) tem de enviar novos artefactos do sistema para o cluster de infraestrutura da organização. O envio de novos artefactos do sistema só ocorre quando o PA pede para ativar funcionalidades opcionais ou quando o sistema apresenta erros ou indisponibilidades que pode corrigir aplicando patches a novos artefactos.

Antes de começar

Para receber as autorizações necessárias para aceder a recursos em projetos do Artifact Registry do sistema como administrador, peça ao administrador de segurança que lhe conceda as seguintes funções, consoante o cluster para o qual quer enviar a imagem de contentor.

Depois de obter as autorizações necessárias, siga os passos abaixo antes de enviar uma imagem para o Artifact Registry do sistema do cluster de infraestrutura:

  1. Transfira e instale a CLI Distributed Cloud seguindo as instruções da interface de linhas de comando (CLI) gdcloud.

  2. Instale o componente docker-credential-gdcloud seguindo as instruções de Instalar componentes:

    gdcloud components install docker-credential-gdcloud
    
  3. Inicie sessão com o Fornecedor de identidade configurado:

    gdcloud auth login
    
  4. Exporte o ficheiro kubeconfig:

    gdcloud clusters get-credentials CLUSTER_NAME
    

    Substitua CLUSTER_NAME pelo nome do cluster.

  5. Configure o Docker:

    gdcloud auth configure-docker
    

Transfira uma imagem de contentor de um contentor de armazenamento

Siga as instruções nesta secção quando o PA pedir para transferir a imagem de um contentor de armazenamento e carregá-la no Artifact Registry do sistema. O PA tem de fornecer detalhes como os nomes do projeto e do contentor.

Como IO, precisa de autorizações para transferir a imagem do contentor do contentor de armazenamento:

  • Peça ao administrador de segurança para lhe conceder a função de visualizador de objetos do contentor do projeto (project-bucket-object-viewer) no espaço de nomes do projeto.

Para mais detalhes, consulte o manual de procedimentos IAM R0005.

Tem acesso só de leitura ao contentor no projeto e aos objetos nesse contentor.

Depois de obter as autorizações necessárias, siga estes passos para transferir a imagem do contentor do contentor de armazenamento do espaço de nomes do projeto de PA:

  1. Peça ao PA o nome secreto do contentor. O nome do Secret tem o seguinte aspeto:

    object-storage-key-std-user-ID
    

    O nome do segredo inclui um valor ID exclusivo para aceder ao contentor.

  2. Copie o nome secreto do contentor.

  3. Obtenha credenciais de acesso ao contentor e configure a CLI 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}
    

    Substitua SECRET_NAME pelo valor que copiou no passo anterior.

  4. Transfira a imagem do contentor do contentor de armazenamento para a sua estação de trabalho:

    gdcloud cp s3://BUCKET_NAME/g/CONTAINER_IMAGE_NAME
    

    Substitua o seguinte:

    • BUCKET_NAME: o nome do contentor de armazenamento que tem a imagem do contentor. O PA fornece este nome.
    • CONTAINER_IMAGE_NAME: o nome do ficheiro de imagem do contentor que quer transferir do contentor de armazenamento.

Envie a imagem para o registo de artefactos do sistema

Siga estes passos para enviar o ficheiro da imagem do contentor que tem na sua estação de trabalho para o Artifact Registry do sistema no servidor da API Management:

  1. Abra a consola.

  2. Obtenha o caminho para o ponto final do System Artifact Registry do cluster para o qual quer enviar a imagem do contentor:

    export REGISTRY_ENDPOINT=harbor.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
  3. Carregue, etiquete e envie a imagem do contentor para o ponto final do registo de artefactos do sistema do cluster:

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

    Substitua CONTAINER_IMAGE_PATH pelo caminho do ficheiro de imagem do contentor no seu sistema de ficheiros local. Um valor válido para este caminho é, por exemplo, oracle_db.tar.

Extraia o artefacto do Harbor

Na maioria dos casos, o sistema GDC interage automaticamente com o registo de artefactos do sistema (SAR) para extrair o artefacto mais recente do Harbor. Para alguns casos extremos, pode realizar esta operação manualmente. Siga estes passos para extrair manualmente a imagem do artefacto do Harbor:

  1. Defina os detalhes dos artefactos que define por cada aplicação:

    APP_NAME=APP
    HARBOR_PROJECT=HARBOR_PROJECT_NAME
    REPOSITORY=REPOSITORY
    

    Substitua o seguinte:

    • APP: o nome da aplicação.
    • HARBOR_PROJECT_NAME: o nome do projeto do Harbor.
    • REPOSITORY: o nome do repositório.
  2. Obtenha as informações do porto:

    HARBOR_URL=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} get harborcluster harbor -n harbor-system -o=jsonpath='{.spec.externalURL}')
    HARBOR_IP=${HARBOR_URL#https://}
    
  3. Obtenha a etiqueta de artefacto. Existem dois métodos para obter a etiqueta:

    • Método 1: esta é a opção preferida:

      1. Liste os artefactos no pacote local e obtenha a etiqueta correspondente:
      TAG=$(gdcloud artifacts tree ${BUNDLE_SUB_FOLDER:?} | grep ${HARBOR_PROJECT:?}/${REPOSITORY:?} | cut -d ":" -f2 | grep -v '.sig')
      
    • Método dois: use apenas este método se o método um não funcionar como esperado:

      1. Liste as etiquetas no Harbor e selecione a mais recente:

          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}'
        

        O resultado tem de ser semelhante ao seguinte exemplo:

        {
          "tag": "<tag1>",
          "updated": "<date1>"
        }
        {
          "tag": "<tag2>",
          "updated": "<date2>"
        }
        
      2. Exporte o valor da etiqueta com a hora de atualização mais recente:

        TAG=MOST_RECENT_TAG
        

        Substitua MOST_RECENT_TAG pela etiqueta com a hora de atualização mais recente.

  4. Transfira os artefactos do Harbor:

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

    Se vir a seguinte mensagem de erro, pode ignorá-la com segurança:

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

Problemas conhecidos

Existem vários problemas conhecidos associados à obtenção do artefacto do Harbor:

  • Pode ter de adicionar o argumento: --kubeconfig ${INFRA_ORG_KUBECONFIG:?}.
  • O comando curl pode apresentar a seguinte mensagem de erro: certificate signed by unknown authority. Mitigue este erro através de um dos seguintes métodos:

    • Correção temporária: adicione a flag --insecure ao comando gdcloud artifacts pull.
    • Correção fiável: confie na AC da infraestrutura da organização. Para mais informações, consulte o artigo Erro de obtenção de imagem.
  • Pode ter de extrair o conteúdo:

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