Implantar um app de servidor da Web conteinerizado

Um cluster compartilhado no Google Distributed Cloud (GDC) com isolamento físico permite executar aplicativos conteinerizados em domínios de falha isolados na sua organização. Depois de anexar um a um projeto, é possível gerenciar essas cargas de trabalho em um namespace dedicado. Neste tutorial, você vai configurar um registro gerenciado do Harbor, enviar uma imagem de amostra do NGINX do Docker Hub e implantar o servidor da Web.

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

Objetivos

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

Custos

Como o GDC foi projetado para ser executado em um data center com isolamento físico, os processos e as informações de faturamento são limitados 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 custo projetado para prever os custos futuros de SKU das suas faturas.

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

Antes de começar

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

Trabalhe com sua equipe de infraestrutura e administradores para transportar o binário do aplicativo para sua estação de trabalho com isolamento físico ou execute este tutorial diretamente no servidor de integração e entrega contínua (CI/CD).

Solicitar papéis do IAM

Você precisa ter papéis específicos para receber as permissões necessárias para concluir este fluxo de trabalho do tutorial. É preciso solicitar papéis com escopo 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 de 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 para você.

Papéis do projeto

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

  • Administrador de 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 de instâncias do Harbor (harbor-instance-admin): criar, excluir, editar e visualizar recursos do Harbor, incluindo instâncias do Harbor.

  • Leitor de instâncias 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 dos seguintes recursos:

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

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

    export NAMESPACE=PROJECT_NAMESPACE
    
  3. Baixe e instale a CLI gdcloud.

  4. Faça login no servidor de 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 um registro gerenciado do Harbor

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

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

Criar instância de registro do Harbor

Para criar uma instância do Container Registry 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 a instância do Harbor será criada. Uma instância do Harbor é um recurso zonal e precisa ser criada manualmente em cada zona para garantir 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 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 adiante no tutorial:

    export INSTANCE_URL=INSTANCE_URL
    

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

    Exemplo:

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

gdcloud

  1. Crie a nova instância do Container Registry 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 adiante no tutorial:

    export INSTANCE_URL=INSTANCE_URL
    

    Substitua INSTANCE_URL pelo URL da instância do 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 um projeto do Harbor no registro

Crie um projeto do Harbor na instância do 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 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 seu 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 as configurações adicionais.

    5. Clique em Adicionar.

    6. O nome e o secret da conta do robô são exibidos na tela de sucesso. Mantenha essa tela aberta para consulta 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 sua conta de robô do projeto do Harbor e o token secreto:

    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 de imagens:

    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á o seguinte:

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

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

Neste 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 o cluster do Kubernetes será criado. Um cluster do Kubernetes é um recurso zonal e precisa ser criado manualmente em cada zona para garantir alta disponibilidade.

  5. Clique em Anexar projeto e selecione um projeto para anexar ao cluster. 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 dele.

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. No momento, não é possível anexar um projeto ao cluster usando a API.

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 você já pode implantar a imagem do contêiner nginx no cluster do Kubernetes.

O Kubernetes representa aplicativos como recursos Pod, que são unidades escalonáveis com um ou mais contêineres. O pod é a menor unidade implantável no Kubernetes. Normalmente, os pods são implantados 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 é por meio de uma Deployment do Kubernetes.

Nesta seção, você vai criar um 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 oferece uma forma estável para os clientes enviarem solicitações aos pods do 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á o seguinte:

    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.

Exclua a imagem do contêiner

Para excluir a imagem do contêiner do ambiente do 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 de 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, 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 as instâncias de computação, os discos e os recursos de rede:

A seguir