Monthly Archives: maio de 2025

4 posts

Guia Completo sobre Kubernetes: Tudo o que Você Precisa Saber

Guia Completo sobre Kubernetes: Tudo o que Você Precisa Saber

Kubernetes, frequentemente abreviado como K8s, é uma ferramenta de orquestração de contêineres de código aberto que automatiza a implantação, dimensionamento e gerenciamento de aplicações em contêineres. Desenvolvido inicialmente pelo Google e agora mantido pela Cloud Native Computing Foundation (CNCF), o Kubernetes tornou-se um padrão na indústria para a gestão de aplicações em ambientes de nuvem e on-premises. Este guia visa fornecer uma visão abrangente sobre Kubernetes, abordando desde conceitos básicos até práticas avançadas.

Introdução ao Kubernetes

Kubernetes foi projetado para orquestrar contêineres, facilitando a execução de aplicações em um cluster de máquinas. Ele lida com a automação de tarefas manuais, permitindo que os desenvolvedores e administradores de sistemas se concentrem na criação e no gerenciamento de aplicações, em vez de lidar com a infraestrutura subjacente.

Princípios Fundamentais

  • Automação: Automatiza a implantação, dimensionamento e gerenciamento de contêineres.
  • Escalabilidade: Permite que as aplicações sejam dimensionadas horizontalmente para atender a demandas variáveis.
  • Resiliência: Garante que as aplicações permaneçam disponíveis mesmo em caso de falhas.
  • Portabilidade: Suporta a execução de aplicações em diferentes ambientes, seja na nuvem ou on-premises.

Componentes Principais do Kubernetes

Para entender como o Kubernetes funciona, é importante conhecer seus componentes principais. Cada componente desempenha um papel específico na orquestração de contêineres.

Master Node

O Master Node é o cérebro do cluster Kubernetes. Ele gerencia o estado desejado do cluster e coordena as ações necessárias para atingir esse estado. Os principais componentes do Master Node são:

  • API Server: A interface para o cluster, permitindo que os usuários e outros componentes interajam com o Kubernetes.
  • etcd: Um armazenamento chave-valor consistente que mantém todos os dados do cluster, incluindo configurações e estado.
  • Scheduler: Responsável por determinar em qual nó do cluster um novo contêiner deve ser executado.
  • Controller Manager: Executa controladores em segundo plano que gerenciam tarefas como replicação de pods e balanceamento de carga.

Worker Nodes

Os Worker Nodes são os nós que executam os contêineres. Cada Worker Node contém os seguintes componentes:

  • Kubelet: Um agente que roda em cada nó e garante que os contêineres estejam em execução e saudáveis.
  • Kube-proxy: Mantém as regras de rede para permitir o acesso aos serviços dentro do cluster.
  • Container Runtime: O software responsável por executar os contêineres, como Docker ou containerd.

Conceitos Básicos do Kubernetes

Para utilizar efetivamente o Kubernetes, é crucial entender alguns conceitos fundamentais.

Pods

Um Pod é a unidade básica de escalabilidade e gerenciamento no Kubernetes. Ele representa um grupo de um ou mais contêineres (como contêineres Docker), com compartilhamento de recursos de armazenamento e rede. Os Pods são temporários; eles podem ser criados e destruídos dinamicamente.

Services

Services definem uma política de acesso a um ou mais Pods. Eles permitem que os Pods sejam acessados de forma estável, mesmo quando os Pods subjacentes são recriados ou movidos para diferentes nós.

Deployments

Deployments são recursos do Kubernetes que permitem a atualização e o rollback de aplicações. Eles gerenciam réplicas de Pods e garantem que um número especificado de réplicas esteja sempre em execução.

Namespaces

Namespaces fornecem um mecanismo para dividir os recursos do cluster entre vários usuários ou equipes. Eles são um escopo para recursos e podem ser usados para estabelecer quotas e limites.

Instalando e Configurando Kubernetes

A instalação do Kubernetes pode ser feita de várias maneiras, dependendo do ambiente e das necessidades específicas. Aqui, vamos cobrir a instalação usando kubeadm, uma ferramenta que simplifica a criação de clusters Kubernetes.

