Implantar um app de servidor da Web conteinerizado

Este tutorial descreve como fazer upload de um aplicativo de contêiner em um ambiente isolado do Google Distributed Cloud (GDC) e executar esse aplicativo em um cluster compartilhado do Kubernetes. Uma carga de trabalho em contêiner é executada em um cluster compartilhado do Kubernetes em um namespace do projeto. Os clusters compartilhados são separados logicamente dos projetos e uns dos outros para fornecer diferentes domínios de falha e garantias de isolamento. No entanto, é necessário garantir que o cluster compartilhado esteja anexado a um projeto para que as cargas de trabalho em contêiner possam ser gerenciadas nele.

Esse fluxo de trabalho é destinado a desenvolvedores de aplicativos no grupo de operadores de aplicativos responsáveis por criar cargas de trabalho de aplicativos para a organização. Para mais informações, consulte Públicos-alvo da documentação do GDC com isolamento físico.

Um dos maiores obstáculos para implantar um app de contêiner é levar o binário do app para o data center isolado. Trabalhe com sua equipe de infraestrutura e administradores para transportar o aplicativo para sua estação de trabalho ou implemente este tutorial diretamente no servidor de integração contínua e entrega contínua (CI/CD).

Este tutorial usa um app de servidor da Web de amostra disponível no Google Cloud Artifact Registry.

Objetivos

  • Criar um registro gerenciado do Harbor.
  • Enviar uma imagem de contêiner para o registro gerenciado do Harbor.
  • Criar um cluster compartilhado do Kubernetes.
  • Implantar o app de contêiner de amostra no cluster.

Custos

Como o GDC foi projetado para ser executado em um data center isolado, os processos e informações de faturamento são confinados apenas à implantação do GDC e não são gerenciados por outros produtos do Google.

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.

Use o painel de custos projetados para prever os custos futuros de SKU para suas faturas.

Para acompanhar o consumo de armazenamento e computação, use os painéis de uso de faturamento.

Antes de começar

Para concluir as tarefas neste documento, solicite as permissões necessárias e prepare seu ambiente.

Solicitar papéis do IAM

Você precisa ter papéis específicos para receber as permissões necessárias para concluir o fluxo de trabalho deste tutorial. É necessário solicitar papéis definidos para seu projeto e organização.

papéis na organização

Para criar, excluir, editar ou visualizar um cluster compartilhado do Kubernetes, peça ao administrador do IAM da organização para conceder a você o papel de administrador do cluster de usuário (user-cluster-admin). Esse papel não está vinculado a um namespace.

Se você não tiver as permissões para criar um cluster compartilhado, peça ao administrador da plataforma para criar um.

Papéis do projeto

Peça ao administrador do IAM do projeto para conceder a você os seguintes papéis no namespace do projeto com base na tarefa a ser realizada:

  • Administrador do namespace (namepspace-admin): criar, excluir, editar e visualizar recursos do projeto. Esse papel é necessário para implantar cargas de trabalho de contêiner no projeto.

  • Administrador da instância do Harbor (harbor-instance-admin): criar, excluir, editar e visualizar recursos do Harbor, incluindo instâncias do Harbor.

  • Leitor da instância do Harbor (harbor-instance-viewer): visualizar e selecionar uma instância do Harbor.

  • Criador de projetos do Harbor (harbor-project-creator): criar e visualizar projetos do Harbor.

Preparar o ambiente

Para concluir este documento, você precisa ter os seguintes recursos:

  1. Verifique se você tem um projeto para gerenciar as implantações em contêiner. Crie um projeto se você não tiver.

  2. Defina o namespace do projeto como uma variável de ambiente:

    export NAMESPACE=PROJECT_NAMESPACE
    
  3. Faça o download e instale a CLI da gdcloud.

  4. Faça login no servidor da API de gerenciamento zonal e gere o arquivo kubeconfig com uma identidade de usuário. Defina o caminho do kubeconfig como uma variável de ambiente:

    export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
    

