Usando secret tls para configurar https no kubernetes

Como configurar certificado https para  uma aplicação em um cluster Kubernetes?

Se você usa docker, mas nunca usou o Kubernetes (k8s). Então, você precisa conhecer :)
Dentre diversas vantagens em utilizar k8s, destaco a facilidade em ter uma aplicação sempre disponível, facilidade em recuperação nos casos de falhas e até mesmo, a simplicidade em ter uma aplicação escalando horizontal e verticalmente para atender a demanda no exato momento em que existe a necessidade.

É muito comum utilizar um cluster k8s para criar arquiteturas baseadas em micro serviços, onde, geralmente, temos um gateway exposto, fornecendo acesso a serviços e APIs que executam dentro da rede do cluster. Mas também é possível ter aplicações web ou scheduled jobs rodando nesse cluster. E em alguns momentos, como no caso de um gateway ou de uma aplicação web, queremos oferecer acesso externo a aplicação que está rodando dentro do cluster. E é ai que tratamos o assunto desse post!

Algo importante: Estou partindo da premissa de que você já tem o Ingress configurado e possui um endereço configurado no DNS com o IP do Ingress.


Mas porque diabos você faz uma introdução gigante ao invés de iniciar o assunto?

Puff!, sei lá =). Porque trabalhei com redatores por muito tempo?


Agora é sério...


Veremos abaixo os passos necessários para configurar uma secret TLS no k8s, montar o yaml da secret, executar no k8s e vincular a secret gerada no service do k8s para possibilitar acesso HTTPS em sua aplicação. 

O secret.yaml

Não necessariamente precisa ser "secret.yaml", só usei esse nome para simplificar. O importante é o conteúdo do arquivo.
apiVersion: v1
kind: Secret
metadata:
name: $nome_do_certificado
namespace: $namespace_do_seu_app_no_k8s
type: kubernetes.io/tls
data:
tls.crt: $hash_base64_extraido_do_seu_certificado_https tls.key: $hash_key_base64_extraido_do_seu_certificado_https
*Tudo que está com $, você preenche com seus dados 😙


O criando no Kubernetes

Bom, para criar a secret, basta conectar no seu cluster k8s (via cli - eu uso bash) e usar o comando abaixo:
- kubectl create -f secret.yaml

Após a mensagem de sucesso, a secret nome_do_certificado estará disponível e bastará apenas vincular a secret gerada a sua aplicação (aquela do namespace_do_seu_app_no_k8s), no campo tls.hosts.secretName.

Eu uso Google Cloud. Se esse for também seu caso, siga o caminho: kubernetes engine > services > acesse pod Entrada (Ingress) > YAML > tls.hosts.secretName = nome_do_certificado (ou via VI usando bash DeUXx mE livRe do VIMMM - É real, não gosto do vim, uso sei lá porque).

Feito isso, basta acessar sua aplicação pelo endereço vinculado ao IP do Ingress (espero que você já tenha configurado o DNS para o IP do Ingress).

Fica ai a referência que usei quando configurei: https://kubernetes.io/docs/concepts/configuration/secret/

Bom, é isso ai. Tem algumas coisas particulares aqui, como Google Cloud e Ingress. Mas creio que vá te ajudar caso esteja com o mesmo problema.


Ah, outra coisa...

Caso esteja se perguntando sobre vincular usar o HTTPS em diferentes aplicações para no mesmo cluster k8s, fique tranquilo. É um cluster e quem faz a magica de direcionar o endereço para a aplicação correta é o load balance, no meu caso o Ingress quebra essa :P.


Caso tenha alguma dificuldade, pergunta ae!

Abraços