Pré-requisitos

  • Sistemas operacionais compatíveis (Ubuntu, CentOS, etc.)
  • Docker ou outro runtime de contêineres instalado
  • Acesso à rede entre os nós

Instalando kubeadm

Para instalar kubeadm, execute os seguintes comandos:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubeadm kubelet kubectl
sudo apt-mark hold kubeadm kubelet kubectl

Inicializando o Cluster

Para inicializar o cluster, execute o seguinte comando no Master Node:

sudo kubeadm init

Este comando configura o Master Node e fornece um comando para juntar Worker Nodes ao cluster.

Juntando Worker Nodes

Nos Worker Nodes, execute o comando fornecido durante a inicialização do Master Node para juntá-los ao cluster.

Gerenciando Aplicações com Kubernetes

Uma vez que o cluster Kubernetes está configurado, você pode começar a implantar e gerenciar aplicações.

Criando um Deployment

Um Deployment é usado para gerenciar a implantação de Pods. Aqui está um exemplo de um Deployment para uma aplicação simples:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: meu-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: meu-app
  template:
    metadata:
      labels:
        app: meu-app
    spec:
      containers:
      - name: meu-app
        image: meu-app:1.0
        ports:
        - containerPort: 80

Este Deployment cria três réplicas do contêiner “meu-app” e expõe a porta 80.

Exposing the Application

To make the application accessible from outside the cluster, you can create a Service:

apiVersion: v1
kind: Service
metadata:
  name: meu-app-service
spec:
  selector:
    app: meu-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

This Service exposes the application on port 80 and uses a LoadBalancer to route external traffic to the Pods.

Best Practices for Using Kubernetes

To get the most out of Kubernetes, it’s important to follow some best practices:

Use Namespaces

Namespaces help you organize your cluster and isolate resources. Use them to separate different environments (e.g., development, testing, production).

Implement Resource Quotas

Resource Quotas allow you to limit the amount of resources (CPU, memory) that can be used in a namespace. This helps prevent one application from consuming all available resources.

Use ConfigMaps and Secrets

ConfigMaps and Secrets are used to store configuration data and sensitive information, respectively. This keeps your application code clean and secure.

Monitor and Log

Use monitoring and logging tools to keep track of your applications and the cluster. Tools like Prometheus and Grafana for monitoring, and Fluentd and Elasticsearch for logging, are commonly used in Kubernetes environments.

Advanced Kubernetes Features

Beyond the basics, Kubernetes offers several advanced features that can help you manage complex applications.

StatefulSets

StatefulSets are used for deploying stateful applications. Unlike Deployments, StatefulSets maintain a stable network identity and persistent storage for each Pod.

Custom Resource Definitions (CRDs)

CRDs allow you to extend the Kubernetes API to create custom resources. This is useful for defining application-specific configurations and behaviors.

Operators

Operators are Kubernetes applications that extend the Kubernetes API to manage complex stateful applications. They automate the deployment and management of these applications.

Case Study: Migrating to Kubernetes

To illustrate the benefits of using Kubernetes, let’s look at a case study of a company that migrated its monolithic application to a microservices architecture using Kubernetes.

Background

XYZ Corp had a large monolithic application that was difficult to maintain and scale. The application was built using a mix of technologies and had grown over the years without a clear architectural vision.

Challenges

  • Difficulty in scaling individual components
  • Long deployment times
  • High maintenance costs

Solution

XYZ Corp decided to migrate to a microservices architecture using Kubernetes. They broke down the monolithic application into smaller, independent services, each running in its own container.

Results

  • Improved scalability and performance
  • Faster deployment times
  • Reduced maintenance costs
  • Enhanced developer productivity

Conclusion

Kubernetes has revolutionized the way we deploy, scale, and manage applications. Its powerful features and flexibility make it an ideal choice for modern application development and deployment. Whether you’re running a small application or a large-scale enterprise system, Kubernetes provides the tools and capabilities to help you succeed.

Palavras-chave

Kubernetes, K8s, orquestração de contêineres, Docker, microservices, cluster, Pods, Services, Deployments, kubeadm, Namespaces, Resource Quotas, ConfigMaps, Secrets, Prometheus, Grafana, Fluentd, Elasticsearch, StatefulSets, Custom Resource Definitions, Operators, migração, arquitetura de microserviços

