Workshop Microservices
Distribuindo os microservices com
Docker e Kubernetes
Objetivos
Ao final desta unidade você irá:
• Compreender como empacotar os projetos de micro
services com Docker
• Publicar imagens em repositórios Docker
• Compor um grupo de imagens Docker em uma
arquitetura de microservices com Docker Compose
• Orquestrar a arquitetura de microservices com
Kubernetes
Agenda
• Containers
• Docker
• Docker Registry
• Docker Compose
• Kubernetes
Deployment
Deployment
• Multiple services per host
Deployment
• Service instances per VM
Deployment
• Service instances per Container
Containers vs Virtualization
Virtualization Container
• Minutos para iniciar uma VM, e… segundos para iniciar um
container
Docker
Docker engine Docker Hub
“Open platform for building, shipping and
running distributed applications"
Docker
• Versão
• Community Edition (CE) - Free
• Enterprise Edition (EE) - Pago
• Basic, Standard, Advanced
• https://www.docker.com/pricing
Docker
• Instalação
• Native
• Windows
• https://docs.docker.com/docker-for-windows/install/
• Mac
• https://docs.docker.com/docker-for-mac/install/
• Ubuntu / Debian / Fedora
• https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/
• https://docs.docker.com/engine/installation/linux/docker-ce/debian/
• https://docs.docker.com/engine/installation/linux/docker-ce/fedora/
• Toolbox
• Windows
• https://docs.docker.com/toolbox/toolbox_install_windows/
• Mac
• https://docs.docker.com/toolbox/toolbox_install_mac/
Docker
Docker
• Principais comandos
• docker run
• Roda um determinado container
• docker build
• Constrói novas imagens a partir de um Dockerfile
• docker ps
• Lista todos os containers em execução
• docker start
• Inicia um determinado container já executado anteriormente
• docker stop
• Finaliza um container em execução
• docker rm
• Remove um determinado container da máquina
Docker
• Principais comandos
• docker rmi
• Remove uma determinada image da máquina
• docker tag
• Cria uma tag para uma determinada imagem
• docker login
• Realiza uma sessão de login em um determinado Docker repo privado
• docker pull
• Busca uma imagem pré-construído de um Docker repo publico
• docker logs
• Verifica os logs de execução de um determinado container
• docker commit
• Salva o estado de um container como uma imagem
Docker
• Principais comandos
• docker diff
• Lista as mudanças em arquivos e diretórios
• docker images
• Lista todas as imagens disponíveis no Docker repo local
• docker inspect
• Inspeciona informações sobre containers e imagens
• docker attach
• Interage com containers em execução
• docker kill
• Finaliza o processo de execução de um determinado container
Dockerfile
# Use an official Python runtime as a parent image
FROM python:2.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
Docker
• Exemplo de utilização
• docker build -t friendlyhello.
• docker images
REPOSITORY TAG IMAGE ID
friendlyhello latest 326387cea398
• docker run -p 4000:80 friendlyhello
• docker run -d -p 4000:80 friendlyhello
• docker ps
CONTAINER ID IMAGE COMMAND CREATED
1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
• docker stop 1fa4ab2cf395
• docker rm 1fa4ab2cf395
• docker rmi friendlyhello
Docker
• Integração com Maven
• docker-maven-plugin (Spotify)
• https://github.com/spotify/docker-maven-plugin
• mvn clean package docker:build
• mvn … docker:build -DpushImageTags -DdockerImageTags=latest
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>${project.groupId}/${project.artifactId}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
Laboratório 1 (docker-lab01)
• Empacote os projetos de microservices com
Docker
Docker Registry
Docker Registry
Nexus
• Repositório de artefatos opensource
• Maven, Bower, Npm, Rubygems, Pypl, Nuget, Docker
• Popularmente utilizado para projetos Maven
• Fornece uma interface Web de administração
• Suporta repositórios Docker
• A partir da versão 3.x
Nexus
Docker Registry
• Exemplo de push de imagens no Nexus
• docker build -t friendlyhello.
• docker login -u user -p pass nexus-ip:8081
Login Succeeded
• docker tag friendlyhello nexus-ip:8081/friendlyhello
• docker push nexus-ip:8081/friendlyhello
The push refers to a repository [nexus-ip:18081/friendlyhello]
2261473fba2b: Preparing
ce6c8756685b: Waiting
2261473fba2b: Pushed
qa: digest: sha256:f64205d492c2f3b15a1b6c146b36e493ec764c7e2cc330 size: 2424
Docker Registry
• Exemplo de pull de imagens no Nexus
• docker login -u user -p pass nexus-ip:8081
Login Succeeded
• docker pull nexus-ip:8081/friendlyhello
latest: Pulling from amazonlinux
8e3fa21c4cc4: Pull complete
Digest:
sha256:59895a93ba4345e238926c0f4f4a3969b1ec5aa0a291a182816a4630c62df769
• docker run -d -p 4000:80 friendlyhello
• docker ps
CONTAINER ID IMAGE COMMAND CREATED
1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
Laboratório 2 (docker-lab02)
• Publique as imagens Docker dos microservices
no Nexus
Docker Compose
• Define um agrupamento de containers em uma única
definição
• Configuração centralizada em um único arquivo
• docker-compose.yml
• Define dependências entre containers
• Fornece mecanismo de service discovery
• Embedded Docker DNS
• Permite mapear
• Portas, volumes, variáveis, etc
Docker Compose
• docker-compose.yml
Docker Compose
Docker Compose
• Principais comandos
• docker-compose pull
• Buscar a lista de images definidas pela composição em um repo
público
• docker-compose logs
• Verificar os logs de execução dos containers definidos na
composição
• docker-compose build
• Construir as imagens definidas pela composição
• docker-compose up
• Criar e iniciar os containers definidos pela composição
• docker-compose down
• Destruir os containers definidos pela composição
Docker Compose
• Principais comandos
• docker-compose start
• Iniciar os containers definidos pela composição
• docker-compose stop
• Parar os containers definidos pela composição
• docker-compose restart
• Reiniciar os containers definidos pela composição
• docker-compose run
• Rodar um comando em um serviço definido pela composição
• docker-compose exec
• Rodar um comando em um container em execução
• docker-compose kill
• Finalizar um container em execução definido pela composição
Microservices Compose
Microservices Compose
version: '2'
services:
config-server:
image: microservices/config-server:latest
mem_limit: 1073741824 # RAM 1GB
environment:
- SPRING_PROFILES_ACTIVE=${PROFILE}
expose:
- "8888"
ports:
- "8888:8888"
networks:
- microservices
eureka-server:
image: microservices/eureka-server:latest
mem_limit: 1073741824 # RAM 1GB
environment:
- SPRING_PROFILES_ACTIVE=${PROFILE}
links:
- config-server
expose:
- "8761"
ports:
- "8761:8761"
networks:
- microservices
...
• docker-compose up
• docker-compose stop
• docker-compose start
• docker-compose down
Laboratório 3 (docker-lab03)
• Componha a arquitetura de microservices
utilizando Docker Compose
Orquestração
• Gerenciamento da comunicação dos serviços em containers
diferentes
Ferramentas
AWS ECS
Kubernetes
• Ferramenta para orquestração de containers
• Suporta múltiplos ambientes cloud
• É possível rodar localmente
• Suporta múltiplos containers runtime
• 100% open source, escrito em Go
• Eficiente, Portável, Extensível, …
Kubernetes
• High-level Overview
Kubernetes
• Clustering Model
Kubernetes
• Instalação Local
• VirtualBox
• https://www.virtualbox.org/wiki/Downloads
• Vagrant
• https://www.vagrantup.com/
• Minikube
• https://github.com/kubernetes/minikube
• Kubeclt
• https://kubernetes.io/docs/tasks/tools/install-kubectl/
• Outras alternativas
• https://kubernetes.io/docs/setup/pick-right-solution/
Vagrant
• Permite a criação de ambientes de desenvolvimento, automatizando
a geração de máquina virtual
• VMs são criadas a partir de imagens denominadas Boxes
• Suporta VirtualBox, VMWare, Hyper-V e outros
• Instalação e download
• https://www.vagrantup.com/downloads.html
• Principais comandos
• vagrant init [box]
• vagrant up
• vagrant halt
• vagrant destroy
• vagrant reload
• vagrant ssh
• vagrant status
Minikube
• Uma opção para rodar Kubernetes localmente
• https://github.com/kubernetes/minikube
• Principais comandos
• minikube start
• Cria e inicia o Kubernetes cluster
• minikube stop
• Desliga o Kubernetes cluster
• minikube dashboard
• Acessa o Kubernetes dashboard
• minikube ssh -v 7
• Acesso via SSH no Kubernetes cluster
• minikube service [name]
• Acessa um serviço disponibilizado pelo Kubernetes cluster
• minikube ip
• Verifica o ip de acesso para o Kubernetes cluster
Minikube Dashboard
Kubectl CLI
• Utilitário para executar comandos no Kubernetes cluster
• https://kubernetes.io/docs/user-guide/kubectl-overview/
• Principais comandos
• kubectl get pods / deployments
• kubectl create -f [filename]
• kubectl run [name] —image=[imagename]
• kubectl logs [name]
• kubectl update [name]
• kubectl delete [name]
• kubectl resize
• kubectl expose
• kubectl describe
Laboratório 4 (docker-lab04)
• Realize a instalação do Kubernetes cluster na sua
máquina local
Kubernetes
• Pods
• Representa um container em
execução
• Pode agrupar múltiplos containers
• Define um host lógico no
cluster
• Cada Pod recebe um IP
• Evita o conflito de portas
• Comunicam-se entre si sem
precisar de NAT
10.1.2.0/24
10.1.1.0/24
10.1.1.211 10.1.1.2
10.1.2.106
10.1.3.0/24
10.1.3.4510.1.3.17
10.1.3.0/24
Kubernetes
• Pods
• Para rodar um Pod
• kubectl run app --image=app/image --port=8080
• kubectl create -f pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: wildfly-pod
labels:
name: wildfly-pod
spec:
containers:
- name: wildfly
image: jboss/wildfly:10.1.0.Final
ports:
- containerPort: 8080
pod.yaml
Kubernetes
• Services
• Um agrupamento lógico de Pods que
realizam uma mesma função
• Define o conceito de load balancer
• A escolha do Pod é randômica mas
suporta afinidade por session
• Stick session
• Disponibiliza um IP e porta virtual
• Também um DNS name
Client
Pod
Container
Pod
Container
Pod
ContainerContainer
Service
Label	selector:
type	=	FE
VIP
type	=	FE type	=	FE type	=	FE
Kubernetes
• Services
• Para criar um novo Service
• kubectl expose [type] —name=[name] 
--port=[port] —target-port=[port]
• kubectl create -f service.yaml
apiVersion: v1
kind: Service
metadata:
name: wildfly-service
spec:
selector:
app: wildfly-rc-pod
ports:
- name: web
port: 8080
service.yaml
Kubernetes
• Labels
• Simples definição de key=value
• Pode ser associado a qualquer componente
• Pods, Replication Controllers, Services, Deployment, …
• Ajuda no processo de organização do cluster
• Utilizado em conjunto com selectors
• Exemplos
• release=stable, release=canary
• environment=dev, environment=qa
Kubernetes
• Replication Controlles
• Configura o número de réplicas de um determinado pod
• Assegura que um número desejado de pods encontram-se
em execução
• Pode ter a execução agendada
• Suporta configuração por definição de label
• Replica Sets
• Nova geração de Replication Controllers
Replication	
Controller
Pod
Pod
frontend
Pod
frontend
Pod Pod
Replication	
Controller
#pods	=	1
version	=	v2
show:	version	=	v2
version=	v1 version	=	v1 version	=	v2
Replication	
Controller
#pods	=	2
version	=	v1
Kubernetes
• Replication Controlles
• Para criar um novo Replication Controller
• kubectl create -f replication.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: wildfly-rc
spec:
replicas: 2
selector:
app: wildfly-rc-pod
template:
metadata:
labels:
app: wildfly-rc-pod
spec:
containers:
- name: wildfly
image: jboss/wildfly:10.1.0.Final
ports:
- containerPort: 8080
replication.yaml
Kubernetes
• Deployments
• Controla o process de atualização de pods
• Inicia / reinicia um replication controller
• Verifique o status do deployment
• Green ou Red
• Atualiza o deployment para utilizar uma
nova imagem
• Zero offline
• Rollback para uma versão anterior
...
Kubernetes
• Deployments
• Para definir um novo deployment
• kubectl create -f deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: wildfly-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: wildfly
spec:
containers:
- name: wildfly
image: jboss/wildfly:10.1.0.Final
ports:
- containerPort: 8080
deployment.yaml
Kubernetes
• Jobs
• Define um processo de execução finito (início e fim)
• Cria um ou mais pods e assegura que eles executaram
com sucesso até o final
• Define dois tipos de jobs
• Nonparallel (1 pod) e parallel (N pods)
• Suporta a definição de um Cron job
• Time-based jobs
• Ainda encontra-se em versão Beta
Kubernetes
• Jobs
• Para criar um novo Job
• kubectl create -f job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: wait
spec:
template:
metadata:
name: wait
spec:
containers:
- name: wait
image: ubuntu
command: ["sleep", "20"]
restartPolicy: Never
job.yaml
Auto Scaling
• Capacidade de aumentar e diminuir a escalabilidade
automaticamente
Kubernetes
• Auto-scaling
• Oferece suporte à auto-scaling (scale in/out)
• Pode ser definido métricas de monitoramento
• CPU, Memória, Rede, I/O, …
Kubernetes
• Auto-scaling
• Para configurar suporte ao auto-scaling
• kubectl run wildfly-server 
--image=jboss/wildfly:10.1.0.Final 
--requests=cpu=500m,memory=1024M 
--expose --port=8080
• kubectl autoscale deployment wildfly-server 
--cpu-percent=50 --min=2 --max=10
Laboratório 5 (docker-lab05)
• Orquestre o deployment da arquitetura de
microservices com Kubernetes
Conclusões
• Containers são ótimas alternativas para microservices
• Docker é a tecnologia mais utilizada atualmente para
criação de containers
• Containers necessitam de orquestração
• Kubernetes oferece um ambiente para orquestração de
containers
• Suporte autoscaling, práticas de deployment, gestão de
execução, etc…
• Microservices = Docker + Kubernetes ;)
Revisão
Nessa unidade você teve a oportunidade de:
• Compreender como empacotar os projetos de micro
services com Docker
• Publicar imagens em repositórios Docker
• Compor um grupo de imagens Docker em uma
arquitetura de microservices com Docker Compose
• Orquestrar a arquitetura de microservices com
Kubernetes
Referências
• https://docs.docker.com/samples/
• http://www.sonatype.org/nexus/
• https://docs.docker.com/compose/
• https://docs.docker.com/compose/startup-order/
• https://github.com/jwilder/dockerize
• https://github.com/kubernetes/minikube
• https://kubernetes.io/docs/user-guide/kubectl-overview/
• https://github.com/GoogleCloudPlatform/kubernetes-workshops
• https://github.com/christian-posta/docker-kubernetes-workshop
• https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
• https://github.com/kubernetes/kompose
• https://dzone.com/articles/microservices-with-kubernetes-and-docker
• https://fabric8.io/
• https://github.com/fabric8io/spring-cloud-kubernetes
• https://www.openshift.org/

