Os Ingresses do Kubernetes permitem o roteamento do tráfego externo ao cluster do seu Kubernetes de maneira flexível para os Serviços dentro de seu cluster. Essa condição é alcançada quando usamos os Recursos de Ingress - que definem as regras para rotear o tráfego do HTTP e HTTPS para os Serviços do Kubernetes e para os *Controladores *do Ingress, os quais implementam as regras fazendo o balanceamento da carga do tráfego e o seu roteamento para os serviços de backend apropriados. Nginx, Contour, HAProxy e o Traefik são controladores Ingress populares. Os Ingresses fornecem uma alternativa mais eficiente e flexível para configurar vários serviços de LoadBalancer, cada qual usando seu próprio Load Balancer dedicado.
Neste guia, vamos configurar o Controlador Ingress para Nginx - mantido pelo Kubernetes - e criaremos alguns Recursos de Ingress para rotear o tráfego para vários serviços de back-end fictício. Uma vez configurado o Ingress, vamos instalar o cert-manager no nosso cluster para gerenciar e fornecer certificados TLS para criptografar o tráfego de HTTP para o Ingress. Este guia não usa o gerenciador de pacotes Helm. Para obter um guia sobre como inplantar o Controlador do Nginx Ingres usando o Helm, consulte o artigo Como configurar um Nginx Ingress no Kubernetes da DigitalOcean usando o Helm.
Antes de começar com este guia, você deve ter o seguinte disponível:
kubectl
de linha de comando instalada em sua máquina local e configurada para se conectar ao seu cluster. Você pode ler mais sobre como instalar o kubectl
na documentação oficial.wget
instalado em sua máquina local. Você pode instalar o wget
utilizando o gerenciador de pacotes integrado em seu sistema operacional.Assim que tiver esses componentes configurados, você estará pronto para começar com este guia.
Antes de implantar o Controlador Ingress, primeiro vamos criar e implantar dois serviços de eco fictício para os quais vamos rotear o tráfego externo usando o Ingress. Os serviços de eco irão executar o contêiner de servidor Web hashicorp/http-echo
, os quais retornarão uma página com uma string de texto transmitida quando o servidor Web for iniciado. Para aprender mais sobre o http-echo
, consulte seu GitHub Repo e, para aprender mais sobre os Kubernetes Services, consulte o tópico Serviços dos documentos oficiais do Kubernetes.
Na sua máquina local, crie e edite um arquivo chamado de eco1.yaml
usando o nano
ou seu editor favorito:
- nano echo1.yaml
Cole no manifesto de Serviço e implantação a seguir:
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 faz o roteamento do tráfego para os Pods com o seletor de rótulo app: echo1
. Ele aceita o tráfego TCP na porta 80
e o roteia para a porta 5678
-a porta padrão do http-echo
.
Em eguida, definimos uma Implantação, também chamada de echo1
, a qual gerencia os Pods com o Seletor de rótulo app:echo1
. 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 no parâmetro text
e o configuramos para o echo1
, para que o servidor Web http-echo
retorne echo1
. Por fim, abrimos a porta 5678
no contêiner do Pod.
Assim que estiver satisfeito com seu serviço fictício e o manifesto de implantação, salve e feche o arquivo.
Em seguida, crie os recursos do Kubernetes usando o kubectl apply
com o sinalizador -f
, especificando o arquivo que você acabou de salvar como um parâmetro:
- kubectl apply -f echo1.yaml
Você deve ver o seguinte resultado:
Outputservice/echo1 created
deployment.apps/echo1 created
Verifique se o serviço iniciou corretamente, confirmando que ele tem um ClusterIP, o IP interno no qual o serviço será exposto:
- kubectl get svc echo1
Você deve ver o seguinte resultado:
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 de echo1
está disponível internamente em 10.245.222.129
na porta 80
. Ele encaminhará o tráfego para a containerPort 5678
nos Pods que ele selecionar.
Agora que o serviço de echo1
está em execução, repita esse 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 basicamente o mesmo manifesto de Serviço e implantação acima, mas nomeamos e rotulamos novamente o Serviço e implantação echo2
. Além disso, para darmos mais variedade, criaremos apenas 1 réplica do Pod. Nós garantimos que definimos o parâmetro text
para o echo2
para que o servidor Web retorne o texto echo2
.
Salve e feche o arquivo e crie os recursos do Kubernetes usando o kubectl
:
- kubectl apply -f echo2.yaml
Você deve ver o seguinte resultado:
Outputservice/echo2 created
deployment.apps/echo2 created
Novamente, verifique se o serviço está em execução:
- kubectl get svc
Você deve ver tanto o serviço echo1
como o serviço 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 de Web echo fictícios estão em execução, podemos seguir em frente para implantar o Controlador Ingress para o Nginx.
Neste passo, vamos implantar a versão v0.26.1
do Controlador Ingress para Nginx mantido pelo Kubernetes. Note que existem vários Controladores Ingress para Nginx; a comunidade do Kubernetes mantém o controlador que iremos usar neste guia e a Nginx Inc. mantém o kubernetes-ingress. As instruções neste tutorial são baseadas controladores do Guia de instalação oficial para o Controlador Ingress da Kubernetes para Nginx.
O Controlador Ingress para Nginx consiste de um Pod que executa o servidor Web Nginx e monitora o plano de controle do Kubernetes em relação aos objetos novos e atualizados de Recursos de Ingress. Um recurso Ingress é, essencialmente, uma lista de regras de roteamento de tráfego para serviços de back-end. Por exemplo, uma regra de Ingress pode especificar que o tráfego HTTP chegando no caminho /web1
deve ser direcionado para o servidor Web de back-end web1
. Ao usar os recursos de Ingress, é possível realizar o roteamento baseado em host: por exemplo, roteando os pedidos que chegarem para o web1.your_domain.com
para o Serviço de back-end do Kubernetes web1
.
Neste caso, devido a estarmos implantando o controlador Ingress para um cluster de Kubernetes da DigitalOcean, o controlador criará um serviço de LoadBalancer, que irá inicializar um balanceador de carga da DigitalOcean para o qual todo o tráfego externo será direcionado. Este balanceador de carga fará o roteamento do tráfego externo para o Pod do controlador Ingress que executa o Nginx, que, na sequência, encaminhará o tráfego para os serviços de back-end apropriados.
Vamos começar criando os recursos necessários do Kubernetes pelo Controlador Ingress para Nginx. Tais recursos incluem os ConfigMaps que contêm a configuração do Controlador, Funções de controle de acesso baseado em função (RBAC) para conceder ao controlador acesso à API do Kubernetes, além da Implantação real do controlador Ingress que usa a versão v0.26.1 da imagem do controlador Ingress para Nginx. Para ver uma lista completa dos recursos necessários, consulte o manifesto do repositório Github do Controlador Ingress para Nginx do Kubernetes.
Para criar esses recursos obrigatórios, utilize o kubectl apply
e o sinalizador -f
para especificar o arquivo do manifesto hospedado no GitHub:
- kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.1/deploy/static/mandatory.yaml
Usamos o recurso apply
aqui para que, no futuro, possamos usar cada vez as alterações do apply
nos objetos do controlador Ingress, em vez de substituí-los completamente. Para aprender mais sobre o apply
, consulte o tópico Gerenciando recursos dos documentos oficiais do Kubernetes.
Você deve ver o seguinte resultado:
Outputnamespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.apps/nginx-ingress-controller created
Este resultado também serve como um resumo conveniente de todos os objetos do controlador Ingress criados a partir do manifesto mandatory.yaml
.
Em seguida, vamos criar o serviço LoadBalance do controlador Ingress, o qual criará um Load Balancer da Digital Ocean que irá balancear a carga e rotear o tráfego de HTTP e HTTPS para o Pod do Controlador Ingress implantado no comando anterior.
Para criar o serviço do LoadBalancer, mais uma vez, utilize o kubectl apply
- um arquivo de manifesto que contém a definição do serviço:
- kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.1/deploy/static/provider/cloud-generic.yaml
Você deve ver o seguinte resultado:
Outputservice/ingress-nginx created
Confirme se os Pods do Controlador Ingress iniciaram:
- kubectl get pods --all-namespaces -l app.kubernetes.io/name=ingress-nginx
OutputNAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx nginx-ingress-controller-7fb85bc8bb-lnm6z 1/1 Running 0 2m42s
Agora, confirme que o Load Balancer da DigitalOcean foi criado com sucesso, buscando os detalhes do serviço com o kubectl
:
- kubectl get svc --namespace=ingress-nginx
Depois de vários minutos, você deverá ver um endereço IP externo, que corresponde ao endereço IP do Load Balancer da DigitalOcean:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx LoadBalancer 10.245.247.67 203.0.113.0 80:32486/TCP,443:32096/TCP 20h
Anote o endereço de IP externo do Load Balancer, já que você precisará dele em um passo mais a frente.
Nota: por padrão, o serviço LoadBalancer do Ingress para Nginx tem o service.spec.externalTrafficPolicy
ajustado para o valor Local
, o qual faz o roteamento do tráfego do balancedor de carga para os nós que executam os Pods do Ingress para Nginx. Os outros nós irão fracassar nas inspeções de integridade do balanceador de carga - propositadamente, de modo aque o tráfego do Ingress não seja roteado para os nós. As políticas de tráfego externas estão além do âmbito deste tutorial, mas para saber mais a respeito, consulte Um aprofundamento nas políticas de tráfego externo do Kubernetes e IP de origem para serviços com o Type=LoadBalancer dos documentos oficiais do Kubernetes.
Este balanceador de carga recebe o tráfego nas portas HTTP e HTTPS 80 e 443 e o encaminha para o pod do controlador Ingress. Na sequência, o controlador Ingress irá rotear o tráfego para o serviço de back-end apropriado.
Agora podemos apontar nossos registros de DNS neste Load Balancer externo e criar alguns recursos de Ingress para implementar regras de roteamento de tráfego.
Vamos começar criando um recurso de Ingress mínimo para rotear o tráfego direcionado a um dado subdomínio para um serviço de back-end correspondente.
Neste guia, vamos usar o domínio teste example.com. Você deve substituí-lo por um nome de domínio seu.
Primeiramente, vamos criar uma regra simples para rotear o tráfego direcionado para **echo1.example.com **para o serviço de back-end do echo1
e o tráfego direcionado para o echo2.example.com para o serviço de back-end do echo2
.
Inicie abrindo um arquivo chamado echo_ingress.yaml
no seu editor favorito:
- nano echo_ingress.yaml
Cole na seguinte definição de ingresso:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: echo-ingress
spec:
rules:
- host: echo1.example.com
http:
paths:
- backend:
serviceName: echo1
servicePort: 80
- host: echo2.example.com
http:
paths:
- backend:
serviceName: echo2
servicePort: 80
Quando terminar de editar suas regras do Ingress, salve e feche o arquivo.
Aqui, especificamos que gostaríamos de criar um resurso de Ingress chamado echo-ingress
e rotear o tráfeco com base no cabeçalho do Host. O cabeçalho de Host com um pedido de HTTP especifica o nome de domínio do servidor de destino. Para aprender mais sobre os cabeçalhos de pedidos do Host, consulte a página de definições da Rede de Desenvolvedores da Mozilla (MDN). Os pedidos junto ao host echo1.example.com serão direcionados para o back-end echo1
- configurado no Passo 1 - e os pedidos junto ao host echo2.example.com serão direcionados para o back-end echo2
.
Agora, você pode criar o Ingress usando o kubectl
:
- kubectl apply -f echo_ingress.yaml
Você verá o seguinte resultado confirmando a criação do Ingress:
Outputingress.extensions/echo-ingress created
Para testar o Ingress, navegue até o seu serviço de gerenciamento DNS e crie registros A para o echo1.example.com
e echo2.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 do serviço ingress-nginx
, que buscamos no passo anterior. Se estiver usando o DigitalOcean para gerenciar os registros de DNS do seu domínio, consulte Como gerenciar os registros de DNS para aprender como criar um registro A.
Assim que você tiver criado os registros DNS echo1.example.com
e echo2.example.com
necessários, você pode testar controlador e o recurso do Ingress que criou, utilizando o utilitário de linha de comando curl
.
De sua máquina local, faça o curl
do serviço echo1
:
- curl echo1.example.com
Você deve obter a seguinte resposta do serviço echo1
:
Outputecho1
Isso confirma que seu pedido de echo1.example.com
está sendo roteado corretamente através do Ingress para Nginx para o serviço de back-end echo1
.
Agora, faça o mesmo teste com o serviço echo2
:
- curl echo2.example.com
Você deve obter a seguinte resposta do serviço echo2
:
Outputecho2
Isso confirma que seu pedido para o echo2.example.com
está sendo roteado corretamente através do Ingress para Nginx para o serviço de back-end echo2
.
Neste ponto, você terá definido um Ingress báxico para Nginx para realizar o roteamento com base em host virtual. No próximo passo, vamos instalar o cert-manager para fornecer certificados TLS para o nosso Ingress e habilitar o protocolo HTTPS mais seguro.
Neste passo, vamos instalar o cert-manager em nosso cluster. O cert-manager é um serviço do Kubernetes que fornece certificados TLS do Let’s Encrypt e outras autoridades certificadoras e também gerencia seus ciclos de vida. Os certificados podem ser solicitados e configurados através de observações nos recursos do Ingress com a anotação cert-manager.io/issuer
, anexando uma seção de tls
para as especificações do Ingress e configurando um ou mais Issuers (Emissores) ou ClusterIssuers para especificar a autoridade certificadora de sua preferência. Para aprender mais sobre os objetos do Issuer e do Cluster, consulte a documentação oficial do cert-manager sobre Issuers.
Antes de instalarmos o cert-manager, primeiro vamos criar um Namespace no qual ele possa executar:
- kubectl create namespace cert-manager
Na sequência, vamos instalar o cert-manager e suas Definições de Recursos Personalizados (CRD) como Issuers e ClusterIssuers. Faça isto,aplicando
o manifesto diretamente do repositório GitHub do cert-manager:
- kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.12.0/cert-manager.yaml
Você deve ver o seguinte resultado:
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 do cert-manager
em relação aos pods em execução:
- kubectl get pods --namespace cert-manager
OutputNAME READY STATUS RESTARTS AGE
cert-manager-5c47f46f57-jknnx 1/1 Running 0 27s
cert-manager-cainjector-6659d6844d-j8cbg 1/1 Running 0 27s
cert-manager-webhook-547567b88f-qks44 1/1 Running 0 27s
Isso indica que a instalação do cert-manager foi bem-sucedida.
Antes de começar a emitir certificados para nossos hosts do Ingress, precisamos criar um emissor, o qual especifica a autoridade certificadora da qual será possível obter os certificados x509 assinados. Neste guia, vamos usar a autoridade o certificado do Let’s Encrypt, que fornece certificados TLS gratuitos e também oferece um servidor de preparação para a realização dos testes da configuração do seu certificado e um servidor de produção para implantar certificados TLS verificáveis.
Vamos criar um emissor teste para garantir que o mecanismo de fornecimento do certificado esteja funcionando corretamente. Abra um arquivo chamado staging_issuer.yaml
no seu editor de texto favorito:
nano staging_issuer.yaml
Cole no manifesto do ClusterIssuer a seguir:
apiVersion: cert-manager.io/v1alpha2
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 queremos criar um objeto de ClusterIssuer chamado de letsencrypt-staging
e usar o servidor de preparação do Let’s Encrypt. Mais tarde, vamos usar o servidor de produção para implantar nossos certificados. Entretanto, poderá haver solicitações de limitação de taxa em relação ao servidor, de modo que é melhor usar o URL de preparação para os testes.
Depois, especificamos um endereço de e-mail para registrar o certificado e criamos um Kubernetes Secret chamado letsencrypt-staging
para armazenar a chave privada da conta ACME. Também habilitamos o mecanismo de desafio do HTTP-01
. Para aprender mais sobre esses parâmetros, consulte a documentação oficial do cert-manager sobre Emissores.
Implemente o ClusterIssuer usando o kubectl
:
- kubectl create -f staging_issuer.yaml
Você deve ver o seguinte resultado:
Outputclusterissuer.cert-manager.io/letsencrypt-staging created
Agora que criamos o nosso emissor preparatório do Let’s Encrypt, estamos prontos para modificar o recurso do Ingress que criamos acima e habilitar a criptografia TLS para os caminhos do echo1.example.com
e do echo2.example.com
.
Abra novamente o echo_ingress.yaml
no seu editor favorito:
- nano echo_ingress.yaml
Adicione o seguinte ao manifesto recurso do Ingress:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: echo-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-staging"
spec:
tls:
- hosts:
- echo1.hjdo.net
- echo2.hjdo.net
secretName: echo-tls
rules:
- host: echo1.hjdo.net
http:
paths:
- backend:
serviceName: echo1
servicePort: 80
- host: echo2.hjdo.net
http:
paths:
- backend:
serviceName: echo2
servicePort: 80
Aqui, adicionamos algumas anotações para especificar a ingress.class
, a qual determina o controlador do Ingress que deve ser usado para implementar as regras do Ingress. Além disso, definimos o cluster-issuer
para ser o letsencrypt-staging
, o emissor de certificados que acabamos de criar.
Por fim, adicionamos um bloco tls
para especificar os hosts para os quais queremos adquirir certificados e especificar um secretName
. Esse segredo irá conter a chave privada do TLS e o certificado emitido.
Quando terminar de fazer as alterações, salve e feche o arquivo.
Agora, vamos atualizar o recurso do Ingress existente usando o kubectl apply
:
- kubectl apply -f echo_ingress.yaml
Você deve ver o seguinte resultado:
Outputingress.networking.k8s.io/echo-ingress configured
É possível usar o 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 CREATE 14m nginx-ingress-controller Ingress default/echo-ingress
Normal CreateCertificate 67s cert-manager Successfully created Certificate "echo-tls"
Normal UPDATE 53s nginx-ingress-controller Ingress default/echo-ingress
Assim que o certificado tiver sido criado com sucesso, você poderá executar um describe
adicional nele para confirmar que sua criação foi bem-sucedida:
- kubectl describe certificate
Você deve ver o seguinte resultado na seção Events
:
OutputEvents:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal GeneratedKey 2m12s cert-manager Generated a new private key
Normal Requested 2m12s cert-manager Created new CertificateRequest resource "echo-tls-3768100355"
Normal Issued 47s cert-manager Certificate issued successfully
Isso confirma que o certificado TLS foi emitido com sucesso e a criptografia do HTTPS agora está ativa para os dois domínios configurados.
Agora, estamos prontos para enviar um pedido para um servidor echo
de back-end para testar o funcionamento correto do HTTPS.
Execute o comando wget
a seguir para enviar um pedido para o echo1.example.com
e imprima os cabeçalhos de resposta para o STDOUT
:
- wget --save-headers -O- echo1.example.com
Você deve ver o seguinte resultado:
Output. . .
HTTP request sent, awaiting response... 308 Permanent Redirect
. . .
ERROR: cannot verify echo1.example.com's certificate, issued by ‘CN=Fake LE Intermediate X1’:
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 habilitado com sucesso, mas o certificado não pode ser verificado, já que ele é um certificado temporário falso emitido pelo servidor de preparação do Let’s Encrypt.
Agora que testamos que tudo funciona usando esse certificado falso temporário, podemos implantar os certificados de produção para os dois hosts, o echo1.example.co
m e o echo2.example.com
.
Neste passo, vamos modificar o procedimento usado para fornecer os certificados de preparo e gerar um certificado de produção válido e verificável para os nossos hosts de Ingress.
Para começar, vamos primeiro criar um certificado de produção ClusterIssuer.
Abra um arquivo chamado prod_issuer.yaml
no seu editor favorito:
nano prod_issuer.yaml
Cole no manifesto seguinte:
apiVersion: cert-manager.io/v1alpha2
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
Note o URL diferente do servidor ACME e o nome da chave secreta do letsencrypt-prod
.
Quando terminar de editar, salve e feche o arquivo.
Agora, implante esse Emissor usando o kubectl
:
- kubectl create -f prod_issuer.yaml
Você deve ver o seguinte resultado:
Outputclusterissuer.cert-manager.io/letsencrypt-prod created
Atualize o echo_ingress.yaml
para usar este novo emissor:
- nano echo_ingress.yaml
Altere o arquivo da seguinte maneira:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: echo-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- echo1.hjdo.net
- echo2.hjdo.net
secretName: echo-tls
rules:
- host: echo1.hjdo.net
http:
paths:
- backend:
serviceName: echo1
servicePort: 80
- host: echo2.hjdo.net
http:
paths:
- backend:
serviceName: echo2
servicePort: 80
Aqui, atualizamos o nome do ClusterIssuer para letsencrypt-prod
.
Assim que estiver satisfeito com suas alterações, salve e feche o arquivo.
Implemente as alterações usando o kubectl apply
:
- kubectl apply -f echo_ingress.yaml
Outputingress.networking.k8s.io/echo-ingress configured
Espere alguns minutos para o servidor de produção do Let’s Encrypt emitir o certificado. Você pode rastrear o andamento do processo, usando a opção kubectl describe
no objeto certificate
:
- kubectl describe certificate echo-tls
Assim que você ver o seguinte resultado, significa que o certificado foi emitido com sucesso:
OutputEvents:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal GeneratedKey 8m10s cert-manager Generated a new private key
Normal Requested 8m10s cert-manager Created new CertificateRequest resource "echo-tls-3768100355"
Normal Requested 35s cert-manager Created new CertificateRequest resource "echo-tls-4217844635"
Normal Issued 10s (x2 over 6m45s) cert-manager Certificate issued successfully
Agora, vamos realizar um teste usando o 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 os pedidos do HTTP estão sendo redirecionados para usar o HTTPS.
Execute o curl
em https://echo1.example.com
:
- curl https://echo1.example.com
Agora, você deve ver o seguinte resultado:
Outputecho1
É possível executar o comando anterior com o sinalizador detalhado -v
para uma busca mais aprofundada no handshake do certificado e para verificar as informações do certificado.
Neste ponto, você já terá configurado o HTTPS com sucesso usando um certificado do Let’s Encrypt para o Ingress do seu Nginx.
Neste guia, você configurou um Ingress para Nginx para balancear carga e rotear pedidos externos para serviços de backend dentro do seu cluster do Kubernetes. Você também protegeu o Ingress, instalando o provedor de certificados cert-manager e configurando um certificado do Let’s Encrypt para dois caminhos de host.
Existem muitas alternativas para o controlador Ingress para Nginx. Para saber mais, consulte o tópico Controladores Ingress da documentação oficial do Kubernetes.
Para obter um guia sobre como implantar o Controlador para o Nginx Ingress usando o gerenciador de pacotes Helm para Kubernetes, consulte o artigo Como configurar um Nginx Ingress no Kubernetes da DigitalOcean usando o Helm.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.