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
Certifique-se de que tem um projeto para gerir as implementações em contentores. Crie um projeto se não tiver um.
Defina o espaço de nomes do projeto como uma variável de ambiente:
export NAMESPACE=PROJECT_NAMESPACE
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.
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
No menu de navegação, selecione Harbor Container Registry na secção CI/CD.
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.
Clique em Criar instância.
Introduza o nome da instância e aceite os Termos de Utilização geridos pelo Harbor.
Clique em Criar instância.
Confirme se a nova instância do Harbor existe na secção Instância do Harbor.
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 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 registo do Harbor.
Por exemplo:
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
gdcloud
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.
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
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
Clique em Create A Harbor Project na página Harbor Container Registry.
Introduza 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 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.
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:
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.
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.
Adicione uma conta de robô do projeto do Harbor para servir como conta de serviço.
Na consola do Harbor, selecione o seu projeto do Harbor.
Clique em Contas de robôs.
Selecione Nova conta de robô.
Atribua um nome à nova conta de robô e defina quaisquer definições adicionais.
Clique em Adicionar.
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.
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.
Defina um nome arbitrário para o segredo de obtenção de imagens:
export SECRET=SECRET
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
.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.
Extraia a imagem
nginx
do Docker Hub para a sua estação de trabalho local através de uma rede externa:docker pull nginx
Etiquete a imagem local com o nome do repositório:
docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
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
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 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.
Clique em Anexar projeto e selecione um projeto para anexar ao cluster. Em seguida, clique em Guardar.
Clique em Criar.
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
Crie um recurso personalizado
Cluster
e guarde-o como um ficheiro 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}
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:
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
Crie e implemente 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 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
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
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
comcurl
: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:
No menu de navegação, selecione Harbor Container Registry na secção CI/CD.
Clique no link externo Aceder à instância do Harbor.
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:
Elimine o objeto
Service
para a app de contentor:kubectl delete service nginx-service -n ${NAMESPACE}
Elimine o objeto
Deployment
para a app de contentor:kubectl delete deployment nginx-deployment -n ${NAMESPACE}
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?
Explore a hierarquia de recursos e os detalhes sobre o isolamento de recursos.
Saiba mais sobre a arquitetura de clusters.
Leia a documentação Recipientes do Kubernetes para o GDC para obter informações sobre como gerir recipientes implementados nos seus clusters do Kubernetes.
Saiba como gerir os seus clusters do Kubernetes depois de as cargas de trabalho de contentores terem sido implementadas.
Explore as práticas recomendadas para configurar as cargas de trabalho de contentores e outros recursos de serviços.