Escalando aplicações com kubernetes
Hi Guys!
Nesse post irei explicar o básico que você precisa saber sobre kubernetes(k8s) para colocar uma aplicação no ar.
Tá mais oque e Kubernetes ?
Segundo a documentação oficial, O kubernetes é uma plataforma portátil, extensível e de código aberto para o gerenciamento de cargas de trabalho e serviços em contêineres, que facilita a configuração declarativa e a automação.

Basicamente e um orquestrado de containers.
A arquitetura do kubernetes
A documentação e bem completa, com ilustrações e explicações de todo o funcionamento do kubernetes e seus componentes. Irei te explicar o básico e de forma que fique fácil o entendimento.
PODS
POD é como uma maquina virtual, e possível inserir um ou mais containers dentro dele, sendo que seus recursos são compartilhado, geralmente cada pod só tem um container salve casos extraordinário.
Service
O service e responsável por controlar os pod, para garantir que sempre esteja disponível.
Deployment
Utilizando deployment, nos podemos especificar a quantidades de replicas que nossa aplicação vai possuir, podemos também definir os recursos que nossa aplicação necessita, testes para saber se aplicação esta pronta para uso entre outras coisas. De forma reduzida e bem simples e isso, agora irei disponibilizar um arquivo de manifesto que eu uso nesse blog e explicar cada parte dele.
kind: Namespace apiVersion: v1 metadata: name: blog labels: app: blog
Namespace
Para melhor organizar seus projetos em um clister kubernetes existe o conceito de namespace, que e usado para isolar cada projeto em sua respectiva namespace, como domínios.
apiVersion: v1 kind: Service metadata: name: blog-svc namespace: blog spec: type: ClusterIP selector: app: blog ports: - port: 80 targetPort: 9000
Service
Existe alguns tipos de service, esse e o clusterIp usado para exportar a porta da minha aplicação dentro do cluster, observe que em ports e declarado qual a porta de entrada e qual porta de saída, nesse exemplo o service recebe a request na porta 80 e redireciona para a porta 9000 que e a do nod.
apiVersion: apps/v1 kind: Deployment metadata: name: blog-deploy namespace: blog labels: app: blog spec: replicas: 1 selector: matchLabels: app: blog template: metadata: labels: app: blog spec: containers: - name: blog-image image: marianaalencar/sever_sistem_v1 imagePullPolicy: Always resources: requests: cpu: "120m" memory: 300Mi limits: cpu: "150m" memory: 400Mi ports: - containerPort: 9000 restartPolicy: Always
Deployment
O deployment e responsável por especificar quanta replicas(pod) sua aplicação terá, qual a image da aplicação, em qual porta a aplicação ira rodar alem dos requisitos mínimos e máximos da aplicação.
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: blog-hpa namespace: blog spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: blog-deploy minReplicas: 1 maxReplicas: 2 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 90
AutoScaling
Mais conhecido como HPA(Horizontal Pod Autoscaler) este serviço e responsável por realizar o escalamento horizontal da aplicação definido a quantidade mínima e máxima de pods e quando deve ser escalado.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: blog-ingress namespace: blog annotations: kubernetes.io/igress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / cert-manager.io/cluster-issuer: "letsencrypt" ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/proxy-body-size: 1m nginx.ingress.kubernetes.io/proxy-buffer-size: 8k nginx.ingress.kubernetes.io/proxy-read-timeout: "60" nginx.ingress.kubernetes.io/proxy-send-timeout: "60" spec: ingressClassName: nginx rules: - host: "globo.com" http: paths: - pathType: Prefix path: "/" backend: service: name: blog-svc port: number: 80
Ingress
O ingress e responsável por expor nossa aplicação para o mundo externo, neste exemplo usando o nginx. Ele gera um ip externo por onde nossa aplicação será acessada.
Por fim esse será nosso arquivo de manifesto.
kind: Namespace apiVersion: v1 metadata: name: blog labels: app: blog --- apiVersion: v1 kind: Service metadata: name: blog-svc namespace: blog spec: type: ClusterIP selector: app: blog ports: - port: 80 targetPort: 9000 --- apiVersion: apps/v1 kind: Deployment metadata: name: blog-deploy namespace: blog labels: app: blog spec: replicas: 1 selector: matchLabels: app: blog template: metadata: labels: app: blog spec: containers: - name: blog-image image: marianaalencar/sever_sistem_v1 imagePullPolicy: Always resources: requests: cpu: "120m" memory: 300Mi limits: cpu: "150m" memory: 400Mi ports: - containerPort: 9000 restartPolicy: Always --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: blog-hpa namespace: blog spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: blog-deploy minReplicas: 1 maxReplicas: 2 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 90 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: blog-ingress namespace: blog annotations: kubernetes.io/igress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / cert-manager.io/cluster-issuer: "letsencrypt" ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/proxy-body-size: 1m nginx.ingress.kubernetes.io/proxy-buffer-size: 8k nginx.ingress.kubernetes.io/proxy-read-timeout: "60" nginx.ingress.kubernetes.io/proxy-send-timeout: "60" spec: ingressClassName: nginx rules: - host: "globo.com" http: paths: - pathType: Prefix path: "/" backend: service: name: blog-svc port: number: 80
Espero que esse post tenha te ajudado a entender um pouco mais sobre o funcionamento do kubernetes. O kubernetes tem diversas funcionalidades e configurações, mais você como Dev não precisa saber de todas, mais no caso de precisar de algo especifico consulte a documentação
Abraço e ate a próxima..
Carregando comentários...