Implemente uma app de servidor Web contentorizada

Este tutorial descreve como carregar uma aplicação de contentor num ambiente isolado do Google Distributed Cloud (GDC) e executar essa aplicação num cluster do Kubernetes partilhado. Uma carga de trabalho em contentor é executada num cluster do Kubernetes partilhado num espaço de nomes do projeto. Os clusters partilhados estão logicamente separados dos projetos e uns dos outros para oferecerem diferentes domínios de falha e garantias de isolamento. No entanto, tem de garantir que o cluster partilhado está associado a um projeto para permitir a gestão de cargas de trabalho em contentor num projeto.

Este fluxo de trabalho destina-se a programadores de aplicações no grupo de operadores de aplicações que são responsáveis pela criação de cargas de trabalho de aplicações para a respetiva organização. Para mais informações, consulte o artigo Públicos para a documentação do GDC isolado.

Um dos maiores obstáculos à implementação de uma app de contentor é obter o binário da app para o seu centro de dados isolado. Trabalhe com a sua equipa de infraestrutura e administradores para transportar a aplicação para a 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 uma app de servidor Web de exemplo disponível no Google Cloud Artifact Registry.

Objetivos

  • Criar um registo do Harbor gerido.
  • Enviar uma imagem de contentor para o registo do Harbor gerido.
  • Criar um cluster do Kubernetes partilhado.
  • Implementar a app de contentor de exemplo no cluster.

Custos

Uma vez que o GDC foi concebido para ser executado num centro de dados isolado, as informações e os processos de faturação estão confinados apenas à implementação do GDC e não são geridos por outros produtos Google.

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Use o painel de controlo Custo projetado para antecipar os custos futuros de SKUs para as suas faturas.

Para acompanhar o consumo de armazenamento e computação, use os painéis de controlo Utilização da faturação.

Antes de começar

Para concluir as tarefas neste documento, tem de pedir as autorizações necessárias e preparar o seu ambiente.

Pedir funções de IAM

Tem de ter funções específicas para receber as autorizações necessárias para concluir este fluxo de trabalho do tutorial. Tem de pedir funções com âmbito definido para o seu projeto e organização.

Funções da organização

Para criar, eliminar, editar ou ver um cluster do Kubernetes partilhado, peça ao administrador de IAM da organização que lhe conceda a função de Administrador do cluster do utilizador (user-cluster-admin). Esta função não está associada a um espaço de nomes.

Se não tiver as autorizações para criar um cluster partilhado, peça ao administrador da plataforma que crie um para si.

Funções do projeto

Peça ao administrador de IAM do projeto que lhe conceda as seguintes funções no espaço de nomes do projeto com base na tarefa a realizar:

  • Administrador do espaço de nomes (namepspace-admin): criar, eliminar, editar e ver recursos do projeto. Esta função é necessária para implementar cargas de trabalho de contentores no seu projeto.

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

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

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

Preparar o ambiente

Para concluir este documento, tem de ter os seguintes recursos:

  1. Certifique-se de que tem um projeto para gerir as suas implementações em contentores. Crie um projeto se você não tiver um.

  2. Defina o espaço de nomes do projeto como uma variável de ambiente:

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

  4. Inicie sessão no servidor da API de gestão zonal e gere o respetivo ficheiro kubeconfig com uma identidade de utilizador. Defina o caminho kubeconfig como uma variável de ambiente:

    export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
    

Criar um registo do Harbor gerido

O GDC isolado oferece o Harbor como um serviço, que é um serviço totalmente gerido que lhe permite armazenar e gerir imagens de contentores com o Harbor.

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

Criar uma instância do registo do Harbor

Para criar uma instância do registo de contentores do Harbor, conclua os seguintes passos:

Consola

  1. No menu de navegação, selecione Registo de contentores do Harbor na secção CI/CD.

  2. Selecione a zona na qual quer criar a instância do Harbor. Uma instância do Harbor é um recurso zonal e tem de ser criada manualmente em cada zona para garantir a elevada disponibilidade.

  3. Clique em Criar instância.

  4. Introduza o nome da instância e aceite os Termos de Utilização geridos do Harbor.

  5. Clique em Criar instância.

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

  7. Clique no link externo Aceder à 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 do registo do Harbor.

    Por exemplo:

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

gdcloud

  1. Crie a nova instância do registo de contentores do Harbor:

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

    Substitua o seguinte:

    • 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
    

    O resultado é semelhante ao seguinte:

    # 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 do registo do Harbor. Certifique-se de que o URL da instância não inclui o prefixo https://.

    Por exemplo:

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

Criar um projeto do Harbor no registo

Tem de criar um projeto do Harbor na instância do registo do Harbor para gerir as suas imagens de contentores:

Consola

  1. Clique em Criar um projeto do Harbor na página Registo de contentores do Harbor.

  2. Introduza 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 o seguinte:

    • HARBOR_PROJECT: o nome do projeto do Harbor a criar.
    • 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 o Docker

Para usar o Docker no registo do Harbor, conclua os seguintes passos:

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

  2. Configure a autenticação do Docker no Harbor. Para mais informações, consulte o artigo Configure a autenticação do Docker em instâncias do registo do Harbor.

Criar um segredo de pull de imagens do Kubernetes