Implementando um Pipeline de Desenvolvimento com Jenkins, Gitea e Docker


Implementando um Pipeline de Desenvolvimento com Jenkins, Gitea e Docker

No mundo do desenvolvimento de software, a automatização de processos é fundamental para garantir a eficiência e a qualidade do produto final. Uma das formas mais eficazes de automatizar o fluxo de trabalho de desenvolvimento é através da implementação de um pipeline de integração contínua e entrega contínua (CI/CD). Neste artigo, vamos explorar como criar um pipeline de desenvolvimento utilizando três ferramentas poderosas: Jenkins, Gitea e Docker.

Introdução ao Pipeline de Desenvolvimento

Um pipeline de desenvolvimento é uma série de etapas automatizadas que transformam o código-fonte em um produto de software pronto para uso. Essas etapas podem incluir compilação, testes, empacotamento e implantação. A automatização desse processo permite que os desenvolvedores se concentrem em escrever código, enquanto o pipeline cuida das tarefas repetitivas e propensas a erros.

Ferramentas Utilizadas

  • Jenkins: Uma ferramenta de automação de software de código aberto que permite a integração contínua e a entrega contínua. O Jenkins pode ser estendido com uma vasta gama de plugins para suportar diferentes tecnologias e ambientes.
  • Gitea: Um serviço de hospedagem de código-fonte de código aberto, semelhante ao GitHub. Ele permite que os desenvolvedores colaborem em projetos, rastreiem problemas e gerenciem o código-fonte.
  • Docker: Uma plataforma de contêinerização que permite aos desenvolvedores empacotar aplicações e suas dependências em um ambiente virtualizado que pode ser executado em qualquer lugar.

Configurando o Ambiente

Antes de começar a configurar o pipeline, é necessário ter as ferramentas instaladas e configuradas. Vamos supor que você já tenha um servidor Linux (como Ubuntu) pronto para uso.

Instalando o Gitea

Para instalar o Gitea, siga os passos abaixo:

  1. Baixe o arquivo binário do Gitea:
  2. wget https://dl.gitea.io/gitea/1.16.3/gitea-1.16.3-linux-amd64.tar.gz
  3. Extraia o arquivo:
  4. tar -zxvf gitea-1.16.3-linux-amd64.tar.gz
  5. Mova os arquivos para o diretório desejado:
  6. sudo mv gitea-1.16.3-linux-amd64 /var/gitea
  7. Crie um usuário para o Gitea:
  8. sudo adduser gitea
  9. Configure o Gitea para iniciar como um serviço:
  10. sudo nano /etc/systemd/system/gitea.service

    Adicione o seguinte conteúdo ao arquivo:

    [Unit]
    Description=Gitea (Git with a cup of tea)
    After=syslog.target network.target
    
    [Service]
    User=gitea
    Group=gitea
    WorkingDirectory=/var/gitea
    ExecStart=/var/gitea/gitea web
    
    [Install]
    WantedBy=multi-user.target
  11. Inicie o serviço do Gitea:
  12. sudo systemctl start gitea
  13. Habilite o serviço para iniciar na inicialização:
  14. sudo systemctl enable gitea

Instalando o Docker

Para instalar o Docker, siga os passos abaixo:

  1. Atualize o sistema:
  2. sudo apt update
  3. Instale as dependências necessárias:
  4. sudo apt install 
        ca-certificates 
        curl 
        gnupg 
        lsb-release
  5. Adicione a chave GPG oficial do Docker:
  6. sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  7. Adicione o repositório do Docker ao seu sistema:
  8. echo 
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu 
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  9. Instale o Docker:
  10. sudo apt update
    sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  11. Verifique se o Docker foi instalado corretamente:
  12. sudo docker run hello-world

Instalando o Jenkins

