Como configurar uma entrada Nginx com o Cert-Manager no Kubernetes
Introdução
Os Ingresses do Kubernetes permitem rotear de forma flexível o tráfego de fora do cluster do Kubernetes para os serviços dentro do cluster. Isso é feito usando os Recursos do Ingress, que definem regras para rotear o tráfego HTTP e HTTPS para os Serviços do Kubernetes, e os Controladores do Ingress, que implementam as regras balanceando a carga do tráfego e roteando-o para os serviços de back-end apropriados.
Os controladores Ingress populares incluem Traefik. As entradas fornecem uma alternativa mais eficiente e flexível para configurar vários serviços LoadBalancer, cada um dos quais usa seu próprio Load Balancer dedicado.
Neste guia, configuraremos o How To Set Up an Nginx Ingress on DigitalOcean Kubernetes usando o Helm, mantido pelo Kubernetes.
Pré-requisitos
Antes de começar com este guia, você deve ter o seguinte disponível para você:
- Um cluster do Kubernetes 1.15+ com outro método.
- A ferramenta de linha de comando
kubectl
instalada em sua máquina local e configurada para se conectar ao seu cluster. Você pode ler mais sobre a instalação dokubectl
How to Connect to a DigitalOcean Kubernetes Cluster para saber como se conectar ao seu cluster usandokubectl
. - Um nome de domínio e registros DNS A que você pode apontar para o balanceador de carga da DigitalOcean usado pelo Ingress. Se você estiver usando a DigitalOcean para gerenciar os registros DNS do seu domínio, consulte Como gerenciar registros DNS para saber como criar registros
A
. - O utilitário de linha de comando
wget
instalado em sua máquina local. Você pode instalarwget
usando o gerenciador de pacotes embutido em seu sistema operacional.
Depois de configurar esses componentes, você está pronto para começar com este guia.
Etapa 1 — Configurando serviços de back-end fictícios
Antes de implantar o Ingress Controller, primeiro criaremos e distribuiremos dois serviços fictícios de eco para os quais rotearemos o tráfego externo usando o Ingress. Os serviços echo executarão os serviços dos documentos oficiais do Kubernetes.
Em sua máquina local, crie e edite um arquivo chamado echo1.yaml
usando nano
ou seu editor favorito:
- nano echo1.yaml
Cole o seguinte manifesto de serviço e implantação:
apiVersion: v1
kind: Service
metadata:
name: echo1
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo1
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo1
spec:
selector:
matchLabels:
app: echo1
replicas: 2
template:
metadata:
labels:
app: echo1
spec:
containers:
- name: echo1
image: hashicorp/http-echo
args:
- "-text=echo1"
ports:
- containerPort: 5678
Neste arquivo, definimos um serviço chamado echo1
que roteia o tráfego para os pods com o seletor de rótulos app: echo1
. Ele aceita tráfego TCP na porta 80
e o roteia para a porta 5678
, a porta padrão de http-echo
.
Em seguida, definimos um Deployment, também chamado de echo1
, que gerencia os Pods com o app: echo1
Label Selector. Especificamos que a implantação deve ter 2 réplicas de pod e que os pods devem iniciar um contêiner chamado echo1
executando a imagem hashicorp/http-echo
. Passamos o parâmetro text
e o configuramos como echo1
, para que o servidor web http-echo
retorne echo1
. Por fim, abrimos a porta 5678
no contêiner do pod.
Quando estiver satisfeito com seu manifesto fictício de serviço e implantação, salve e feche o arquivo.
Em seguida, crie os recursos do Kubernetes usando kubectl apply
com o sinalizador -f
, especificando o arquivo que você acabou de salvar como parâmetro:
- kubectl apply -f echo1.yaml
Você deve ver a seguinte saída:
Outputservice/echo1 created
deployment.apps/echo1 created
Verifique se o serviço foi iniciado corretamente confirmando que ele possui um ClusterIP, o IP interno no qual o serviço está exposto:
- kubectl get svc echo1
Você deve ver a seguinte saída:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
echo1 ClusterIP 10.245.222.129 <none> 80/TCP 60s
Isso indica que o serviço echo1
agora está disponível internamente em 10.245.222.129
na porta 80
. Ele encaminhará o tráfego para containerPort 5678
nos pods que selecionar.
Agora que o serviço echo1
está funcionando, repita este processo para o serviço echo2
.
Crie e abra um arquivo chamado echo2.yaml
:
apiVersion: v1
kind: Service
metadata:
name: echo2
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo2
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo2
spec:
selector:
matchLabels:
app: echo2
replicas: 1
template:
metadata:
labels:
app: echo2
spec:
containers:
- name: echo2
image: hashicorp/http-echo
args:
- "-text=echo2"
ports:
- containerPort: 5678
Aqui, usamos essencialmente o mesmo manifesto de serviço e implantação acima, mas nomeamos e renomeamos o serviço e a implantação echo2
. Além disso, para fornecer alguma variedade, criamos apenas 1 réplica de pod. Garantimos que definimos o parâmetro text
como echo2
para que o servidor web retorne o texto echo2
.
Salve e feche o arquivo e crie os recursos do Kubernetes usando kubectl
:
- kubectl apply -f echo2.yaml
Você deve ver a seguinte saída:
Outputservice/echo2 created
deployment.apps/echo2 created
Mais uma vez, verifique se o serviço está funcionando:
- kubectl get svc
Você deve ver os serviços echo1
e echo2
com ClusterIPs atribuídos:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
echo1 ClusterIP 10.245.222.129 <none> 80/TCP 6m6s
echo2 ClusterIP 10.245.128.224 <none> 80/TCP 6m3s
kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 4d21h
Agora que nossos serviços da Web fictícios de eco estão funcionando, podemos prosseguir com a implantação do Nginx Ingress Controller.
Etapa 2 — Configurando o Kubernetes Nginx Ingress Controller
Nesta etapa, implementaremos a v1.1.1
do Guia de instalação mantido pelo Kubernetes.
O Nginx Ingress Controller consiste em um pod que executa o servidor da Web Nginx e observa o plano de controle do Kubernetes em busca de objetos Ingress Resource novos e atualizados. Um Ingress Resource é essencialmente uma lista de regras de roteamento de tráfego para serviços de back-end. Por exemplo, uma regra de entrada pode especificar que o tráfego HTTP que chega no caminho /web1
deve ser direcionado para o servidor da web de back-end web1
. Usando os recursos do Ingress, você também pode realizar roteamento baseado em host: por exemplo, roteamento de solicitações que atingem web1.your_domain.com
para o serviço Kubernetes de back-end web1
.
Nesse caso, como estamos implantando o Ingress Controller em um cluster Kubernetes da DigitalOcean, o Controller criará um LoadBalancer Service que provisiona um Load Balancer da DigitalOcean para o qual todo o tráfego externo será direcionado. Esse balanceador de carga roteará o tráfego externo para o pod do controlador Ingress executando o Nginx, que encaminhará o tráfego para os serviços de back-end apropriados.
Começaremos criando os recursos do Kubernetes do Nginx Ingress Controller. Eles consistem em ConfigMaps contendo a configuração do controlador, funções de controle de acesso baseado em função (RBAC) para conceder ao controlador acesso à API do Kubernetes e a implantação real do controlador de ingresso que usa v1.1.1
da imagem do Nginx Ingress Controller. Para ver uma lista completa desses recursos necessários, consulte o manifesto do repositório GitHub do Kubernetes Nginx Ingress Controller.
Observação: neste tutorial, estamos seguindo as instruções de instalação oficiais do provedor DigitalOcean. Você deve escolher o arquivo de manifesto apropriado dependendo do seu provedor Kubernetes.
Para criar os recursos, use kubectl apply
e o sinalizador -f
para especificar o arquivo de manifesto hospedado no GitHub:
- kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/do/deploy.yaml
Usamos apply
aqui para que, no futuro, possamos aplicar
de forma incremental as alterações aos objetos Ingress Controller em vez de sobrescrevê-los completamente. Para saber mais sobre aplicar
, consulte Gerenciando recursos nos documentos oficiais do Kubernetes.
Você deve ver a seguinte saída:
Outputnamespace/ingress-nginx created
serviceaccount/ingress-nginx created
configmap/ingress-nginx-controller created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
service/ingress-nginx-controller-admission created
service/ingress-nginx-controller created
deployment.apps/ingress-nginx-controller created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
serviceaccount/ingress-nginx-admission created
Essa saída também serve como um resumo conveniente de todos os objetos Ingress Controller criados a partir do manifesto deploy.yaml
.
Confirme se os pods do controlador Ingress foram iniciados:
- kubectl get pods -n ingress-nginx \
- -l app.kubernetes.io/name=ingress-nginx --watch
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-l2jhk 0/1 Completed 0 13m
ingress-nginx-admission-patch-hsrzf 0/1 Completed 0 13m
ingress-nginx-controller-c96557986-m47rq 1/1 Running 0 13m
Pressione CTRL+C
para retornar ao seu prompt.
Agora, confirme se o balanceador de carga da DigitalOcean foi criado com sucesso, obtendo os detalhes do serviço com kubectl
:
- kubectl get svc --namespace=ingress-nginx
Após alguns minutos, você deverá ver um endereço IP externo, correspondente ao endereço IP do balanceador de carga da DigitalOcean:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.245.201.120 203.0.113.0 80:31818/TCP,443:31146/TCP 14m
ingress-nginx-controller-admission ClusterIP 10.245.239.119 <none> 443/TCP 14m
Anote o endereço IP externo do balanceador de carga, pois você precisará dele em uma etapa posterior.
Observação: por padrão, o serviço Nginx Ingress LoadBalancer tem service.spec.externalTrafficPolicy
definido como o valor Local
, que roteia todo o tráfego do balanceador de carga para nós que executam pods Nginx Ingress. Os outros nós falharão deliberadamente nas verificações de integridade do balanceador de carga para que o tráfego do Ingress não seja roteado para eles. As políticas de tráfego externo estão além do escopo deste tutorial, mas para saber mais, você pode consultar IP de origem para serviços com Type=LoadBalancer nos documentos oficiais do Kubernetes.
Esse balanceador de carga recebe tráfego nas portas HTTP e HTTPS 80 e 443 e o encaminha para o Ingress Controller Pod. O Ingress Controller irá então rotear o tráfego para o serviço de back-end apropriado.
Agora podemos apontar nossos registros DNS para esse balanceador de carga externo e criar alguns recursos de ingresso para implementar regras de roteamento de tráfego.
Etapa 3 — Criando o Recurso Ingress
Vamos começar criando um Ingress Resource mínimo para rotear o tráfego direcionado a um determinado subdomínio para um serviço de back-end correspondente.
Neste guia, usaremos o domínio de teste example.com. Você deve substituí-lo pelo nome de domínio que possui.
Primeiro, criaremos uma regra simples para rotear o tráfego direcionado para echo1.example.com para o serviço de back-end echo1
e o tráfego direcionado para echo2.example.com< /mark> para o serviço de back-end echo2
.
Comece abrindo um arquivo chamado echo_ingress.yaml
em seu editor favorito:
- nano echo_ingress.yaml
Cole a seguinte definição de entrada:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: echo-ingress
spec:
rules:
- host: echo1.example.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: echo1
port:
number: 80
- host: echo2.example.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: echo2
port:
number: 80
Quando terminar de editar suas regras do Ingress, salve e feche o arquivo.
Aqui, especificamos que gostaríamos de criar um Ingress Resource chamado echo-ingress
e rotear o tráfego com base no cabeçalho Host. Um cabeçalho de host de solicitação HTTP especifica o nome de domínio do servidor de destino. Para saber mais sobre cabeçalhos de solicitação de host, consulte o Mozilla Developer Network example.com será direcionado para o back-end echo2
.
Agora você pode criar o Ingress usando kubectl
:
- kubectl apply -f echo_ingress.yaml
Você verá a seguinte saída confirmando a criação do Ingress:
Outputingress.networking.k8s.io/echo-ingress created
Para testar o Ingress, navegue até seu serviço de gerenciamento de DNS e crie registros A para echo1.example.com
e echo2.example.com
apontando para o IP externo do DigitalOcean Load Balancer. O IP externo do balanceador de carga é o endereço IP externo para o serviço ingress-nginx
, que buscamos na etapa anterior. Se você estiver usando a DigitalOcean para gerenciar os registros DNS do seu domínio, consulte Como gerenciar registros DNS para saber como criar registros A
.
Depois de criar os registros DNS echo1.example.com
e echo2.example.com
necessários, você pode testar o Ingress Controller e o recurso que criou usando curl
utilitário de linha de comando.
Em sua máquina local, curl
o serviço echo1
:
- curl echo1.example.com
Você deve obter a seguinte resposta do serviço echo1
:
Outputecho1
Isso confirma que sua solicitação para echo1.example.com
está sendo roteada corretamente por meio da entrada Nginx para o serviço de back-end echo1
.
Agora, faça o mesmo teste para o serviço echo2
:
- curl echo2.example.com
Você deve obter a seguinte resposta do serviço echo2
:
Outputecho2
Isso confirma que sua solicitação para echo2.example.com
está sendo roteada corretamente por meio da entrada Nginx para o serviço de back-end echo2
.
Neste ponto, você configurou com sucesso um Nginx Ingress mínimo para executar o roteamento baseado em host virtual. Na próxima etapa, instalaremos o cert-manager para provisionar certificados TLS para nosso Ingress e habilitar o protocolo HTTPS mais seguro.
Etapa 4 — Instalando e configurando o Cert-Manager
Nesta etapa, instalaremos a v1.7.1 do cert-manager em nosso cluster. cert-manager é um complemento do Kubernetes que provisiona certificados TLS de Emissores.
Instale o cert-manager e suas instruções de instalação. Observe que um namespace chamado cert-manager
será criado no qual os objetos cert-manager serão criados:
- kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.7.1/cert-manager.yaml
Você deve ver a seguinte saída:
Outputcustomresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created
. . .
deployment.apps/cert-manager-webhook created
mutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
Para verificar nossa instalação, verifique o namespace cert-manager
para pods em execução:
- kubectl get pods --namespace cert-manager
OutputNAME READY STATUS RESTARTS AGE
cert-manager-578cd6d964-hr5v2 1/1 Running 0 99s
cert-manager-cainjector-5ffff9dd7c-f46gf 1/1 Running 0 100s
cert-manager-webhook-556b9d7dfd-wd5l6 1/1 Running 0 99s
Isso indica que a instalação do cert-manager foi bem-sucedida.
Antes de começarmos a emitir certificados para nossos domínios echo1.example.com
e echo2.example.com
, precisamos criar um Emissor, que especifica a autoridade de certificação da qual x509 assinado certificados podem ser obtidos. Neste guia, usaremos a autoridade de certificação Let's Encrypt, que fornece certificados TLS gratuitos e oferece um servidor de teste para testar sua configuração de certificado e um servidor de produção para distribuir certificados TLS verificáveis.
Vamos criar um ClusterIssuer de teste para garantir que o mecanismo de provisionamento de certificados esteja funcionando corretamente. Um ClusterIssuer não tem escopo de namespace e pode ser usado por recursos de certificado em qualquer namespace.
Abra um arquivo chamado staging_issuer.yaml
em seu editor de texto favorito:
nano staging_issuer.yaml
Cole o seguinte manifesto ClusterIssuer:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
namespace: cert-manager
spec:
acme:
# The ACME server URL
server: https://acme-staging-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: your_email_address_here
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-staging
# Enable the HTTP-01 challenge provider
solvers:
- http01:
ingress:
class: nginx
Aqui especificamos que gostaríamos de criar um ClusterIssuer chamado letsencrypt-staging
e usar o servidor de teste Let's Encrypt. Posteriormente, usaremos o servidor de produção para distribuir nossos certificados, mas o servidor de produção limita as solicitações feitas contra ele, portanto, para fins de teste, você deve usar o URL de teste.
Em seguida, especificamos um endereço de e-mail para registrar o certificado e criamos um Kubernetes Issuers.
Distribua o ClusterIssuer usando kubectl
:
- kubectl create -f staging_issuer.yaml
Você deve ver a seguinte saída:
Outputclusterissuer.cert-manager.io/letsencrypt-staging created
Agora, repetiremos esse processo para criar o ClusterIssuer de produção. Observe que os certificados só serão criados após a anotação e atualização do recurso Ingress provisionado na etapa anterior.
Abra um arquivo chamado prod_issuer.yaml
em seu editor favorito:
nano prod_issuer.yaml
Cole o seguinte manifesto:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
namespace: cert-manager
spec:
acme:
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: your_email_address_here
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-prod
# Enable the HTTP-01 challenge provider
solvers:
- http01:
ingress:
class: nginx
Observe a URL diferente do servidor ACME e o nome da chave secreta letsencrypt-prod
.
Quando terminar de editar, salve e feche o arquivo.
Distribua este emissor usando kubectl
:
- kubectl create -f prod_issuer.yaml
Você deve ver a seguinte saída:
Outputclusterissuer.cert-manager.io/letsencrypt-prod created
Agora que criamos nossos ClusterIssuers de preparação e produção Let's Encrypt, estamos prontos para modificar o Ingress Resource que criamos acima e habilitar a criptografia TLS para echo1.example.com
e echo2. example.com
caminhos.
Se estiver usando Kubernetes da DigitalOcean, primeiro você precisa implementar a Etapa 6.
Etapa 5 — Habilitando a comunicação do pod por meio do balanceador de carga (opcional)
Antes de provisionar certificados do Let's Encrypt, o cert-manager primeiro executa uma autoverificação para garantir que o Let's Encrypt possa alcançar o Pod do cert-manager que valida seu domínio. Para que essa verificação passe no Kubernetes da DigitalOcean, você precisa habilitar a comunicação Pod-Pod por meio do balanceador de carga Nginx Ingress.
Para fazer isso, criaremos um registro DNS A que aponta para o IP externo do balanceador de carga da nuvem e anotaremos o manifesto Nginx Ingress Service com esse subdomínio.
Comece navegando até seu serviço de gerenciamento de DNS e crie um registro A para solução alternativa.example.com
apontando para o IP externo do balanceador de carga da DigitalOcean. O IP externo do balanceador de carga é o endereço IP externo para o serviço ingress-nginx
, que buscamos na Etapa 2. Se você estiver usando a DigitalOcean para gerenciar os registros DNS do seu domínio, consulte Como gerenciar registros DNS para aprenda como criar registros A. Aqui, usamos o subdomínio solução alternativa
, mas você pode usar qualquer subdomínio de sua preferência.
Agora que você criou um registro DNS apontando para o balanceador de carga do Ingress, anote o Ingress LoadBalancer Service com a anotação do-loadbalancer-hostname
. Abra um arquivo chamado ingress_nginx_svc.yaml
em seu editor favorito e cole o seguinte manifesto LoadBalancer:
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol: 'true'
service.beta.kubernetes.io/do-loadbalancer-hostname: "workaround.example.com"
labels:
helm.sh/chart: ingress-nginx-4.0.6
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 1.1.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
type: LoadBalancer
externalTrafficPolicy: Local
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
- name: https
port: 443
protocol: TCP
targetPort: https
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
Este manifesto de serviço foi extraído do arquivo de manifesto Nginx Ingress completo que você instalou na Etapa 2. Certifique-se de copiar o manifesto de serviço correspondente à versão do Nginx Ingress que você instalou; neste tutorial, é 1.1.1
. Certifique-se também de definir a anotação do-loadbalancer-hostname
para o domínio workaround.example.com
.
Quando terminar, salve e feche o arquivo.
Modifique o serviço ingress-nginx-controller
em execução usando kubectl apply
:
kubectl apply -f ingress_nginx_svc.yaml
Você deve ver a seguinte saída:
Outputservice/ingress-nginx-controller configured
Isso confirma que você anotou o serviço ingress-nginx-controller
e os pods em seu cluster agora podem se comunicar uns com os outros usando este balanceador de carga ingress-nginx-controller
.
Etapa 6 — Emitir certificados Let's Encrypt de teste e produção
Para emitir um certificado TLS de teste para nossos domínios, anotaremos echo_ingress.yaml
com o ClusterIssuer criado na Etapa 4. Isso usará ingress-shim
para criar e emitir automaticamente certificados para os domínios especificados no manifesto do Ingress.
Abra echo_ingress.yaml
em seu editor favorito:
- nano echo_ingress.yaml
Adicione o seguinte ao manifesto do recurso Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: echo-ingress
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-staging"
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- echo1.example.com
- echo2.example.com
secretName: echo-tls
rules:
- host: echo1.example.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: echo1
port:
number: 80
- host: echo2.example.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: echo2
port:
number: 80
Aqui adicionamos uma anotação para definir o clusterIssuer do cert-manager como letsencrypt-staging
, o certificado de teste ClusterIssuer criado na Etapa 4. Também adicionamos uma anotação que descreve o tipo de entrada, neste caso nginx
.
Também adicionamos um bloco tls
para especificar os hosts para os quais queremos adquirir certificados e especificamos um secretName
. Esse segredo conterá a chave privada TLS e o certificado emitido. Certifique-se de trocar example.com
pelo domínio para o qual você criou registros DNS.
Quando terminar de fazer as alterações, salve e feche o arquivo.
Agora, enviaremos esta atualização para o objeto Ingress existente usando kubectl apply
:
- kubectl apply -f echo_ingress.yaml
Você deve ver a seguinte saída:
Outputingress.networking.k8s.io/echo-ingress configured
Você pode usar kubectl describe
para rastrear o estado das alterações do Ingress que acabou de aplicar:
- kubectl describe ingress
OutputEvents:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal UPDATE 6s (x3 over 80m) nginx-ingress-controller Ingress default/echo-ingress
Normal CreateCertificate 6s cert-manager Successfully created Certificate "echo-tls"
Uma vez que o certificado foi criado com sucesso, você pode executar um describe
nele para confirmar sua criação com sucesso:
- kubectl describe certificate
Você deve ver a seguinte saída na seção Events
:
OutputEvents:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Requested 64s cert-manager Created new CertificateRequest resource "echo-tls-vscfw"
Normal Issuing 40s cert-manager The certificate has been successfully issued
Isso confirma que o certificado TLS foi emitido com sucesso e a criptografia HTTPS agora está ativa para os dois domínios configurados.
Agora estamos prontos para enviar uma solicitação a um servidor echo
de back-end para testar se o HTTPS está funcionando corretamente.
Execute o seguinte comando wget
para enviar uma solicitação para echo1.example.com
e imprimir os cabeçalhos de resposta para STDOUT
:
- wget --save-headers -O- echo1.example.com
Você deve ver a seguinte saída:
Output. . .
HTTP request sent, awaiting response... 308 Permanent Redirect
. . .
ERROR: cannot verify echo1.example.com's certificate, issued by ‘ERROR: cannot verify echo1.example.com's certificate, issued by ‘CN=(STAGING) Artificial Apricot R3,O=(STAGING) Let's Encrypt,C=US’:
Unable to locally verify the issuer's authority.
To connect to echo1.example.com insecurely, use `--no-check-certificate'.
Isso indica que o HTTPS foi ativado com sucesso, mas o certificado não pode ser verificado, pois é um certificado temporário falso emitido pelo servidor de teste Let's Encrypt.
Agora que testamos se tudo funciona usando esse certificado falso temporário, podemos distribuir certificados de produção para os dois hosts echo1.example.com
e echo2.example.com
. Para fazer isso, usaremos o letsencrypt-prod
ClusterIssuer.
Atualize echo_ingress.yaml
para usar letsencrypt-prod
:
- nano echo_ingress.yaml
Faça a seguinte alteração no arquivo:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: echo-ingress
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- echo1.example.com
- echo2.example.com
secretName: echo-tls
rules:
- host: echo1.example.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: echo1
port:
number: 80
- host: echo2.example.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: echo2
port:
number: 80
Aqui, atualizamos o nome ClusterIssuer para letsencrypt-prod
.
Quando estiver satisfeito com as alterações, salve e feche o arquivo.
Implemente as alterações usando kubectl apply
:
- kubectl apply -f echo_ingress.yaml
Outputingress.networking.k8s.io/echo-ingress configured
Aguarde alguns minutos para que o servidor de produção Let's Encrypt emita o certificado. Você pode acompanhar seu progresso usando kubectl describe
no objeto certificate
:
- kubectl describe certificate echo-tls
Depois de ver a seguinte saída, o certificado foi emitido com sucesso:
Output Normal Issuing 28s cert-manager Issuing certificate as Secret was previously issued by ClusterIssuer.cert-manager.io/letsencrypt-staging
Normal Reused 28s cert-manager Reusing private key stored in existing Secret resource "echo-tls"
Normal Requested 28s cert-manager Created new CertificateRequest resource "echo-tls-49gmn"
Normal Issuing 2s (x2 over 4m52s) cert-manager The certificate has been successfully issued
Agora vamos realizar um teste usando curl
para verificar se o HTTPS está funcionando corretamente:
- curl echo1.example.com
Você deve ver o seguinte:
Output<html>
<head><title>308 Permanent Redirect</title></head>
<body>
<center><h1>308 Permanent Redirect</h1></center>
<hr><center>nginx/1.15.9</center>
</body>
</html>
Isso indica que as solicitações HTTP estão sendo redirecionadas para usar HTTPS.
Execute curl
em https://echo1.example.com
:
- curl https://echo1.example.com
Agora você deve ver a seguinte saída:
Outputecho1
Você pode executar o comando anterior com o sinalizador -v
detalhado para se aprofundar no handshake do certificado e verificar as informações do certificado.
Neste ponto, você configurou com sucesso o HTTPS usando um certificado Let's Encrypt para o seu Nginx Ingress.
Conclusão
Neste guia, você configura um Nginx Ingress para balancear a carga e rotear solicitações externas para serviços de back-end dentro de seu cluster Kubernetes. Você também protegeu o Ingress instalando o provedor de certificado cert-manager e configurando um certificado Let's Encrypt para dois caminhos de host.
Existem muitas alternativas para o Nginx Ingress Controller. Para saber mais, consulte os controladores do Ingress na documentação oficial do Kubernetes.
Para obter um guia sobre a implementação do Nginx Ingress Controller usando o gerenciador de pacotes Helm Kubernetes, consulte How To Set up an Nginx Ingress on DigitalOcean Kubernetes Using Helm.