Criar registro gerenciado do Harbor

O GDC com isolamento físico fornece o Harbor como um serviço totalmente gerenciado que permite armazenar e gerenciar imagens de contêiner usando o Harbor.

Para usar o Harbor como um serviço, primeiro crie uma instância de registro do Harbor e um projeto do Harbor.

Criar instância de registro do Harbor

Para criar uma instância de registro de contêiner do Harbor, siga estas etapas:

Console

  1. No menu de navegação, selecione Harbor Container Registry na seção CI/CD.

  2. Selecione a zona em que você quer criar a instância do Harbor. Uma instância do Harbor é um recurso zonal e precisa ser criada manualmente em cada zona para garantir a alta disponibilidade.

  3. Clique em Criar instância.

  4. Insira o nome da instância e aceite os Termos de Serviço gerenciados do Harbor.

  5. Clique em Criar instância.

  6. Confirme se a nova instância do Harbor existe na seção Instância do Harbor.

  7. Clique no link externo Acessar a instância do Harbor e anote o URL da instância. Por exemplo, o formato do URL da instância é semelhante a harbor-1.org-1.zone1.google.gdc.test. O URL da instância não pode incluir o prefixo https://.

  8. Defina o URL da instância como uma variável para usar mais tarde no tutorial:

    export INSTANCE_URL=INSTANCE_URL
    

    Substitua INSTANCE_URL pelo URL da instância de registro do Harbor.

    Exemplo:

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

gdcloud

  1. Crie a nova instância de registro de contêiner do Harbor:

    gdcloud harbor instances create INSTANCE_NAME \
        --project=PROJECT \
    

    Substitua:

    • INSTANCE_NAME: o nome da instância do Harbor.
    • PROJECT: o nome do projeto do GDC.
  2. Liste o URL da instância:

    gdcloud harbor instances describe INSTANCE_NAME \
        --project=PROJECT
    

    A saída será assim:

    # Several lines of code are omitted here.
    status:
      url: https://harbor-1.org-1.zone1.google.gdc.test
    
  3. Defina o URL da instância como uma variável para usar mais tarde no tutorial:

    export INSTANCE_URL=INSTANCE_URL
    

    Substitua INSTANCE_URL pelo URL da instância de registro do Harbor. Verifique se o URL da instância não inclui o prefixo https://.

    Exemplo:

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

Criar projeto do Harbor no registro

É necessário criar um projeto do Harbor na instância de registro do Harbor para gerenciar as imagens de contêiner:

Console

  1. Clique em Criar um projeto do Harbor na página Container Registry do Harbor.

  2. Insira o nome do projeto.

  3. Clique em Criar.

  4. Defina o nome do projeto do Harbor como uma variável para usar mais tarde no tutorial:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

gdcloud

  1. Crie o novo projeto do Harbor:

    gdcloud harbor harbor-projects create HARBOR_PROJECT \
        --project=PROJECT \
        --instance=INSTANCE_NAME
    

    Substitua:

    • HARBOR_PROJECT: o nome do projeto do Harbor a ser criado.
    • PROJECT: o nome do projeto do GDC.
    • INSTANCE_NAME: o nome da instância do Harbor.
  2. Defina o nome do projeto do Harbor como uma variável para usar mais tarde no tutorial:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

Configurar Docker

Para usar o Docker no registro do Harbor, siga estas etapas:

  1. Configure o Docker para confiar no Harbor como um serviço. Para mais informações, consulte Configurar o Docker para confiar na CA raiz do Harbor.

  2. Configure a autenticação do Docker no Harbor. Para mais informações, consulte Configurar a autenticação do Docker para instâncias de registro do Harbor.

Criar secret de extração de imagem do Kubernetes