Workshop Microservices - Distribuindo os Microservices com Docker e Kubernetes

  • 1.
    Workshop Microservices Distribuindo osmicroservices com Docker e Kubernetes
  • 2.
    Objetivos Ao final destaunidade você irá: • Compreender como empacotar os projetos de micro services com Docker • Publicar imagens em repositórios Docker • Compor um grupo de imagens Docker em uma arquitetura de microservices com Docker Compose • Orquestrar a arquitetura de microservices com Kubernetes
  • 3.
    Agenda • Containers • Docker •Docker Registry • Docker Compose • Kubernetes
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
    Containers vs Virtualization VirtualizationContainer • Minutos para iniciar uma VM, e… segundos para iniciar um container
  • 9.
    Docker Docker engine DockerHub “Open platform for building, shipping and running distributed applications"
  • 10.
    Docker • Versão • CommunityEdition (CE) - Free • Enterprise Edition (EE) - Pago • Basic, Standard, Advanced • https://www.docker.com/pricing
  • 11.
    Docker • Instalação • Native •Windows • https://docs.docker.com/docker-for-windows/install/ • Mac • https://docs.docker.com/docker-for-mac/install/ • Ubuntu / Debian / Fedora • https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/ • https://docs.docker.com/engine/installation/linux/docker-ce/debian/ • https://docs.docker.com/engine/installation/linux/docker-ce/fedora/ • Toolbox • Windows • https://docs.docker.com/toolbox/toolbox_install_windows/ • Mac • https://docs.docker.com/toolbox/toolbox_install_mac/
  • 12.
  • 13.
    Docker • Principais comandos •docker run • Roda um determinado container • docker build • Constrói novas imagens a partir de um Dockerfile • docker ps • Lista todos os containers em execução • docker start • Inicia um determinado container já executado anteriormente • docker stop • Finaliza um container em execução • docker rm • Remove um determinado container da máquina
  • 14.
    Docker • Principais comandos •docker rmi • Remove uma determinada image da máquina • docker tag • Cria uma tag para uma determinada imagem • docker login • Realiza uma sessão de login em um determinado Docker repo privado • docker pull • Busca uma imagem pré-construído de um Docker repo publico • docker logs • Verifica os logs de execução de um determinado container • docker commit • Salva o estado de um container como uma imagem
  • 15.
    Docker • Principais comandos •docker diff • Lista as mudanças em arquivos e diretórios • docker images • Lista todas as imagens disponíveis no Docker repo local • docker inspect • Inspeciona informações sobre containers e imagens • docker attach • Interage com containers em execução • docker kill • Finaliza o processo de execução de um determinado container
  • 16.
    Dockerfile # Use anofficial Python runtime as a parent image FROM python:2.7-slim # Set the working directory to /app WORKDIR /app # Copy the current directory contents into the container at /app ADD . /app # Install any needed packages specified in requirements.txt RUN pip install -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 # Define environment variable ENV NAME World # Run app.py when the container launches CMD ["python", "app.py"]
  • 17.
    Docker • Exemplo deutilização • docker build -t friendlyhello. • docker images REPOSITORY TAG IMAGE ID friendlyhello latest 326387cea398 • docker run -p 4000:80 friendlyhello • docker run -d -p 4000:80 friendlyhello • docker ps CONTAINER ID IMAGE COMMAND CREATED 1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago • docker stop 1fa4ab2cf395 • docker rm 1fa4ab2cf395 • docker rmi friendlyhello
  • 18.
    Docker • Integração comMaven • docker-maven-plugin (Spotify) • https://github.com/spotify/docker-maven-plugin • mvn clean package docker:build • mvn … docker:build -DpushImageTags -DdockerImageTags=latest <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <configuration> <imageName>${project.groupId}/${project.artifactId}</imageName> <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
  • 19.
    Laboratório 1 (docker-lab01) •Empacote os projetos de microservices com Docker
  • 20.
  • 21.
  • 22.
    Nexus • Repositório deartefatos opensource • Maven, Bower, Npm, Rubygems, Pypl, Nuget, Docker • Popularmente utilizado para projetos Maven • Fornece uma interface Web de administração • Suporta repositórios Docker • A partir da versão 3.x
  • 23.
  • 24.
    Docker Registry • Exemplode push de imagens no Nexus • docker build -t friendlyhello. • docker login -u user -p pass nexus-ip:8081 Login Succeeded • docker tag friendlyhello nexus-ip:8081/friendlyhello • docker push nexus-ip:8081/friendlyhello The push refers to a repository [nexus-ip:18081/friendlyhello] 2261473fba2b: Preparing ce6c8756685b: Waiting 2261473fba2b: Pushed qa: digest: sha256:f64205d492c2f3b15a1b6c146b36e493ec764c7e2cc330 size: 2424
  • 25.
    Docker Registry • Exemplode pull de imagens no Nexus • docker login -u user -p pass nexus-ip:8081 Login Succeeded • docker pull nexus-ip:8081/friendlyhello latest: Pulling from amazonlinux 8e3fa21c4cc4: Pull complete Digest: sha256:59895a93ba4345e238926c0f4f4a3969b1ec5aa0a291a182816a4630c62df769 • docker run -d -p 4000:80 friendlyhello • docker ps CONTAINER ID IMAGE COMMAND CREATED 1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
  • 26.
    Laboratório 2 (docker-lab02) •Publique as imagens Docker dos microservices no Nexus
  • 27.
    Docker Compose • Defineum agrupamento de containers em uma única definição • Configuração centralizada em um único arquivo • docker-compose.yml • Define dependências entre containers • Fornece mecanismo de service discovery • Embedded Docker DNS • Permite mapear • Portas, volumes, variáveis, etc
  • 28.
  • 29.
  • 30.
    Docker Compose • Principaiscomandos • docker-compose pull • Buscar a lista de images definidas pela composição em um repo público • docker-compose logs • Verificar os logs de execução dos containers definidos na composição • docker-compose build • Construir as imagens definidas pela composição • docker-compose up • Criar e iniciar os containers definidos pela composição • docker-compose down • Destruir os containers definidos pela composição
  • 31.
    Docker Compose • Principaiscomandos • docker-compose start • Iniciar os containers definidos pela composição • docker-compose stop • Parar os containers definidos pela composição • docker-compose restart • Reiniciar os containers definidos pela composição • docker-compose run • Rodar um comando em um serviço definido pela composição • docker-compose exec • Rodar um comando em um container em execução • docker-compose kill • Finalizar um container em execução definido pela composição
  • 32.
  • 33.
    Microservices Compose version: '2' services: config-server: image:microservices/config-server:latest mem_limit: 1073741824 # RAM 1GB environment: - SPRING_PROFILES_ACTIVE=${PROFILE} expose: - "8888" ports: - "8888:8888" networks: - microservices eureka-server: image: microservices/eureka-server:latest mem_limit: 1073741824 # RAM 1GB environment: - SPRING_PROFILES_ACTIVE=${PROFILE} links: - config-server expose: - "8761" ports: - "8761:8761" networks: - microservices ... • docker-compose up • docker-compose stop • docker-compose start • docker-compose down
  • 34.
    Laboratório 3 (docker-lab03) •Componha a arquitetura de microservices utilizando Docker Compose
  • 35.
    Orquestração • Gerenciamento dacomunicação dos serviços em containers diferentes
  • 36.
  • 37.
    Kubernetes • Ferramenta paraorquestração de containers • Suporta múltiplos ambientes cloud • É possível rodar localmente • Suporta múltiplos containers runtime • 100% open source, escrito em Go • Eficiente, Portável, Extensível, …
  • 38.
  • 39.
  • 40.
    Kubernetes • Instalação Local •VirtualBox • https://www.virtualbox.org/wiki/Downloads • Vagrant • https://www.vagrantup.com/ • Minikube • https://github.com/kubernetes/minikube • Kubeclt • https://kubernetes.io/docs/tasks/tools/install-kubectl/ • Outras alternativas • https://kubernetes.io/docs/setup/pick-right-solution/
  • 41.
    Vagrant • Permite acriação de ambientes de desenvolvimento, automatizando a geração de máquina virtual • VMs são criadas a partir de imagens denominadas Boxes • Suporta VirtualBox, VMWare, Hyper-V e outros • Instalação e download • https://www.vagrantup.com/downloads.html • Principais comandos • vagrant init [box] • vagrant up • vagrant halt • vagrant destroy • vagrant reload • vagrant ssh • vagrant status
  • 42.
    Minikube • Uma opçãopara rodar Kubernetes localmente • https://github.com/kubernetes/minikube • Principais comandos • minikube start • Cria e inicia o Kubernetes cluster • minikube stop • Desliga o Kubernetes cluster • minikube dashboard • Acessa o Kubernetes dashboard • minikube ssh -v 7 • Acesso via SSH no Kubernetes cluster • minikube service [name] • Acessa um serviço disponibilizado pelo Kubernetes cluster • minikube ip • Verifica o ip de acesso para o Kubernetes cluster
  • 43.
  • 44.
    Kubectl CLI • Utilitáriopara executar comandos no Kubernetes cluster • https://kubernetes.io/docs/user-guide/kubectl-overview/ • Principais comandos • kubectl get pods / deployments • kubectl create -f [filename] • kubectl run [name] —image=[imagename] • kubectl logs [name] • kubectl update [name] • kubectl delete [name] • kubectl resize • kubectl expose • kubectl describe
  • 45.
    Laboratório 4 (docker-lab04) •Realize a instalação do Kubernetes cluster na sua máquina local
  • 46.
    Kubernetes • Pods • Representaum container em execução • Pode agrupar múltiplos containers • Define um host lógico no cluster • Cada Pod recebe um IP • Evita o conflito de portas • Comunicam-se entre si sem precisar de NAT 10.1.2.0/24 10.1.1.0/24 10.1.1.211 10.1.1.2 10.1.2.106 10.1.3.0/24 10.1.3.4510.1.3.17 10.1.3.0/24
  • 47.
    Kubernetes • Pods • Pararodar um Pod • kubectl run app --image=app/image --port=8080 • kubectl create -f pod.yaml apiVersion: v1 kind: Pod metadata: name: wildfly-pod labels: name: wildfly-pod spec: containers: - name: wildfly image: jboss/wildfly:10.1.0.Final ports: - containerPort: 8080 pod.yaml
  • 48.
    Kubernetes • Services • Umagrupamento lógico de Pods que realizam uma mesma função • Define o conceito de load balancer • A escolha do Pod é randômica mas suporta afinidade por session • Stick session • Disponibiliza um IP e porta virtual • Também um DNS name Client Pod Container Pod Container Pod ContainerContainer Service Label selector: type = FE VIP type = FE type = FE type = FE
  • 49.
    Kubernetes • Services • Paracriar um novo Service • kubectl expose [type] —name=[name] --port=[port] —target-port=[port] • kubectl create -f service.yaml apiVersion: v1 kind: Service metadata: name: wildfly-service spec: selector: app: wildfly-rc-pod ports: - name: web port: 8080 service.yaml
  • 50.
    Kubernetes • Labels • Simplesdefinição de key=value • Pode ser associado a qualquer componente • Pods, Replication Controllers, Services, Deployment, … • Ajuda no processo de organização do cluster • Utilizado em conjunto com selectors • Exemplos • release=stable, release=canary • environment=dev, environment=qa
  • 51.
    Kubernetes • Replication Controlles •Configura o número de réplicas de um determinado pod • Assegura que um número desejado de pods encontram-se em execução • Pode ter a execução agendada • Suporta configuração por definição de label • Replica Sets • Nova geração de Replication Controllers Replication Controller Pod Pod frontend Pod frontend Pod Pod Replication Controller #pods = 1 version = v2 show: version = v2 version= v1 version = v1 version = v2 Replication Controller #pods = 2 version = v1
  • 52.
    Kubernetes • Replication Controlles •Para criar um novo Replication Controller • kubectl create -f replication.yaml apiVersion: v1 kind: ReplicationController metadata: name: wildfly-rc spec: replicas: 2 selector: app: wildfly-rc-pod template: metadata: labels: app: wildfly-rc-pod spec: containers: - name: wildfly image: jboss/wildfly:10.1.0.Final ports: - containerPort: 8080 replication.yaml
  • 53.
    Kubernetes • Deployments • Controlao process de atualização de pods • Inicia / reinicia um replication controller • Verifique o status do deployment • Green ou Red • Atualiza o deployment para utilizar uma nova imagem • Zero offline • Rollback para uma versão anterior ...
  • 54.
    Kubernetes • Deployments • Paradefinir um novo deployment • kubectl create -f deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: wildfly-deployment spec: replicas: 3 template: metadata: labels: app: wildfly spec: containers: - name: wildfly image: jboss/wildfly:10.1.0.Final ports: - containerPort: 8080 deployment.yaml
  • 55.
    Kubernetes • Jobs • Defineum processo de execução finito (início e fim) • Cria um ou mais pods e assegura que eles executaram com sucesso até o final • Define dois tipos de jobs • Nonparallel (1 pod) e parallel (N pods) • Suporta a definição de um Cron job • Time-based jobs • Ainda encontra-se em versão Beta
  • 56.
    Kubernetes • Jobs • Paracriar um novo Job • kubectl create -f job.yaml apiVersion: batch/v1 kind: Job metadata: name: wait spec: template: metadata: name: wait spec: containers: - name: wait image: ubuntu command: ["sleep", "20"] restartPolicy: Never job.yaml
  • 57.
    Auto Scaling • Capacidadede aumentar e diminuir a escalabilidade automaticamente
  • 58.
    Kubernetes • Auto-scaling • Oferecesuporte à auto-scaling (scale in/out) • Pode ser definido métricas de monitoramento • CPU, Memória, Rede, I/O, …
  • 59.
    Kubernetes • Auto-scaling • Paraconfigurar suporte ao auto-scaling • kubectl run wildfly-server --image=jboss/wildfly:10.1.0.Final --requests=cpu=500m,memory=1024M --expose --port=8080 • kubectl autoscale deployment wildfly-server --cpu-percent=50 --min=2 --max=10
  • 60.
    Laboratório 5 (docker-lab05) •Orquestre o deployment da arquitetura de microservices com Kubernetes
  • 61.
    Conclusões • Containers sãoótimas alternativas para microservices • Docker é a tecnologia mais utilizada atualmente para criação de containers • Containers necessitam de orquestração • Kubernetes oferece um ambiente para orquestração de containers • Suporte autoscaling, práticas de deployment, gestão de execução, etc… • Microservices = Docker + Kubernetes ;)
  • 62.
    Revisão Nessa unidade vocêteve a oportunidade de: • Compreender como empacotar os projetos de micro services com Docker • Publicar imagens em repositórios Docker • Compor um grupo de imagens Docker em uma arquitetura de microservices com Docker Compose • Orquestrar a arquitetura de microservices com Kubernetes
  • 63.
    Referências • https://docs.docker.com/samples/ • http://www.sonatype.org/nexus/ •https://docs.docker.com/compose/ • https://docs.docker.com/compose/startup-order/ • https://github.com/jwilder/dockerize • https://github.com/kubernetes/minikube • https://kubernetes.io/docs/user-guide/kubectl-overview/ • https://github.com/GoogleCloudPlatform/kubernetes-workshops • https://github.com/christian-posta/docker-kubernetes-workshop • https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/ • https://github.com/kubernetes/kompose • https://dzone.com/articles/microservices-with-kubernetes-and-docker • https://fabric8.io/ • https://github.com/fabric8io/spring-cloud-kubernetes • https://www.openshift.org/