Uma vez que está a usar um projeto do Harbor privado, tem de criar um segredo de pull de imagens do Kubernetes.

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

    1. Na consola do Harbor, selecione o projeto do Harbor.

    2. Clique em Contas de robot.

    3. Selecione Nova conta de robot.

    4. Atribua um nome à nova conta de robot e defina quaisquer definições adicionais.

    5. Clique em Adicionar.

    6. O nome e o segredo da conta de robot são apresentados no ecrã de êxito. Mantenha este ecrã aberto para referência no passo seguinte.

    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. Numa nova janela do terminal, inicie sessão no Docker com a conta de robot do projeto do Harbor e o token secreto:

    docker login ${INSTANCE_URL}
    

    Quando lhe for pedido, insira o nome do projeto do robot no campo Nome de utilizador e o token secreto no campo Palavra-passe que foram fornecidos no passo anterior no ecrã de êxito da consola do Harbor.

  3. Defina um nome arbitrário para o segredo de pull de imagens:

    export SECRET=SECRET
    
  4. Crie o segredo necessário para o pull de imagens:

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

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

  5. Confirme que o segredo existe no espaço de nomes do projeto do GDC:

    kubectl get secrets -n ${NAMESPACE}
    

    O resultado é semelhante ao seguinte:

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

Enviar uma imagem de contentor para o registo do Harbor gerido

Para este tutorial, vai transferir e enviar a imagem do servidor Web nginx para o registo do Harbor gerido e usá-la para implementar uma app de servidor Web nginx de exemplo num cluster do Kubernetes partilhado. A app de servidor Web nginx está disponível no repositório público do Docker Hub.

  1. Faça o pull da imagem nginx do Docker Hub para a sua estação de trabalho local através de uma rede externa:

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

    docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  3. Envie a imagem de contentor nginx para o registo do Harbor gerido:

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

Criar um cluster do Kubernetes

Agora que tem a imagem de contentor nginx armazenada no registo do Harbor gerido e pode aceder à mesma, crie um cluster do Kubernetes partilhado para executar o servidor Web nginx.

Consola

  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 na qual quer criar o cluster do Kubernetes. Um cluster do Kubernetes é um recurso zonal e tem de ser criado manualmente em cada zona para garantir a elevada disponibilidade.

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

  6. Clique em Criar.

  7. Aguarde pela criação do cluster. Quando o cluster estiver disponível para utilização, o estado READY é apresentado junto ao nome do cluster.

API

  1. Crie um recurso personalizado Cluster e guarde-o como um ficheiro 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 à sua instância do GDC:

    kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
    
  3. Anexe um projeto ao cluster do Kubernetes através da consola do GDC. Neste momento, não pode anexar um projeto ao cluster através da API.

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

Implementar a app de contentor de exemplo

Já tem tudo pronto para implementar a imagem de contentor nginx no cluster do Kubernetes.

O Kubernetes representa as aplicações como recursos Pod, que são unidades escaláveis que contêm um ou mais contentores. O pod é a menor unidade implementável no Kubernetes. Normalmente, implementa pods como um conjunto de réplicas que podem ser dimensionadas e distribuídas em conjunto no cluster. Uma forma de implementar um conjunto de réplicas é através de uma Deployment do Kubernetes.

Nesta secção, vai criar uma Deployment do Kubernetes para executar a app de contentor nginx no cluster. Esta implementação tem réplicas ou pods. Um pod Deployment contém apenas um contentor: a imagem de contentor nginx. Também vai criar um recurso Service que oferece uma forma estável de os clientes enviarem pedidos para os pods da Deployment.

Implemente o servidor Web nginx no cluster do Kubernetes:

  1. Inicie sessão no cluster do Kubernetes e gere o respetivo ficheiro kubeconfig com uma identidade de utilizador. Defina o caminho kubeconfig como uma variável de ambiente:

    export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
    
  2. Crie e implemente 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 implementação:

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

    O resultado é semelhante ao 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 espaço de nomes:

    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 com curl:

      curl http://$IP
    

Limpar

Para evitar custos na sua conta do GDC pelos recursos usados neste tutorial, tem de eliminar os recursos que criou.

Eliminar a imagem de contentor

Para eliminar a imagem de contentor do seu ambiente isolado do GDC, elimine a instância do Harbor que contém a imagem ou mantenha a instância do Harbor e elimine a imagem de contentor individual.

Para eliminar a imagem de contentor do registo do Harbor gerido, use a consola do GDC:

  1. No menu de navegação, selecione Registo de contentores do Harbor na secção CI/CD.

  2. Clique no link externo Aceder à instância do Harbor.

  3. Elimine a imagem de contentor através da IU do Harbor. Para mais informações, consulte o artigo Eliminar instâncias do registo do Harbor.

Eliminar a app de contentor

Para eliminar a app de contentor implementada, elimine o projeto do GDC que contém os recursos ou mantenha o projeto do GDC e elimine os recursos individuais.

Para eliminar os recursos individuais, conclua os seguintes passos:

  1. Elimine o objeto Service da app de contentor:

    kubectl delete service nginx-service -n ${NAMESPACE}
    
  2. Elimine o objeto Deployment da app de contentor:

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

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

    Esta ação elimina os recursos que compõem o cluster do Kubernetes, como as instâncias de computação, os discos e os recursos de rede:

O que se segue?