Como você está usando um projeto particular do Harbor, é necessário criar um secret de extração de imagem do Kubernetes.

  1. Adicione uma conta de robô do projeto do Harbor para servir como sua conta de serviço.

    1. No console do Harbor, selecione o projeto do Harbor.

    2. Clique em Contas de robô.

    3. Selecione Nova conta de robô.

    4. Dê um nome à nova conta de robô e defina outras configurações.

    5. Clique em Adicionar.

    6. O nome e o secret da conta de robô são exibidos na tela de sucesso. Mantenha essa tela aberta para referência na próxima etapa.

    Para mais informações, consulte a documentação do Harbor: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account.

  2. Em uma nova janela do terminal, faça login no Docker com a conta de robô e o token secreto do projeto do Harbor:

    docker login ${INSTANCE_URL}
    

    Quando solicitado, insira o nome do projeto do robô para o Nome de usuário e o token secreto para a Senha que foram fornecidos na etapa anterior na tela de sucesso do console do Harbor.

  3. Defina um nome arbitrário para o secret de extração de imagem:

    export SECRET=SECRET
    
  4. Crie o secret necessário para a extração da imagem:

    kubectl create secret docker-registry ${SECRET}  \
        --from-file=.dockerconfigjson=DOCKER_CONFIG \
        -n ${NAMESPACE}
    

    Substitua DOCKER_CONFIG pelo caminho para o arquivo .docker/config.json.

  5. Confirme se o secret existe no namespace do projeto do GDC:

    kubectl get secrets -n ${NAMESPACE}
    

    O resultado será assim:

    NAME          TYPE                               DATA     AGE
    my-secret     kubernetes.io/dockerconfigjson     1        23s
    

Enviar imagem de contêiner para o registro gerenciado do Harbor

Para este tutorial, você vai fazer o download e enviar a imagem do servidor da Web nginx para o registro gerenciado do Harbor e usá-la para implantar um app de servidor da Web nginx de amostra em um cluster compartilhado do Kubernetes. O app de servidor da Web nginx está disponível no repositório público do Docker Hub.

  1. Extraia a imagem nginx do Docker Hub para sua estação de trabalho local usando uma rede externa:

    docker pull nginx
    
  2. Marque a imagem local com o nome do repositório:

    docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  3. Envie a imagem do contêiner nginx para o registro gerenciado do Harbor:

    docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    

Criar um cluster do Kubernetes

Agora que você tem a imagem de contêiner nginx armazenada no registro gerenciado do Harbor e pode acessá-la, crie um cluster compartilhado do Kubernetes para executar o servidor da Web nginx.

Console

  1. No menu de navegação, selecione Kubernetes Engine > Clusters.

  2. Clique em Criar cluster.

  3. No campo Nome, especifique um nome para o cluster.

  4. Selecione a zona em que você quer criar o cluster do Kubernetes. Um cluster do Kubernetes é um recurso zonal e precisa ser criado manualmente em cada zona para garantir a alta disponibilidade.

  5. Clique em Anexar projeto e selecione um projeto para anexar ao cluster. Em seguida, clique em Salvar.

  6. Clique em Criar.

  7. Aguarde a criação do cluster. Quando o cluster estiver disponível para uso, o status READY vai aparecer ao lado do nome do cluster.

API

  1. Crie um recurso personalizado Cluster e salve-o como um arquivo YAML, como cluster.yaml:

    apiVersion: cluster.gdc.goog/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: platform
    

    Substitua o valor CLUSTER_NAME pelo nome do cluster.

  2. Aplique o recurso personalizado à instância do GDC:

    kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
    
  3. Anexe um projeto ao cluster do Kubernetes usando o console do GDC. Não é possível anexar um projeto ao cluster usando a API no momento.

Para mais informações sobre como criar um cluster compartilhado do Kubernetes, consulte Criar um cluster compartilhado. Para mais informações sobre as opções de configuração de cluster disponíveis, consulte Configurações de cluster do Kubernetes.

Implantar o app de contêiner de amostra

Agora está tudo pronto para implantar a imagem de contêiner nginx no cluster do Kubernetes.

