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. Uma carga de trabalho contentorizada é executada num cluster do Kubernetes num espaço de nomes do projeto. Os clusters estão logicamente separados dos projetos e uns dos outros para oferecer diferentes domínios de falhas e garantias de isolamento. No entanto, tem de garantir que o cluster está associado a um projeto para permitir que as cargas de trabalho em contentores sejam geridas num projeto.

Um dos maiores obstáculos à implementação de uma app de contentor é obter o ficheiro binário para o 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 implementar este tutorial diretamente no seu 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

  • Crie um registo do Harbor gerido.
  • Envie uma imagem de contentor para o registo do Harbor gerido.
  • Crie um cluster do Kubernetes.
  • Implemente a app de contentor de exemplo no cluster.

Custos

Uma vez que o GDC foi concebido para ser executado num centro de dados isolado, os processos e as informações 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 de custos projetados para antecipar os custos futuros das SKUs nas suas faturas.

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

Antes de começar

  1. Certifique-se de que tem um projeto para gerir as implementações em contentores. Crie um projeto se 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 gcloud.

  4. Peça ao administrador de IAM da organização para lhe conceder as seguintes funções:

    • Função de administrador do espaço de nomes (namepspace-admin) para o espaço de nomes do seu projeto. Esta função é necessária para implementar cargas de trabalho de contentores no seu projeto.

    • Função de administrador da instância do Harbor (harbor-instance-admin) para o espaço de nomes do seu projeto. Esta função é necessária para o acesso de leitura e escrita a todos os recursos do Harbor. Também é necessário para eliminar instâncias do Harbor.

    • Função de visitante da instância do Harbor (harbor-instance-viewer) para o espaço de nomes do seu projeto. Esta função é necessária para ver e selecionar uma instância do Harbor.

    • Função de criador do projeto do Harbor (harbor-project-creator) para o espaço de nomes do seu projeto. Esta função é necessária para aceder e gerir um projeto do Harbor.

    • Função de administrador do cluster de utilizadores (user-cluster-admin). Esta função é necessária para criar um cluster do Kubernetes e não está associada a um espaço de nomes.

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

    export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
    

Crie um registo do Harbor gerido

O GDC air-gapped oferece o Harbor como um serviço, que é um serviço totalmente gerido que lhe permite armazenar e gerir imagens de contentores através do Harbor.

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

Crie 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 Harbor Container Registry 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 pelo Harbor.

  5. Clique em Criar instância.

  6. Confirme se 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 tome nota do 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 da GDC.
  2. Indique o URL da instância:

    gdcloud harbor instances describe INSTANCE_NAME \
        --project=PROJECT
    

    O resultado tem um aspeto 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
    

Crie 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 Create A Harbor Project na página Harbor Container Registry.

  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 da 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
    

Configure o Docker

Para usar o Docker no seu 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 para o Harbor. Para mais informações, consulte o artigo Configure a autenticação do Docker para instâncias do registo do Harbor.

Crie um segredo de obtenção de imagens do Kubernetes

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

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

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

    2. Clique em Contas de robôs.

    3. Selecione Nova conta de robô.

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

    5. Clique em Adicionar.

    6. O nome e o segredo da conta de robô 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 robô e o token secreto do seu projeto do Harbor:

    docker login ${INSTANCE_URL}
    

    Quando lhe for pedido, introduza o nome do projeto do robô para o Nome de utilizador e o token secreto para a 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 obtenção de imagens:

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

    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 se o seu 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
    

Envie a imagem do 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. A app do servidor Web nginx está disponível no repositório público do Docker Hub.

  1. Extraia a 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 do contentor nginx para o seu registo do Harbor gerido:

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

Crie um cluster do Kubernetes

Agora que tem a imagem do contentor nginx armazenada no registo do Harbor gerido e pode aceder à mesma, crie um cluster do Kubernetes 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 a criação do cluster. Quando o cluster está 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. Associe um projeto ao seu cluster do Kubernetes através da consola do GDC. De momento, não pode anexar um projeto ao cluster através da API.

Para mais informações sobre como criar um cluster do Kubernetes, consulte o artigo Crie um cluster do Kubernetes.

Implemente a app do contentor de exemplo

Já tem tudo pronto para implementar a imagem do contentor nginx no seu 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 unidade implementável mais pequena 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 um Deployment do Kubernetes.

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

Implemente o servidor Web nginx no seu 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 do 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 incorrer em cobranças na sua conta do GDC pelos recursos usados neste tutorial, tem de eliminar os recursos que criou.

Elimine a imagem do contentor

Para eliminar a imagem do 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 do contentor individual.

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

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

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

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

Elimine a app de contentor

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

Para eliminar os recursos individuais, conclua os passos seguintes:

  1. Elimine o objeto Service para a app de contentor:

    kubectl delete service nginx-service -n ${NAMESPACE}
    
  2. Elimine o objeto Deployment para a 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}
    

    Isto 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?