Para instalar o Jenkins, siga os passos abaixo:

  1. Adicione a chave GPG do Jenkins:
  2. wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
  3. Adicione o repositório do Jenkins:
  4. sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > 
        /etc/apt/sources.list.d/jenkins.list'
  5. Atualize o sistema:
  6. sudo apt update
  7. Instale o Jenkins:
  8. sudo apt install jenkins
  9. Inicie o serviço do Jenkins:
  10. sudo systemctl start jenkins
  11. Habilite o serviço para iniciar na inicialização:
  12. sudo systemctl enable jenkins

Configurando o Pipeline

Agora que temos todas as ferramentas instaladas, vamos configurar o pipeline de desenvolvimento.

Configurando o Jenkins

Após a instalação, acesse o Jenkins através do seu navegador em http://seu-servidor:8080. Siga os passos para completar a configuração inicial.

Instalando Plugins

Para integrar o Jenkins com o Gitea e o Docker, é necessário instalar alguns plugins. Acesse o painel de administração do Jenkins e navegue até “Gerenciar Jenkins” > “Gerenciar Plugins”. Instale os seguintes plugins:

  • Gitea Plugin
  • Docker Plugin
  • Pipeline Plugin

Criando um Novo Pipeline

Clique em “Novo Item”, escolha “Pipeline” e dê um nome ao seu projeto. Em “Definição”, selecione “Pipeline script” e adicione o seguinte script:

pipeline {
    agent any

    stages {
        stage('Checkout') {
            steps {
                git 'https://seu-servidor/seu-usuario/seu-repositorio.git'
            }
        }
        stage('Build') {
            steps {
                sh 'docker build -t seu-servidor/seu-projeto:latest .'
            }
        }
        stage('Test') {
            steps {
                sh 'docker run seu-servidor/seu-projeto:latest ./run-tests.sh'
            }
        }
        stage('Deploy') {
            steps {
                sh 'docker push seu-servidor/seu-projeto:latest'
            }
        }
    }
}

Configurando o Gitea

No Gitea, crie um novo repositório para o seu projeto. Em seguida, configure um webhook para notificar o Jenkins sempre que houver uma nova commit.

  1. Navegue até o seu repositório no Gitea.
  2. Clique em “Configurações” > “Webhooks”.
  3. Adicione um novo webhook com a URL http://seu-servidor:8080/gitea-webhook/.

Configurando o Docker

Certifique-se de que o Dockerfile e o script de testes estejam configurados corretamente no seu repositório. O Dockerfile deve construir a imagem da sua aplicação, e o script de testes deve executar os testes automatizados.

Executando o Pipeline

Com tudo configurado, faça um commit no seu repositório no Gitea. O webhook notificará o Jenkins, que iniciará o pipeline. Você pode acompanhar o progresso do pipeline no painel do Jenkins.

Conclusão

A implementação de um pipeline de desenvolvimento com Jenkins, Gitea e Docker pode parecer complexa à primeira vista, mas os benefícios em termos de eficiência e qualidade do software são inegáveis. Ao automatizar o processo de integração contínua e entrega contínua, os desenvolvedores podem se concentrar no que realmente importa: escrever código de alta qualidade.

Palavras-chave

pipeline, Jenkins, Gitea, Docker, CI/CD, integração contínua, entrega contínua, automação, desenvolvimento de software, DevOps

API Gateway e Microserviços com Docker e Kubernetes


API Gateway e Microserviços com Docker e Kubernetes

No mundo moderno de desenvolvimento de software, a arquitetura de microserviços tem se tornado cada vez mais popular devido à sua flexibilidade e escalabilidade. Para gerenciar esses microserviços de forma eficiente, é necessário utilizar ferramentas como Docker e Kubernetes. Além disso, um API Gateway desempenha um papel crucial na comunicação entre esses serviços. Neste post, vamos explorar em profundidade como integrar um API Gateway com microserviços utilizando Docker e Kubernetes.

Introdução aos Microserviços

Microserviços são uma arquitetura de software onde uma aplicação é composta por um conjunto de pequenos serviços, cada um executando em seu próprio processo e comunicando-se por meio de mecanismos leves, geralmente um protocolo HTTP/REST. Cada serviço é independente e pode ser desenvolvido, implantado e escalado separadamente.

