Publicando uma api GO no Digital Ocean Kubernetes

Vinícius Boscardin - Apr 18 '22 - - Dev Community

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

. . . . . . . . . . .
Terabox Video Player