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.

meme nazare

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...