Publicando uma api GO no Digital Ocean Kubernetes

booscaaa

Vinícius Boscardin

Posted on April 18, 2022

Publicando uma api GO no Digital Ocean Kubernetes

Fala galerinha, veremos aqui como realizar um deploy de uma api go no cluster de Kubernetes da Digital Ocean.

Kubernetes (K8s) é um produto Open Source utilizado para automatizar a implantação, o dimensionamento e o gerenciamento de aplicativos em contêiner.

Bora lá

Primeiramente precisamos ter uma api funcional com Dockerfile configurado, né? rsrs Se você não sabe como criar uma api Go acompanha a série de Clean Architecture com Golang no dev.to.

Container Registry

Com sua api pronta bora colocar ela em um Container Registry privado. Usaremos também o serviço da Digital Ocean.

Crie uma conta na Digital Ocean e vá ao menu de Container Registry.

Image description

Depois criaremos um token de acesso para utilizarmos na autenticação do command line.

Image description

Gere o token e guarde ele em um local seguro!

Feito isso, baixo o command line interface da Digital Ocean (doctl) aqui: https://docs.digitalocean.com/reference/doctl/how-to/install/

Com o doctl instalado bem bonitinho. Vamos logar no nosso container registry.

doctl auth init -t <access_token>
doctl registry login
Enter fullscreen mode Exit fullscreen mode

De volta na página do container registry, copie o endereço disponibilizado do repositório.

Image description
No terminal, na pasta da aplicação com o Dockerfile configurado rode:

docker build -t registry.digitalocean.com/booscaaa/clean-go .
docker push registry.digitalocean.com/booscaaa/clean-go
Enter fullscreen mode Exit fullscreen mode

E pronto! Sua imagem está disponível no container registry da Digital Ocean.

Image description

Kubernetes

Vamos criar nosso primeiro cluster de Kubernetes, para isso vamos em:

Image description

Image description

Siga as instruções do Getting Started:

Image description
E por fim aguarde o cluster terminar de ser criado.

Image description

Com o cluster criado, vamos autenticar nosso registry para que o kubectl consiga baixar a imagem sem nenhum problema.

doctl registry kubernetes-manifest | kubectl apply -f -

kubectl create secret generic do-registry --from-file=.dockerconfigjson=docker-config.json --type=kubernetes.io/dockerconfigjson
Enter fullscreen mode Exit fullscreen mode

Vamos criar um arquivo em kubernetes/api.yaml

apiVersion: v1
kind: Service
metadata:
  name: api
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000
  selector:
    app: api
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
spec:
  replicas: 4
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
      - name: api
        image: registry.digitalocean.com/booscaaa/clean-go
        resources:
          limits:
            memory: "128Mi"
            cpu: "100m"
        ports:
        - containerPort: 3000
Enter fullscreen mode Exit fullscreen mode

Para aplicar a alteração vamos rodar.

kubectl apply -f kubernetes/api.yaml
Enter fullscreen mode Exit fullscreen mode

Para ver o pod e os services rodando:

kubectl get pods
kubectl get services
Enter fullscreen mode Exit fullscreen mode

Image description

Image description

Instalando o Nginx Ingress

Nossa api ainda não tem acesso externo, para isso vamos configurar o Nginx ingress para kubernetes no arquivo kubernetes/ingress.yaml.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-ingress
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: api
            port:
              number: 80
Enter fullscreen mode Exit fullscreen mode

Para aplicar as alterações basta rodar:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.2/deploy/static/provider/cloud/deploy.yaml

kubectl apply -f kubernetes/ingress.yaml
Enter fullscreen mode Exit fullscreen mode

O que isso faz?

Isso acabou de criar um load balancer na Digital Ocean e expôs nossos services internos para a porta 80 do ip externo do load balancer.
Lembrando que os recursos a serem explorados com o Nginx Ingress são diversos. Um deles e muito útil é configurar o domínio/subdomínio da aplicação e, com o cert manager, gerar os certificados de SSL automaticamente.

Image description

E pronto. Api funcionado com o kubernetes!

Image description

💖 💪 🙅 🚩
booscaaa
Vinícius Boscardin

Posted on April 18, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related