Vantagens dos Microserviços

  • Escalabilidade: Cada serviço pode ser escalado independentemente.
  • Flexibilidade: Diferentes tecnologias podem ser utilizadas para diferentes serviços.
  • Resiliência: A falha de um serviço não afeta necessariamente os outros.
  • Desenvolvimento Ágil: Equipes podem trabalhar em diferentes serviços simultaneamente.

Docker: Containerização de Aplicações

Docker é uma plataforma de containerização que permite empacotar aplicações e suas dependências em um contêiner isolado que pode ser executado em qualquer ambiente. Isso facilita a implantação e o gerenciamento de aplicações em diferentes ambientes.

Benefícios do Docker

  • Portabilidade: Os contêineres Docker podem ser executados em qualquer lugar.
  • Consistência: Garante que a aplicação funcione da mesma forma em todos os ambientes.
  • Eficiência: Os contêineres são mais leves do que máquinas virtuais.
  • Isolação: Cada contêiner é isolado, reduzindo conflitos de dependências.

Kubernetes: Orquestração de Contêineres

Kubernetes é uma plataforma de orquestração de contêineres que automatiza a implantação, escalonamento e gerenciamento de aplicações containerizadas. Ele é particularmente útil para gerenciar microserviços em ambientes de produção.

Funcionalidades do Kubernetes

  • Auto-escalonamento: Ajusta automaticamente o número de instâncias com base na carga.
  • Balanceamento de carga: Distribui o tráfego entre várias instâncias de um serviço.
  • Descoberta de serviços: Permite que os serviços se descubram e se comuniquem entre si.
  • Gerenciamento de armazenamento: Facilita o provisionamento de volumes de armazenamento para contêineres.

API Gateway: A Porta de Entrada para Microserviços

Um API Gateway atua como um único ponto de entrada para uma coleção de microserviços. Ele lida com solicitações de clientes, roteia-as para o serviço apropriado, agrega respostas e aplica políticas de segurança e limitação de taxa.

Funções do API Gateway

  • Roteamento: Encaminha solicitações para o microserviço correto.
  • Agregação: Combina respostas de vários microserviços em uma única resposta.
  • Segurança: Aplica autenticação e autorização.
  • Limitação de taxa: Controla o número de solicitações que um cliente pode fazer.
  • Caching: Armazena respostas em cache para melhorar o desempenho.

Integrando API Gateway com Microserviços em Docker e Kubernetes

Para integrar um API Gateway com microserviços em um ambiente Docker e Kubernetes, seguiremos os seguintes passos:

1. Containerização dos Microserviços

Cada microserviço deve ser empacotado em um contêiner Docker. Isso é feito criando um arquivo Dockerfile para cada serviço.

Exemplo de Dockerfile para um microserviço em Node.js:

FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

2. Criação de um Kubernetes Deployment para Cada Microserviço

Um Kubernetes Deployment é usado para gerenciar a execução de contêineres. Cada microserviço terá seu próprio Deployment.

Exemplo de um Deployment para o microserviço acima:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: user-service
  template:
    metadata:
      labels:
        app: user-service
    spec:
      containers:
      - name: user-service
        image: user-service:latest
        ports:
        - containerPort: 3000

3. Configuração de um Service para Cada Microserviço

Um Kubernetes Service expõe um Deployment para que ele possa ser acessado por outros serviços dentro do cluster.

Exemplo de um Service para o microserviço acima:

apiVersion: v1
kind: Service
metadata:
  name: user-service
spec:
  selector:
    app: user-service
  ports:
    - protocol: TCP
      port: 3000
      targetPort: 3000

4. Configuração do API Gateway

O API Gateway pode ser implementado usando várias ferramentas, como Kong, NGINX, ou Traefik. Vamos usar o Traefik como exemplo.

Exemplo de configuração do Traefik:

apiVersion: v1
kind: ConfigMap
metadata:
  name: traefik-config
data:
  traefik.toml: |
    [entryPoints]
      [entryPoints.web]
        address = ":80"

    [api]
      entryPoint = "traefik"

    [providers.kubernetescrd]

5. Implantação do Traefik em Kubernetes

O Traefik pode ser implantado como um Deployment em Kubernetes.