O Kubernetes representa aplicativos como recursos Pod, que são unidades escalonáveis que contêm um ou mais contêineres. O pod é a menor unidade implantável no Kubernetes. Normalmente, você implanta pods como um conjunto de réplicas que podem ser escalonadas e distribuídas juntas no cluster. Uma maneira de implantar um conjunto de réplicas é usando uma Deployment do Kubernetes.

Nesta seção, você vai criar uma Deployment do Kubernetes para executar o app de contêiner nginx no cluster. Essa implantação tem réplicas ou pods. Um pod Deployment contém apenas um contêiner: a imagem do contêiner nginx. Você também cria um recurso Service que fornece uma maneira estável para os clientes enviarem solicitações aos pods da Deployment.

Implante o servidor da Web nginx no cluster do Kubernetes:

  1. Faça login no cluster do Kubernetes e gere o arquivo kubeconfig com uma identidade de usuário. Defina o caminho do kubeconfig como uma variável de ambiente:

    export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
    
  2. Crie e implante os recursos personalizados Deployment e Service do Kubernetes:

    kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \
    create -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
            ports:
            - containerPort: 80
          imagePullSecrets:
          - name: ${SECRET}
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
    spec:
      selector:
        app: nginx
      ports:
        - port: 80
          protocol: TCP
      type: LoadBalancer
    EOF
    
  3. Verifique se os pods foram criados pela implantação:

    kubectl get pods -l app=nginx -n ${NAMESPACE}
    

    O resultado será assim:

    NAME                                READY     STATUS    RESTARTS   AGE
    nginx-deployment-1882529037-6p4mt   1/1       Running   0          1h
    nginx-deployment-1882529037-p29za   1/1       Running   0          1h
    nginx-deployment-1882529037-s0cmt   1/1       Running   0          1h
    
  4. Crie uma política de rede para permitir todo o tráfego de rede para o namespace:

    kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \
    create -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      annotations:
      name: allow-all
    spec:
      ingress:
      - from:
        - ipBlock:
            cidr: 0.0.0.0/0
      podSelector: {}
      policyTypes:
      - Ingress
    EOF
    
  5. Exporte o endereço IP do serviço nginx:

      export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \
          -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
    
  6. Teste o endereço IP do servidor nginx usando curl:

      curl http://$IP
    

Limpar

Para evitar cobranças na sua conta do GDC pelos recursos usados neste tutorial, exclua os recursos criados.

Excluir a imagem do contêiner

Para excluir a imagem do contêiner do ambiente GDC com isolamento físico, exclua a instância do Harbor que contém a imagem ou mantenha a instância do Harbor e exclua a imagem do contêiner individual.

Para excluir a imagem do contêiner do registro gerenciado do Harbor, use o console do GDC:

  1. No menu de navegação, selecione Harbor Container Registry na seção CI/CD.

  2. Clique no link externo Acessar a instância do Harbor.

  3. Exclua a imagem do contêiner usando a interface do Harbor. Para mais informações, consulte Excluir instâncias de registro do Harbor.

Excluir o app de contêiner

Para excluir o app de contêiner implantado, either exclua o projeto do GDC que contém os recursos ou mantenha o projeto do GDC e exclua os recursos individuais.

Para excluir os recursos individuais, siga estas etapas:

  1. Exclua o objeto Service do app de contêiner:

    kubectl delete service nginx-service -n ${NAMESPACE}
    
  2. Exclua o objeto Deployment do app de contêiner:

    kubectl delete deployment nginx-deployment -n ${NAMESPACE}
    
  3. Se você criou um cluster de teste do Kubernetes apenas para este tutorial, exclua-o:

    kubectl delete clusters.cluster.gdc.goog/USER_CLUSTER_NAME \
        -n platform --kubeconfig ${MANAGEMENT_API_SERVER}
    

    Isso exclui os recursos que compõem o cluster do Kubernetes, como instâncias de computação, discos e recursos de rede:

A seguir