diff --git "a/docs/source/pages/Kubernetes/Kubernetes - Otimiza\303\247\303\243o e Desempenho.md" "b/docs/source/pages/Kubernetes/Kubernetes - Otimiza\303\247\303\243o e Desempenho.md" index 5a12c5889febc6b0e712802d0b04566d2afd9890..8c0224c8069f3f5781552167165a9dae8961f97b 100644 --- "a/docs/source/pages/Kubernetes/Kubernetes - Otimiza\303\247\303\243o e Desempenho.md" +++ "b/docs/source/pages/Kubernetes/Kubernetes - Otimiza\303\247\303\243o e Desempenho.md" @@ -1,21 +1,5 @@ # Otimização e Desempenho -- [x] gerenciamento de memoria pra cada pod -- [ ] nao dar mt memoria pro superset pq so faz dashboard -- [ ] Mais memoria pro spark que vai processar dados -- [x] limitar memoria pros pods -- [ ] se o pod do spark comecar a consumir mais memoria e matar o processo do superset -> pq nao tem limite de memoria pro spark -- [ ] cpu -> + threads pra uns e menos pra outros - - [ ] ver se os valores default são suficientes - ---- - -- Competição por recursos entre pods pode causar instabilidade e baixo desempenho. -- **Solução:** Definir limites e solicitações para garantir uso eficiente e evitar contenção. -- Evita que pods não estejam desperdiçando recursos - ---- - ### **Problemas de Desempenho no Kubernetes** - **Alocação de Recursos:** Uma das principais causas de problemas de desempenho no Kubernetes. Se seus contêineres não tiverem CPU, memória ou outros recursos suficientes para executar suas tarefas, eles podem apresentar lentidão ou falhas. Da mesma forma, a superalocação de recursos pode levar ao desperdÃcio e à utilização ineficiente. O scheduler do Kubernetes gerencia seus recursos baseado nas requisições e limites que foram configurados. Se vc tem uma situação onde um dos seus nós está com poucos recursos e vc não configurou nenhuma requisição no container, o kubernetes vai procurar qual a quantidade de memoria por ex, que vc requisitou quanto vc esta usando e os containers e pods que tem o maior gap (diferença) entre o que vc requisitoiu e o que vc está usando, eles são os que tem a maior possibilidade de serem mortos para liberar capacidade em um nó, que está sem capacidade. Então em um ambiente “não saudável†em que vc nao seta requests e limits, então o kubernetes pode acabar matando conteiners importantes para liberar espaço para outros. @@ -110,10 +94,6 @@ Esta **ResourceQuota** limita a quantidade total de memória e CPU que todos os Sabemos que os requests e limits são cruciais para melhorar a performance, mas como podemos saber os valores ótimos? Para isso usamos **HPA** e **VPA**. - - - - ## Horizontal Pod Autoscaler (HPA) O HPA dimensiona automaticamente o número de réplicas de pods com base na utilização observada de CPU/memória ou métricas personalizadas, garantindo que a aplicação possa lidar com cargas variáveis. @@ -185,12 +165,12 @@ Adapta a aplicação para aproveitar de forma eficiente os recursos de hardware ### **Node affinity** -Node affinity is conceptually similar to `nodeSelector`, allowing you to constrain which nodes your Pod can be scheduled on based on node labels. There are two types of node affinity: +A afinidade de nó é conceitualmente semelhante ao `nodeSelector`, permitindo que você restrinja em quais nós seu Pod pode ser agendado com base nos rótulos (labels) dos nós. Existem dois tipos de afinidade de nó: -- `requiredDuringSchedulingIgnoredDuringExecution`: The scheduler can't schedule the Pod unless the rule is met. This functions like `nodeSelector`, but with a more expressive syntax. -- `preferredDuringSchedulingIgnoredDuringExecution`: The scheduler tries to find a node that meets the rule. If a matching node is not available, the scheduler still schedules the Pod. +- `requiredDuringSchedulingIgnoredDuringExecution`: O agendador **não consegue agendar o Pod** a menos que a regra seja atendida. Funciona como o `nodeSelector`, mas com uma sintaxe mais expressiva. +- `preferredDuringSchedulingIgnoredDuringExecution`: O agendador **tenta encontrar** um nó que atenda à regra. Se não houver um nó correspondente disponÃvel, o agendador ainda assim agenda o Pod. -### PodAffinity +### Pod Affinity Pode ser usado para especificar que pods que se comunicam ou compartilham recursos rodem no mesmo nó. @@ -231,11 +211,11 @@ spec: topologyKey: topology.kubernetes.io/zone ``` -The node affinity rule specifies that this particular pod will only run on nodes that have the GPU label. +A regra de afinidade de nó especifica que este Pod em particular só será executado em nós que tenham o rótulo de GPU. -The pod affinity rule specifies that the scheduler is allowed to place the example Pod on a node only if that node belongs to a specific [zone](https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/) where other Pods have been labeled with `security=S1`. +A regra de afinidade de Pod especifica que o agendador está autorizado a posicionar o Pod de exemplo em um nó **somente se** esse nó pertencer a uma [zona](https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/) especÃfica onde outros Pods tenham sido rotulados com `security=S1`. -The pod anti-affinity rule specifies that the scheduler should try to avoid scheduling the Pod on a node if that node belongs to a specific [zone](https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/) where other Pods have been labeled with `security=S2`. +A regra de anti-afinidade de Pod especifica que o agendador deve **tentar evitar** agendar o Pod em um nó se esse nó pertencer a uma [zona](https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/) especÃfica onde outros Pods tenham sido rotulados com `security=S2`. ## Otimização de Armazenamento @@ -285,117 +265,4 @@ Utilize `kubectl get pods`, `kubectl describe pods` e ferramentas de monitoramen - **Uso Eficiente de Recursos:** Garante que os recursos sejam utilizados de forma eficiente, reduzindo custos e melhorando o desempenho. - **Escalabilidade:** Ajusta automaticamente as aplicações para lidar com cargas variáveis. - **Alto Desempenho:** Otimiza o desempenho das aplicações e do cluster Kubernetes. -- **Monitoramento Proativo:** Identifica e resolve problemas de desempenho antes que afetem os usuários. - -## Minio com storage dinâmico do Ceph - -**Dynamic provisioning** é um recurso do Kubernetes que permite que volumes de armazenamento sejam criados automaticamente sob demanda, em vez de serem predefinidos manualmente. - -O storage dinâmico é usado para integrar o Ceph como backend de armazenamento para MinIO em ambientes Kubernetes. - -### Como funciona: - -1. **Configuração do Ceph como StorageClass**: - - Um **StorageClass** é definido no Kubernetes para o Ceph, usando provisionadores como **RBD** (RADOS Block Device) ou **CephFS**. - - Ele especifica as propriedades do armazenamento, como replicação, tamanho do volume e tipo de acesso. -2. **Criação de PVCs (PersistentVolumeClaims)**: - - As aplicações, incluindo MinIO, solicitam armazenamento criando PVCs. - - O provisionador dinâmico do Ceph cria automaticamente PersistentVolumes (PVs) com base nesses PVCs. -3. **Uso em MinIO**: - - O MinIO é implantado como um serviço no Kubernetes, utilizando os volumes provisionados dinamicamente pelo Ceph para armazenar os dados de objetos. - -kubectl delete deployment utility-api - -## Apresentação - -Não dar mt memoria pro superset pq so faz dashboard - -Mais memoria pro spark que vai processar dados - -E se o pod do spark comecar a consumir mais memoria e matar o processo do superset - -Uma vez que nao tem limite de memoria pro spark - -### REQ - -- Mostra arquivo `resources-demo-pod.yaml` , o carregamento, primeiro requisição dps limite -- REQ: cpu=1 , mem=14Gi -- `kubectl get nodes` -- `kubectl describe node local-cluster` -- Allocatable = 12Gb e 8 CPU -- mas pedimos 14, não deveria ser alocado a nenhum nó, vamos tentar -- `kubectl apply -f resource-management/resources-demo-pod.yaml` -- `kubectl get pods` -- status pending -- troca pra 2Gi -- `kubectl delete -f resource-management/resources-demo-pod.yaml` -- `kubectl apply -f resource-management/resources-demo-pod.yaml` -- `kubectl get pods -o wide` -- `kubectl delete -f resource-management/resources-demo-pod.yaml` - -### LIMITS - -- Esse pod pode usar quanta memória ele quiser, mas se tiver outros pods rodando na CPU, eles serão impactados por esse uso ilimitado -- mostra que da pra configurar limite tb -- SÓ MOSTRA NAO FAZ NADA -- LIM: cpu=1 , mem=3Gi -- muda a carga pra 4Gi -- Out of Memory Killed -- se o pod usa mais que o limite, ele é reiniciado - -### RESOURCE QUOTA - -- mostra arquivo -- `kubectl apply -f resource-management/resource-quota-demo.yaml` -- funciona pro namespace q esse resource-quota sera criado - - o maximo q pode pedir é o limite do resourcequota -- `kubectl apply -f resource-management/resources-demo-pod.yaml` -- não deu pq pediu mais que o maximo -- `kubectl delete resourcequota resource-quota` -- `kubectl delete pod resources-demo` -- Dps coloca 100Mi no memoria do pod - -### HPA - -- api utility pra gerar carregamento na cpu -- deployment tem 2 replicas -- service acessa a api -- `hpa.yaml` tem min=1 e max=5 replicas -- significa que vai escalar para um max de 5 replicas quando o uso da CPU atingir 70% -- `cd autoscaling` -- `kubectl apply -f deployment.yaml` -- `kubectl apply -f service.yaml` -- `kubectl apply -f hpa.yaml` -- `kubectl get pods` -- tem 4 replicas, o uso está acima de 70% -- se tiver menos manda um `kubectl get hpa` -- `kubectl describe hpa` - -### VPA - -- `kubectl apply -f vpa.yaml` -- `kubectl get vpa utility-api` -- `kubectl describe vpa utility-api` -- lower = estimativa minima de recursos pro container -- upper = maximo -- == requests e limits -- essa é a recomendação - -### Cluster Autoscaler - -Não da pra mostrar no minikube - -### BenefÃcios - -- **Uso Eficiente de Recursos**, reduzindo custos e melhorando o desempenho -- **Escalabilidade**, para lidar com cargas variáveis -- **Alto** **Desempenho**, otimizando as aplicações e do cluster -- **Monitoramento Proativo**, resolve problemas antes de afetar a aplicação - -### Affinity - -**afinidade de nós**: em quais nós o Pod pode ser agendado com base em rótulos dos nós. - -**afinidade de pod**: especificar que pods que se comunicam ou compartilham recursos rodem no mesmo nó. Só em um nó que participa de uma zona onde os pods foram nomeados S1 - -Adapta a aplicação para aproveitar de forma eficiente os recursos de hardware necessários ao seu funcionamento. \ No newline at end of file +- **Monitoramento Proativo:** Identifica e resolve problemas de desempenho antes que afetem os usuários. \ No newline at end of file