Publicando uma api GO no Digital Ocean Kubernetes
Tags: kubernetes, go, cloud, digitalocean
Published: 2022-04-18 22:30:18

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

[Kubernetes](https://kubernetes.io/) (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](https://dev.to/booscaaa/implementando-clean-architecture-com-golang-4n0a) 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](https://cloud.digitalocean.com/) e vá ao menu de Container Registry.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/99p8mt2hionopx617mnx.png)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dusqzr8envs82rulekib.png)

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.
```sh
doctl auth init -t <access_token>
doctl registry login
```
De volta na página do container registry, copie o endereço disponibilizado do repositório.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o4omrzpynz1fl52rrr6y.png)
No terminal, na pasta da aplicação com o Dockerfile configurado rode:

```sh
docker build -t registry.digitalocean.com/booscaaa/clean-go .
docker push registry.digitalocean.com/booscaaa/clean-go
```
E pronto! Sua imagem está disponível no container registry da Digital Ocean.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rgp1wcnfcar1tj26wi6o.png)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/63t2bra438nc9a7q9lsm.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8c6ux1mwh6jcblafgubv.png)

Siga as instruções do Getting Started:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r2qyc3ynr2s8pxkg4l4n.png)
E por fim aguarde o cluster terminar de ser criado.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xprexi0c8r7tch9v79rw.png)

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


```sh
doctl registry kubernetes-manifest | kubectl apply -f -

kubectl create secret generic do-registry --from-file=.dockerconfigjson=docker-config.json --type=kubernetes.io/dockerconfigjson
```

Vamos criar um arquivo em `kubernetes/api.yaml`
```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
```
Para aplicar a alteração vamos rodar.
```bash
kubectl apply -f kubernetes/api.yaml
```
Para ver o pod e os services rodando:
```bash
kubectl get pods
kubectl get services
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1dkkrony1befx9pzgbsz.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/43zk6dadf79q7ebf75yj.png)
# 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`.
```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
```
Para aplicar as alterações basta rodar:

```sh
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
```
## 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l4cdx0nax9as3k8bpvha.png)

E pronto. Api funcionado com o kubernetes!

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/svmzeo12gnrd2v00vldm.png)