Exemplo de um Deployment para o Traefik:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: traefik
spec:
  replicas: 1
  selector:
    matchLabels:
      app: traefik
  template:
    metadata:
      labels:
        app: traefik
    spec:
      containers:
      - name: traefik
        image: traefik:v2.4
        ports:
        - containerPort: 80
        volumeMounts:
        - name: traefik-config-volume
          mountPath: /etc/traefik
      volumes:
      - name: traefik-config-volume
        configMap:
          name: traefik-config

6. Configuração de Roteamento no Traefik

Para que o Traefik roteie as solicitações para os microserviços corretos, é necessário adicionar anotações aos Services dos microserviços.

Exemplo de anotações para o Service do microserviço de usuário:

apiVersion: v1
kind: Service
metadata:
  name: user-service
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
    traefik.ingress.kubernetes.io/router.rule: Host(`user.example.com`)
spec:
  selector:
    app: user-service
  ports:
    - protocol: TCP
      port: 3000
      targetPort: 3000

Conclusão

A integração de um API Gateway com microserviços em um ambiente Docker e Kubernetes oferece uma solução robusta e escalável para arquiteturas modernas de aplicações. Ao utilizar Docker para containerização e Kubernetes para orquestração, juntamente com um API Gateway como o Traefik, é possível criar um sistema que é fácil de gerenciar, escalável e resiliente.

Palavras-chave

API Gateway, microserviços, Docker, Kubernetes, containerização, orquestração, Traefik, arquitetura de software, escalabilidade, flexibilidade, resiliência, desenvolvimento ágil, portabilidade, consistência, eficiência, isolação, auto-escalonamento, balanceamento de carga, descoberta de serviços, gerenciamento de armazenamento, roteamento, agregação, segurança, limitação de taxa, caching

Implementando uma Esteira CI/CD com Docker, Jenkins e AWS EKS

Implementando uma Esteira CI/CD com Docker, Jenkins e AWS EKS

A adoção de práticas de Continuous Integration (CI) e Continuous Deployment (CD) tem se tornado essencial para equipes de desenvolvimento que buscam agilidade, qualidade e eficiência no processo de entrega de software. Neste artigo, vamos explorar como criar uma esteira CI/CD utilizando Docker, Jenkins e AWS Elastic Kubernetes Service (EKS). Vamos abordar cada componente em detalhes e fornecer exemplos práticos para ilustrar o processo.

Introdução ao CI/CD

O CI/CD é uma metodologia que visa automatizar o processo de integração e entrega de código. Ao integrar continuamente as mudanças no código-fonte e implantá-las automaticamente em um ambiente de produção, as equipes podem reduzir o tempo de ciclo de desenvolvimento, melhorar a qualidade do software e aumentar a confiança na entrega de novas funcionalidades.

Componentes da Esteira CI/CD

Para construir uma esteira CI/CD robusta, precisamos de alguns componentes-chave:

  • Docker: Um sistema de containerização que permite empacotar aplicações e suas dependências em imagens, facilitando a implantação em diferentes ambientes.
  • Jenkins: Uma ferramenta de automação de software de código aberto que permite orquestrar tarefas de construção, teste e implantação.
  • AWS EKS: Um serviço gerenciado da Amazon Web Services que facilita a execução de aplicações em contêineres usando o Kubernetes.

Configurando o Docker

O Docker é fundamental para criar ambientes consistentes e reproduzíveis para nossas aplicações. Vamos começar configurando um Dockerfile para nossa aplicação.

Criando um Dockerfile

Um Dockerfile é um script que contém instruções para construir uma imagem Docker. Aqui está um exemplo simples para uma aplicação Node.js:


      FROM node:14
      WORKDIR /app
      COPY package*.json ./
      RUN npm install
      COPY . .
      EXPOSE 3000
      CMD ["node", "app.js"]
    

Este Dockerfile inicia a partir da imagem oficial do Node.js, define o diretório de trabalho, copia os arquivos de configuração, instala as dependências, copia o código-fonte e expõe a porta 3000.

Construindo e Executando a Imagem Docker

Para construir a imagem Docker, use o seguinte comando:


      docker build -t minha-app .
    

