Kubernetes é uma plataforma de orquestração de containers que automatiza o processo de implantar, gerenciar e escalar aplicações em containers. Containers encapsulam aplicações e suas dependências, tornando-as portáteis e consistentes, e o Kubernetes facilita a organização e execução desses containers em um ambiente distribuído.
1- Pod: A menor unidade executável no Kubernetes. Um pod pode conter um ou mais containers que compartilham o mesmo armazenamento e rede. Containers em um pod são sempre executados juntos e, normalmente, trabalham de forma colaborativa.
2- Service: Define um endpoint estável (IP ou nome DNS) para um conjunto de pods, permitindo que eles sejam acessados por outras partes do sistema (internamente ou externamente). Isso é importante porque os pods podem ser recriados e substituídos, mudando seu endereço IP.
3- Deployment: Gerencia o ciclo de vida dos pods, facilitando a criação e o gerenciamento de múltiplas réplicas de pods. Permite escalonamento, atualizações, rollbacks (reverter para uma versão anterior) e monitoramento do status das implantações.
4- ReplicaSet: Garante que um número específico de réplicas de um pod estejam rodando em um determinado momento. Ele é gerenciado pelo Deployment, que mantém o controle das réplicas para garantir a alta disponibilidade.
5- ConfigMap: Fornece configuração externa para os pods, permitindo que você armazene dados de configuração separados da imagem do container.
6- Secret: Armazena dados sensíveis, como senhas, tokens ou chaves de criptografia, e os disponibiliza de forma segura para os pods.
7- Namespace: Um mecanismo de isolamento dentro de um cluster, permitindo que múltiplos grupos ou projetos usem o mesmo cluster sem interferir uns nos outros. Isso facilita o gerenciamento de recursos e controle de acesso.
8- Ingress: Gerencia o acesso externo ao cluster Kubernetes, fornecendo regras de roteamento para expor serviços para fora do cluster.
9- PersistentVolume (PV) e PersistentVolumeClaim (PVC): Fornecem mecanismos para armazenamento persistente. Os pods podem usar esses volumes para armazenar dados que precisam sobreviver a reinicializações.
Minikube é uma ferramenta que permite criar e executar um cluster Kubernetes local em uma única máquina. Ele é especialmente útil para desenvolvimento e testes, oferecendo uma maneira rápida de experimentar com Kubernetes sem a necessidade de configurar um cluster completo em servidores remotos ou na nuvem.
Para esse projeto, usamos a virtualização em containers (via drivers como Docker). Isso isola o Kubernetes do ambiente local.
Minikube configura um cluster de Kubernetes de nó único, o que significa que tudo roda na mesma máquina. Embora não seja adequado para produção, ele oferece todos os componentes necessários para testar e simular um cluster Kubernetes real.
-
Instalação: Baixar e instalar Minikube de acordo com o sistema operacional. Também é necessário um hipervisor ou Docker para virtualização.
-
Iniciar o Cluster: Executar minikube start, que irá inicializar o cluster Kubernetes local em uma VM ou contêiner.
-
Acessar o Cluster: Você pode interagir com o cluster Kubernetes usando o kubectl (a ferramenta de linha de comando para Kubernetes) para criar pods, services, e outros recursos.
-
Parar ou Deletar: Quando terminar de usar, você pode parar o cluster com minikube stop ou deletá-lo com minikube delete.
kubectl é a ferramenta de linha de comando para interagir e gerenciar clusters Kubernetes. Ele permite que você execute comandos para implantar, inspecionar, modificar e gerenciar recursos dentro do cluster Kubernetes. Essencialmente, kubectl é a interface principal para os desenvolvedores e administradores controlarem o comportamento de um cluster Kubernetes.
-
Instalação Para instalar o kubectl, você pode seguir as instruções da documentação oficial do Kubernetes. A instalação varia de acordo com o sistema operacional (Linux, macOS, Windows).
-
Verificando o status do cluster Comando: kubectl cluster-info Descrição: Verifica o status geral do cluster e seus principais componentes.
-
Listar recursos Comando: kubectl get Exemplo: kubectl get pods Exemplo: kubectl get services Descrição: Exibe uma lista de recursos existentes no cluster. Você pode listar pods, serviços, namespaces, nodes, etc. Exemplo: kubectl get pods lista todos os pods rodando no cluster.
-
Criar um recurso a partir de um arquivo YAML Comando: kubectl apply -f <arquivo.yaml> Exemplo: kubectl apply -f deployment.yaml Descrição: Cria ou atualiza um recurso Kubernetes com base em um arquivo de configuração YAML. Arquivos YAML definem o estado desejado do recurso (pod, deployment, service, etc.).
-
Ver detalhes de um recurso específico Comando: kubectl describe Exemplo: kubectl describe pod nginx-pod Descrição: Fornece detalhes mais completos sobre um recurso específico, como eventos recentes, configurações e status.
-
Excluir um recurso Comando: kubectl delete Exemplo: kubectl delete pod nginx-pod Descrição: Remove o recurso especificado do cluster.
-
Escalar um Deployment Comando: kubectl scale deployment --replicas= Exemplo: kubectl scale deployment nginx-deployment --replicas=3 Descrição: Escala um deployment, ajustando o número de réplicas de pods.
-
Monitorar logs de um pod Comando: kubectl logs Exemplo: kubectl logs nginx-pod Descrição: Exibe os logs gerados por um pod em execução.
-
Acessar um pod via linha de comando (execução interativa) Comando: kubectl exec -it -- /bin/bash Exemplo: kubectl exec -it nginx-pod -- /bin/bash Descrição: Inicia um shell interativo dentro de um container em um pod.
-
Aplicar alterações em um recurso Comando: kubectl apply -f <arquivo.yaml> Exemplo: kubectl apply -f updated-deployment.yaml Descrição: Aplica mudanças a um recurso existente com base nas configurações do arquivo YAML fornecido.
-
Obter informações detalhadas de um pod ou outro recurso em formato YAML Comando: kubectl get -o yaml Exemplo: kubectl get pod nginx-pod -o yaml Descrição: Mostra os detalhes do recurso em formato YAML, útil para revisar configurações e estado.
O kubernetes, como gerenciador de containers, precisa da imagem do código para executar nos cluster. para isso temos algumas pastas com o código fonte do executável. para configurar basta segguir os seguintes passos:
Antes de qualquer coisa é importante configurar o docker par ambiente local com:
eval $(minikube docker-env)
caso use docker-desktop:
$ unset DOCKER_HOST
$ kubectl config current-context
Em cada pasta (omp, mip, spark, elastic_search, socket_server, client) executar:
$ docker build -t "nome_da_image" .
obs: "nome_da_imagem" de ter o mesmo nome contino na "image" do .yml:
exemplo:
apiVersion: apps/v1
kind: Deployment
metadata:
name: jogodavida-omp
spec:
replicas: 2
selector:
matchLabels:
app: jogodavida-omp
template:
metadata:
labels:
app: jogodavida-omp
spec:
containers:
- name: openmp-container
image: omp-pspd
imagePullPolicy: Never
ports:
- containerPort: 30005
command: ["/app/jogo_da_vida_omp"]
Para criar o cluster recomendamos usar o "minikube" com o comando:
$ minikube start
$ minikube addons enable ingress
Um cluster kubernetes deve ser criado depois de alguns minutos com o nome "minikube".
Os comandos com kubectl deve começar a funcionar.
$ kubectl apply -f pod.yml
o pod.yml é um compilado com todos os .yml
se isso não funcionar, dar apply em cada .yml separadamente.
Para verificar estado dos pods você pode dar o comando:
kubectl get pods
ou
kubectl get pods -n my-app
caso tenha definido um namespace
Se tudo estiver funcionando o próximo passo e descobrir a porta que ingress abriu para conectar com os pods do seu cluster. Para isso, basta rodar o comando:
$ minikube service socket-service --url
$ minikube service client --url
isso deve mostrar a porta ussadas pelo kubernetes. A ultima porta listada é do socket.
Na pasta client, o index.html tem uma fun,ão para conectar no endereço do socket. substitua ela para poder conectar:
const socket = new WebSocket('ws://127.0.0.1:?????/');
let isConnectedToServer = false;
Se tudo estiver funcionado perfeitamente, é so enviar as mensagens para o servidor socker_server.
O comando minikube dashboard irá abrir uma dashboard no navegador que você pode analisar e testar a performance.
Complemento de: