Neste tutorial, descrevemos como fazer upload de um aplicativo contêiner em um ambiente isolado do Google Distributed Cloud (GDC) e executar esse aplicativo em um cluster do Kubernetes. Uma carga de trabalho em contêineres é executada em um cluster do Kubernetes dentro de um namespace do projeto. Os clusters são logicamente separados dos projetos e entre si para oferecer diferentes domínios de falha e garantias de isolamento. No entanto, é necessário garantir que o cluster esteja anexado a um projeto para permitir que as cargas de trabalho em contêineres sejam gerenciadas em um projeto.
Um dos maiores obstáculos para implantar um app 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 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
- Crie um registro gerenciado do Harbor.
- Envie uma imagem de contêiner para o registro gerenciado do Harbor.
- Criar um cluster 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 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 controle de custo projetado para prever os custos futuros de SKUs nas suas faturas.
Para acompanhar o consumo de armazenamento e computação, use os painéis de uso do faturamento.
Antes de começar
Verifique se você tem um projeto para gerenciar suas implantações em contêineres. Crie um projeto se você não tiver um.
Defina o namespace do projeto como uma variável de ambiente:
export NAMESPACE=PROJECT_NAMESPACE
Peça ao administrador do IAM da organização para conceder a você os seguintes papéis:
Papel de administrador de namespace (
namepspace-admin
) para o namespace do projeto. Essa função é necessária para implantar cargas de trabalho de contêiner no seu projeto.Papel de administrador de instâncias do Harbor (
harbor-instance-admin
) para o namespace do projeto. Essa função é necessária para acesso de leitura e gravação a todos os recursos do Harbor. Também é necessário excluir instâncias do Harbor.Papel de leitor de instâncias do Harbor (
harbor-instance-viewer
) para o namespace do seu projeto. Essa função é necessária para visualizar e selecionar uma instância do Harbor.Função de criador de projetos do Harbor (
harbor-project-creator
) para o namespace do projeto. Esse papel é necessário para acessar e gerenciar um projeto do Harbor.Papel de administrador de cluster de usuário (
user-cluster-admin
). Esse papel é necessário para criar um cluster do Kubernetes e não está vinculado a um namespace.
Faça login no servidor da API de gerenciamento zonal e gere o arquivo kubeconfig dele 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 air-gapped oferece 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 e um projeto do Harbor.
Criar uma instância do registro do Harbor
Para criar uma instância do registro de contêiner do Harbor, siga estas etapas:
Console
No menu de navegação, selecione Harbor Container Registry na seção CI/CD.
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 alta disponibilidade.
Clique em Criar instância.
Insira o nome da instância e aceite os Termos de Serviço gerenciados do Harbor.
Clique em Criar instância.
Confirme se a nova instância do Harbor existe na seção Instância do Harbor.
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 prefixohttps://
.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 registro do Harbor.
Exemplo:
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
gdcloud
Crie a nova instância do 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.
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
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 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
Crie um projeto do Harbor na instância do registro do Harbor para gerenciar suas imagens de contêiner:
Console
Clique em Criar um projeto do Harbor na página Harbor Container Registry.
Insira o nome do projeto.
Clique em Criar.
Defina o nome do projeto do Harbor como uma variável para usar mais tarde no tutorial:
export HARBOR_PROJECT=HARBOR_PROJECT
gdcloud
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.
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 seu registro do Harbor, siga estas etapas:
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.
Configure a autenticação do Docker no Harbor. Para mais informações, consulte Configurar a autenticação do Docker para instâncias do registro do Harbor.
Criar um secret de extração de imagem do Kubernetes
Como você está usando um projeto particular do Harbor, é necessário criar um secret de pull de imagem do Kubernetes.
Adicione uma conta de robô do projeto do Harbor para servir como sua conta de serviço.
No console do Harbor, selecione seu projeto do Harbor.
Clique em Contas de robô.
Selecione Nova conta de robô.
Dê um nome à nova conta de robô e defina outras configurações.
Clique em Adicionar.
O nome e o secret da conta de robô são mostrados 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.
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ô em Nome de usuário e o token secreto em Senha que foram fornecidos na etapa anterior na tela de sucesso do console do Harbor.
Defina um nome arbitrário para o secret de extração de imagem:
export SECRET=SECRET
Crie o secret necessário para o pull 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
.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 do contêiner para o registro gerenciado do Harbor
Neste tutorial, você vai baixar 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 do Kubernetes. O app do servidor da Web nginx está disponível no
repositório público do Docker Hub.
Extraia a imagem
nginx
do Docker Hub para sua estação de trabalho local usando uma rede externa:docker pull nginx
Marque a imagem local com o nome do repositório:
docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
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 do contêiner nginx
armazenada no registro gerenciado do Harbor
e pode acessá-la, crie um cluster do Kubernetes para executar o servidor da Web nginx.
Console
No menu de navegação, selecione Kubernetes Engine > Clusters.
Clique em Criar cluster.
No campo Nome, especifique um nome para o cluster.
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.
Clique em Anexar projeto e selecione um projeto para anexar ao cluster. Clique em Salvar.
Clique em Criar.
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
Crie um recurso personalizado
Cluster
e salve-o como um arquivo YAML, comocluster.yaml
:apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platform
Substitua o valor
CLUSTER_NAME
pelo nome do cluster.Aplique o recurso personalizado à sua instância do GDC:
kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
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 do Kubernetes, consulte Criar um cluster do Kubernetes.
Implantar o app de contêiner de amostra
Agora você está pronto para 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, 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 é
por meio de uma Deployment
do Kubernetes.
Nesta seção, você cria 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 de contêiner nginx
. Você
também cria um recurso Service
que oferece uma maneira estável para os clientes enviarem
solicitações aos pods da sua Deployment
.
Implante o servidor da Web nginx no cluster do Kubernetes:
Faça login no cluster do Kubernetes e gere o arquivo kubeconfig dele com uma identidade de usuário. Defina o caminho do kubeconfig como uma variável de ambiente:
export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
Crie e implante os recursos personalizados
Deployment
eService
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
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
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
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}'`
Teste o endereço IP do servidor
nginx
usandocurl
: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 seu ambiente isolado do GDC, 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:
No menu de navegação, selecione Harbor Container Registry na seção CI/CD.
Clique no link externo Acessar a instância do Harbor.
Exclua a imagem do contêiner usando a interface do Harbor. Para mais informações, consulte Excluir instâncias do registro do Harbor.
Excluir o app de contêiner
Para excluir o app contêiner implantado, exclua o projeto do GDC que contém os recursos ou mantenha o projeto e exclua os recursos individuais.
Para excluir os recursos individuais, siga estas etapas:
Exclua o objeto
Service
do app de contêiner:kubectl delete service nginx-service -n ${NAMESPACE}
Exclua o objeto
Deployment
do app de contêiner:kubectl delete deployment nginx-deployment -n ${NAMESPACE}
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
Conheça a hierarquia de recursos e os detalhes sobre o isolamento de recursos.
Saiba mais sobre a arquitetura de cluster.
Leia a documentação Contêineres do Kubernetes para GDC para saber como gerenciar contêineres implantados nos clusters do Kubernetes.
Saiba como gerenciar seus clusters do Kubernetes depois que as cargas de trabalho de contêineres forem implantadas.
Confira as práticas recomendadas para configurar suas cargas de trabalho de contêineres e outros recursos de serviço.