E para executar o contêiner:


      docker run -p 3000:3000 minha-app
    

Configurando o Jenkins

O Jenkins é uma ferramenta poderosa para automatizar tarefas de CI/CD. Vamos configurá-lo para construir e testar nossa aplicação sempre que houver uma mudança no repositório.

Instalando o Jenkins

Você pode instalar o Jenkins em sua própria máquina ou usar um serviço gerenciado como o Jenkins X. Para este exemplo, vamos supor que você já tenha o Jenkins instalado e configurado.

Criando um Pipeline no Jenkins

Um pipeline no Jenkins é um conjunto de tarefas que são executadas em sequência. Vamos criar um pipeline para construir, testar e implantar nossa aplicação.


      pipeline {
          agent any
          stages {
              stage('Build') {
                  steps {
                      sh 'docker build -t minha-app .'
                  }
              }
              stage('Test') {
                  steps {
                      sh 'docker run minha-app npm test'
                  }
              }
              stage('Deploy') {
                  steps {
                      sh 'docker push minha-app:latest'
                      sh 'kubectl apply -f deployment.yaml'
                  }
              }
          }
      }
    

Este pipeline define três estágios: Build, Test e Deploy. No estágio Build, ele constrói a imagem Docker. No estágio Test, ele executa os testes dentro do contêiner. No estágio Deploy, ele envia a imagem para um registro Docker e aplica um manifesto Kubernetes para implantar a aplicação no EKS.

Configurando o AWS EKS

O AWS EKS é um serviço gerenciado que facilita a execução de aplicações em contêineres usando o Kubernetes. Vamos configurar um cluster EKS e implantar nossa aplicação nele.

Criando um Cluster EKS

Para criar um cluster EKS, você pode usar a AWS Management Console, a CLI da AWS ou o CloudFormation. Aqui está um exemplo usando a CLI da AWS:


      eksctl create cluster --name meu-cluster --region sa-east-1 --nodes 2
    

Este comando cria um cluster EKS chamado “meu-cluster” na região “sa-east-1” com 2 nós.

Configurando o kubectl

Para interagir com o cluster EKS, você precisa configurar o kubectl:


      aws eks --region sa-east-1 update-kubeconfig --name meu-cluster
    

Este comando atualiza o arquivo de configuração do kubectl para apontar para o cluster EKS.

Criando um Deployment no Kubernetes

Um deployment no Kubernetes é uma abstração que gerencia um conjunto de pods idênticos. Vamos criar um deployment para nossa aplicação:


      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: minha-app
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: minha-app
        template:
          metadata:
            labels:
              app: minha-app
          spec:
            containers:
            - name: minha-app
              image: 123456789012.dkr.ecr.sa-east-1.amazonaws.com/minha-app:latest
              ports:
              - containerPort: 3000
    

Este deployment cria 3 réplicas do contêiner “minha-app” usando a imagem armazenada no Amazon ECR.

Integrando Tudo

Agora que temos todos os componentes configurados, vamos integrar tudo para criar uma esteira CI/CD completa.

Fluxo de Trabalho Completo

  1. Um desenvolvedor faz uma mudança no código-fonte e envia uma pull request para o repositório.
  2. O Jenkins detecta a mudança e inicia um pipeline.
  3. O pipeline constrói a imagem Docker, executa os testes e, se tudo estiver correto, envia a imagem para o Amazon ECR.
  4. O pipeline aplica o deployment no Kubernetes, atualizando as réplicas do contêiner no cluster EKS.
  5. A aplicação é implantada e pronta para uso.

Conclusão

Neste artigo, exploramos como criar uma esteira CI/CD utilizando Docker, Jenkins e AWS EKS. Ao automatizar o processo de construção, teste e implantação, podemos entregar software de forma mais rápida, confiável e eficiente. Com as práticas de CI/CD, as equipes podem se concentrar em inovar e melhorar continuamente suas aplicações.

Palavras-chave

CI/CD, Continuous Integration, Continuous Deployment, Docker, Jenkins, AWS EKS, Kubernetes, DevOps, automação, pipeline, deployment, containerização, Amazon Web Services, ECR, kubectl, desenvolvimento ágil