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