Sobre o autor
Meu nome é Fábio Luciano, trabalho como arquiteto de soluções na empresa SONDA.
Entre alguns fatos sobre mim, listo os seguintes como mais importantes:
-
Sou gay e casado 🏳️🌈;
-
Sou apaixonado por tecnologia e por software livre 🐧;
-
Sou ansioso pra cacete 😰.
Acho importante dizer essas coisas íntimas, por que acredito que isso, no final das contas, me resume em alguns aspectos. E como falaremos intimamente sobre containers, acho interessante abrir essas verdades sobre mim. Além do fato de serem verdades, o último ítem, a ansiedade, foi o que possibilitou meus estudos nos tópicos abordados, e também está possibilitando a escrita deste documento, já que estou usando o tempo em que redijo para me distrair da muvuca da minha cabeça.
Acho importante dizer também que esse documento/apresentação é pra ser despretensioso. Não pretendo ser coloquial, mas têm coisas que não podemos fugir do nome real, mas vou tentar usar analogias para explicar alguns assuntos que julgar necessário explicar um pouco a mais.
Logo, a confecção deste documento é quase que terapêutica, por que irei:
-
Organizar meus conhecimentos sobre o assunto em algum lugar;
-
Enfrentar o medo de falar publicamente; e
-
Disseminar o conhecimento.
Ah! Se você têm interesse por meu currículo profissional, aqui está alguns links pra que dê uma olhada:
Sobre este documento
O Que veremos
Sempre quis falar sobre containers, porém, nunca havia encontrado uma abordagem interessante ao assunto, visto a quantidade infinita de conteúdo sobre este assunto na internet. Com este contexto, decidi não falar sobre Docker
especificamente, mas sim sobre todas as tecnologias que o tornou possível e além disso, a partir da disseminação de tecnologias relacionadas a containers, ilustrar como sua existência mudou completamente a industria de infraestrutura e desenvolvimento de software.
Não é objetivo deste documento ser a "fonte da verdade" sobre conteinerização ou sobre Docker
, mas sim um compilado de informações sobre o assunto que compilei com o tempo. Por diversas vezes, utilizarei de uma linguagem despojada e despretensiosa e sempre que possível atribuirei fontes sobre o assunto. Vou te ajudar amigo ansioso.
Caso encontre algum problema, abra uma issue na página do projeto no GitHub.
Para seguir uma linha de raciocínio, escolhi dividir os assuntos abordados em seis partes. São elas:
Open Source
Na primeira parte deste documento, conversaremos sobre Open Source. Discutiremos sobre as aplicações do movimento por diversos setores da indústria(até o alimentício 😲). Falarei sobre as principais licenças que caracterizam projetos do movimento livre, e também sobre os modelos implementados para organização destes projetos, falaremos sobre tipos de distribuições, como exemplo das possibilidades da implementação do código-livre
, passearemos sobre grandes projetos, e por final, lhe farei um convite.
Sistemas Operacionais e sua arquitetura
Nesta segunda parte , elucidarei como os sistemas operacionais evoluíram o suficiente para possibilitar tecnologias de virtualização disponíveis atualmente. Além disso, apresenta o Kernel
do Linux de forma a introduzir conceitos utilizados por grande maioria dos provedores desta tecnologia.
Open Source
Sistemas Operacionais
Características
-
Interface entre o usuário e o hardware
-
Gerenciamento de dispositivos (Entradas e Saídas)
-
Prover um ambiente para o funcionamento de programas
-
Interface para o gerenciamento de dados
-
Monitorar a saúde do hardware
Gostaria de falar sobre o Kernel do Windows
, mas a verdade é que eu não sei nada sobre, e sinceramente, nunca procurei saber.
Características
-
Tudo é representado como arquivo;
-
Pseudo filesystems
-
dev
,proc
esys
,fd
-
-
-
Possui clara separação entre o espaço do usuário e o do kernel;
-
Os processos são separados em
namespaces
; -
A Comunicação entre o
user space
ekernel space
é feita por intermédio de bibliotecas ou sinais.
User Space
-
Onde os processos do usuário são executados;
-
Região fracionada e limitada da memória.
Kernel Space
-
Onde os processos do kernel são executados;
-
Região fracionada e privilegiada da memória.
System Calls
-
Único meio de comunicação entre o
User Space
eKernel Space
; -
Gerenciamento de Processos, memória, arquivos, dispositivos, rede e etc.
Sinais
-
SIGHUP - Reinicializa o processo;
-
GITTERM - Termina de forma graciosa Ctrl+c;
-
SIGKILL - Termina sem fazer nenhum tipo de checagem Ctrl+d.
Memory Management
-
Gerenciamento da memória;
-
Decide como os dados serão persistidos e recuperados;
-
Memória virtual;
-
Paginação;
-
Controle de Acesso.
Scheduler
-
Define em tempo de execução a alocação de recursos para um processo;
-
Priorização dinâmica.
Drivers
-
Também chamado de módulos;
-
Interface de comunicação entre o
Kernel
e os devices.
lsmod (1)
1 | Lista os módulos(drivers) carregados no Kernel. |
Failed to generate image: PlantUML image generation failed: /documents/src/resources/plantuml/resources/plantuml/plantuml.cfg (No such file or directory) @startuml skinparam dpi 300 title Comunicação da aplicação com o kernel box "User Space" participant Aplicação participant GLIBC participant vDSO end box box "Kernel Space" participant SysCall participant Kernel participant Hardware end box Aplicação -> GLIBC alt vDSO create vDSO GLIBC -> vDSO vDSO --> GLIBC else SysCall GLIBC -> SysCall end SysCall -> Kernel Kernel -> Hardware Hardware --> Kernel Kernel --> SysCall SysCall --> GLIBC GLIBC --> Aplicação @enduml
Exemplo
#include <stdio.h> (1)
#include <unistd.h> (1)
void main () {
printf(":)\n"); (2)
usleep(520000*1000);
}
1 | Importa a biblioteca de manipulação de entrada e saída |
2 | Imprime na saída padrão |
gcc printf.c -o printf (1)
1 | Compila o programa e define o arquivo de saída |
chmod +x ./printf (1)
strace ./printf (2)
1 | Concede permissão de execução ao programa |
2 | Imprime todas as SysCalls chamadas pelo programa |
Chroot (Jail)
-
Muda o diretório raiz de um processo;
-
Enclausuramento de recursos;
ldd ./printf (1)
mkdir -p chroot/{lib,lib64,} (2)
cp -v /lib/x86_64-linux-gnu/libc.so.6 ./chroot/lib (3)
cp -v /lib64/ld-linux-x86-64.so.2 ./chroot/lib64 (3)
cp ./printf ./chroot/bin (3)
sudo chroot ./chroot/ /bin/printf (4)
1 | Imprime as bibliotecas que o binário utiliza |
2 | Cria a estrutura de diretórios necessário (FHS ) |
3 | Copia as bibliotecas e binário para e estrutura criada |
4 | Exacuta o programa enclausurado |
Namespaces
-
Mount (
mnt
) -
Process (
pid
) -
Network (
net
) -
Interprocess Communication (
ipc
) -
UNIX Timesharing System (
uts
) -
User ID (
user
) -
CGroup
-
Padrão namespace global;
-
Os namespaces podem ser visualizados em
/proc/<processid>/ns/*
-
unshare
-
setns
-
clone
unshare --user /bin/bash (1)
UNSHARED_PID=`echo $$` (2)
cd /proc/$UNSHARED_PID/ns (3)
ls -l (4)
1 | Destaca a execução do binário em um namespace user diferente |
2 | Imprime o pid do processo criado e o associa a uma variável |
3 | Muda o workdir para o diretório com a lista de namespaces do processo |
4 | Lista os namespaces |
hostname (1)
unshare --uts /bin/bash (2)
hostname teste (3)
hostname (4)
Ctrl + d (5)
hostname (6)
1 | Recupera o hostname atual |
2 | Destaca a execução do binário em um namespace user diferente |
3 | Altera o hostname da máquina |
4 | Recupera o novo hostname |
5 | Envia o SIGNAL SIGKILL |
6 | Imprime o hostname no processo principal |
Containerização
-
Empacotamento de código e aplicações;
-
Empacotamento de dependências e versões;
-
Empacotamento de configurações.
-
Reusabilidade e Reproducibilidade.
Virtual Machines
-
Hardware
-
Sistema Operacional(Host)
-
Hypervisor - Habilita a virtualização/gerenciamento dos recursos
-
Sistema Operacional(Hospedeiro)
-
Binários e bibliotecas
-
Aplicações
Containers
-
Hardware
-
Sistema Operacional(Host)
-
Daemon(Daemon based)
-
Binários e bicliotecas
-
Aplicações
Vendors
Daemon | Daemonless | Systemd |
---|---|---|
Docker |
Buildah |
Rkt |
Podman |
Docker
-
Mais popular software de containers;
-
Elementos da stack:
-
Daemon
-
API
-
Client
-
Dockerfile
-
Segue a especificação
image-spec
do projetoopencontainers
; -
Descreve procedimentos necessários para se criar um ambiente;
-
Possui uma DSL(Domain-Specific Language)
FROM alpine (1)
RUN apk update (2)
RUN apk add curl (3)
1 | Informa a imagem base(conjunto de layers) que será utilizada |
2 | Atualiza a lista de pacotes |
3 | Instala o pacote curl
|
Container
-
Segue a especificação
runc
do projetoopencontainers
; -
É uma imagem em execução com a adição de uma branch writtable no topo;
-
Pode possuir volumes e networks;
-
Controle de recursos com
CGROUPS
eCAPABILITIES
.
Volumes
-
Onde os dados serão persistidos;
-
Possuem três tipos:
-
Host
-
Anônimo
-
Nomeado
-
-
Pode ser estendido com a utilização de plugins(nfs)
Conversational Development (ConvDev)
-
Desenvolver software é uma conversa;
-
O que precisa ser implementado;
-
O que precisa ser modificado;
-
Como será implementado;
-
Onde será implantado;
-
Como será controlado.
-
-
É a aplicação do agile com um objetivo simples: Finalizar uma conversa;
-
A conversa deve ter como objetivo a criação de um produto;
-
Passa por todas as áreas da linha de negócio;
-
Alinha-se a organização para que os processos sejam executados.
IaC e (Dev(Sec)?|Chat)Ops
Infraestrutura como código (IaC)
-
Trata a infraestrutura como código;
-
Está intimamente ligado às práticas do
DevOps
; -
Permite a adoção de práticas do desenvolvimento;
-
Controle de versão
-
Revisão por pares
-
Segmentação de ambientes
-
Testes
-
Terraform
-
A infraestrutura é definida utilizando HCL;
-
Utiliza grafos para controlar as dependências dos recursos;
-
Possui implementação para diversos providers(AWS, Azure, Google, etc.);
-
Todos os recursos necessários podem ser criados programáticamente.
Exemplo
resource "aws_subnet" "subnet-public-1" {
vpc_id = "${aws_vpc.vpc-devops.id}"
cidr_block = "${cidrsubnet(aws_vpc.vpc-devops.cidr_block, 8, 1)}"
ipv6_cidr_block = "${cidrsubnet(aws_vpc.vpc-devops.ipv6_cidr_block, 8, 1)}"
availability_zone = "${data.aws_availability_zones.available.names[0]}"
map_public_ip_on_launch = true
tags {
Name = "${cidrsubnet(aws_vpc.vpc-devops.cidr_block, 8, 2)} - subnet-public-1"
}
}
Ansible
-
Engine de automação;
-
Idempotência
-
Utiliza
yaml
para descrever os procedimentos; -
Módulos:
-
Infraestrutura na núvel;
-
Gerenciamento de Configuração;
-
Construção e implantação de aplicações..
-
-
As máquinas alvo da execução são organizadas em um
inventory
-
Utiliza o protocolo
SSH
para se comunicar as máquinas doinventory
; -
As execuções são agrupadas em
playbooks
; -
Cada execução é chamada de
play
.
Exemplo
- name: Docker | Install or Upgrade
block:
- name: Docker | Install the package
package:
name: docker.io
state: present
force_apt_get: true
become: true
- name: Docker | Add current user to docker group
user:
name: "{{ ansible_user }}"
groups: docker
append: yes
become: true
DevOps
-
Filosofia e práticas a serem implementas;
-
A aplicação impactam duas áreas Desenvolvimento(Dev) e Operação(Ops);
-
Sua aplicação envolve o negócio, pessoas e tecnologia;
-
A adoção
DevOps
não resolverá problemas do projeto; -
A adoção
Devops
fará com que os problemas sejam expostos; -
DevOps
não é Jenkins; -
DevOps
não é um cargo; -
Seu maior valor será adquirido com equipes que seguem metodologias ágeis;
Problemas a serem resolvidos
-
Longo processo pra implantação e entrega;
-
Falta de automação de processos no CDS;
-
Demora na identificação e resolução de problemas.
DevOps em uma palavra
Automação
Automação leva a consistência
-
Automação do processo de build;
-
Automação de verificações de qualidade;
-
Testes unitários;
-
Testes funcionais;
-
Testes de integração;
-
Testes de regressão;
-
-
Automação do processo de release;
-
Automação de verificações de acessibilidade;
-
Automação do processo de gerenciamento de configuração;
-
Automação do processo de deploy.
-
Automação do monitoramento;
Development x Operation
-
Possuem objetivos diferentes, quase opostos;
-
Desenvolvimento - Liberação de artefatos de maneira rápida e constante;
-
Operação - Não são favoráveis a mudança, pois introduzem riscos alterando a estabilidade;
-
-
O Desenvolvimento quebra a estabilidade da Operação;
-
A operação impede a implantação de um artefato do desenvolvimento.
-
O trabalho dos Devs e Ops são caixas-preta mutualmente;
Objetivos
-
Dev
eOps
compartilham objetivos e métricas; -
Envolver os dois times com o objetivo da implantação da aplicação;
-
Alcançar o cumprimento de prazos e o time to market;
-
Liberação de pequenas frações testadas exaustivamente;
-
Minimizar problemas da entrega e implantação;
-
Recuperação rápida em caso de falhas;
Práticas
-
Integração Contínua;
-
Qualidade Contínua;
-
Entrega Contínua;
-
Implantação Contínua;
-
Monitoramento Contínuo.
Resultado
-
Dev
eOps
trabalham juntos pra alcançar a estabilidade e rapidez das entregas; -
Processo de desenvolvimento estável e reproduzível;
-
Qualidade
DevSecOps
-
Segue os mesmos princípios que o
DevOps
-
Acrescenta verificações de segurança ao processo;
-
O Objetivo é encontrar vulnerabilidades em qualquer estágio do CDS;
ChatOps
-
Conversation-driven
-
Procedimentos são traduzidos em comandos;
-
Os comandos são orquestrados por um robô;
-
Comumente utilizado em ferramentas como
Slack
,HipChat
,IRC
; -
Utiliza um robô que monitorará as conversas(Hubot);
-
Os comandos executarão:
-
Ações, que serão traduzidos para procedimentos;
-
Ações, que trarão informações.
-
Benefícios Sociais
-
Aumenta a colaboração/integração no desenvolvimento do produto;
-
Aumenta o compatilhamento de informações;
-
Aumenta a visibilidade e monitoramento de pontos críticos;
-
Aumenta o conhecimento da equipe sobre o que está sendo desenvolvido;
Arquitetura de Software
GraphQL
-
É uma alternativa ao REST(Representational State Transfer);
-
Especificação criada e utilizada pelo Facebook;
-
Possui diversas implementações;
-
Passa a responsabilidade para o frontend.
Types
-
Representa uma entidade do sistema;
-
Geralmente mapeado a um Domínio/Modelo;
-
Onde serão listados todos os campos de uma entidade consumível;
-
É a
model
do HTTP.
Queries
-
Representa uma consulta aos tipos existentes;
-
Onde serão definidas as relações entre os
Types
; -
Cada
field
deve ser resolvido; -
Podem ser filtrados utilizando argumentos;
-
Query
→Field
→Resolver
-
Arquitetura de Soluções
Segurança
Habilidade de proteger informações, sistemas e ativos enquanto entrega valor ao negócio, enquanto se avalia e mitiga os riscos.
Custo Efetivo
Habilidade de executar sistemas e entregar valor ao negócio enquanto mantêm o custo-benefício.
Resiliência
The ability of a system to recover from infrastructure or service disruptions, dynamically acquire computing resources to meet demand, and mitigate disruptions such as misconfigurations or transient network issues.