Criar um controlador de entradas HTTPS no Azure Kubernetes Service (AKS)Create an HTTPS ingress controller on Azure Kubernetes Service (AKS)

Um controlador de entrada é uma parte do software que fornece o proxy inverso, encaminhamento de tráfego configurável e terminação de TLS para serviços do Kubernetes.An ingress controller is a piece of software that provides reverse proxy, configurable traffic routing, and TLS termination for Kubernetes services. Recursos de entrada do Kubernetes são utilizados para configurar as regras de entrada e as rotas para serviços individuais do Kubernetes.Kubernetes ingress resources are used to configure the ingress rules and routes for individual Kubernetes services. Utilizar um controlador de entrada e de regras de entrada, um único endereço IP pode servir-se para encaminhar o tráfego para vários serviços num cluster do Kubernetes.Using an ingress controller and ingress rules, a single IP address can be used to route traffic to multiple services in a Kubernetes cluster.

Este artigo mostra-lhe como implementar o [controlador de entradas NGINX] nginx-ingress num cluster do Azure Kubernetes Service (AKS).This article shows you how to deploy the NGINX ingress controller in an Azure Kubernetes Service (AKS) cluster. O [Gestor de cert] cert-manager projeto é utilizado para gerar e configurar automaticamente [vamos encriptar] lets-encrypt certificados.The cert-manager project is used to automatically generate and configure Let's Encrypt certificates. Por fim, duas aplicações são executadas no cluster do AKS, cada um deles está acessível através de um único endereço IP.Finally, two applications are run in the AKS cluster, each of which is accessible over a single IP address.

Também pode:You can also:

Antes de começarBefore you begin

Este artigo pressupõe que tem um cluster do AKS existente.This article assumes that you have an existing AKS cluster. Se precisar de um cluster do AKS, consulte o guia de introdução do AKS [com a CLI do Azure] aks-quickstart-cli ou no portal do Azure.If you need an AKS cluster, see the AKS quickstart using the Azure CLI or using the Azure portal.

Este artigo utiliza o Helm para instalar o controlador de entrada do NGINX, o Gestor de certificado e um exemplo de aplicação web.This article uses Helm to install the NGINX ingress controller, cert-manager, and a sample web app. Tem de ter o Helm inicializado no seu cluster do AKS e utilizar uma conta de serviço para Tiller.You need to have Helm initialized within your AKS cluster and using a service account for Tiller. Certifique-se de que está a utilizar a última versão do Helm.Make sure that you are using the latest release of Helm. Para obter instruções de atualização, consulte a Helm instalar docs. Para obter mais informações sobre como configurar e utilizar o Helm, consulte instalar aplicações com Helm no Azure Kubernetes Service (AKS).For upgrade instructions, see the Helm install docs. For more information on configuring and using Helm, see Install applications with Helm in Azure Kubernetes Service (AKS).

Este artigo também requer a execução da versão 2.0.64 da CLI do Azure ou posterior.This article also requires that you are running the Azure CLI version 2.0.64 or later. Executar az --version para localizar a versão.Run az --version to find the version. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).If you need to install or upgrade, see Install Azure CLI.

Criar um controlador de entradaCreate an ingress controller

Para criar o controlador de entrada, utilize Helm para instalar entrada de nginx.To create the ingress controller, use Helm to install nginx-ingress. Para maior redundância, as duas réplicas dos controladores de entrada de NGINX são implementadas com o --set controller.replicaCount parâmetro.For added redundancy, two replicas of the NGINX ingress controllers are deployed with the --set controller.replicaCount parameter. Para beneficiar totalmente a execução de réplicas do controlador de entrada, certificar-se de que há mais de um nó no cluster do AKS.To fully benefit from running replicas of the ingress controller, make sure there's more than one node in your AKS cluster.

O controlador de entrada também tem de ser agendado num nó de Linux.The ingress controller also needs to be scheduled on a Linux node. Nós do Windows Server (atualmente em pré-visualização no AKS) não deve ser executado o controlador de entrada.Windows Server nodes (currently in preview in AKS) shouldn't run the ingress controller. Um Seletor de nó é especificado com o --set nodeSelector parâmetro para informar o agendador de Kubernetes para executar o controlador de entrada do NGINX num nó baseado em Linux.A node selector is specified using the --set nodeSelector parameter to tell the Kubernetes scheduler to run the NGINX ingress controller on a Linux-based node.

Dica

O exemplo seguinte cria um espaço de nomes do Kubernetes para os recursos de entrada com o nome básico de entrada.The following example creates a Kubernetes namespace for the ingress resources named ingress-basic. Especifique um espaço de nomes para o seu próprio ambiente, conforme necessário.Specify a namespace for your own environment as needed. Se o cluster do AKS não RBAC ativado, adicione --set rbac.create=false para os comandos do Helm.If your AKS cluster is not RBAC enabled, add --set rbac.create=false to the Helm commands.

Dica

Se gostaria de ativar [preservação de IP de origem do cliente] client-source-ip para pedidos de contentores no seu cluster, adicionar --set controller.service.externalTrafficPolicy=Local para o Helm comando de instalação.If you would like to enable client source IP preservation for requests to containers in your cluster, add --set controller.service.externalTrafficPolicy=Local to the Helm install command. A origem de cliente IP é armazenado no cabeçalho do pedido em X-reencaminhados-para.The client source IP is stored in the request header under X-Forwarded-For. Ao utilizar um controlador de entrada com preservação de IP de origem de cliente ativada, o pass-through SSL não funcionará.When using an ingress controller with client source IP preservation enabled, SSL pass-through will not work.

# Create a namespace for your ingress resources
kubectl create namespace ingress-basic

# Use Helm to deploy an NGINX ingress controller
helm install stable/nginx-ingress \
    --namespace ingress-basic \
    --set controller.replicaCount=2 \
    --set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
    --set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux

Durante a instalação, um endereço IP público do Azure é criado para o controlador de entrada.During the installation, an Azure public IP address is created for the ingress controller. Este endereço IP público é estático para o tempo de vida do controlador de entrada.This public IP address is static for the life-span of the ingress controller. Se eliminar o controlador de entrada, a atribuição de endereços IP pública é perdida.If you delete the ingress controller, the public IP address assignment is lost. Se, em seguida, criar um controlador de entrada adicionais, é atribuído um novo endereço IP público.If you then create an additional ingress controller, a new public IP address is assigned. Se pretender manter a utilização do endereço IP público, em vez disso, pode criar um controlador de entrada com um endereço IP público estático.If you wish to retain the use of the public IP address, you can instead create an ingress controller with a static public IP address.

Para obter o endereço IP público, utilize o kubectl get service comando.To get the public IP address, use the kubectl get service command. Demora alguns minutos para que o endereço IP a ser atribuída ao serviço.It takes a few minutes for the IP address to be assigned to the service.

$ kubectl get service -l app=nginx-ingress --namespace ingress-basic

NAME                                             TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
billowing-kitten-nginx-ingress-controller        LoadBalancer   10.0.182.160   51.145.155.210  80:30920/TCP,443:30426/TCP   20m
billowing-kitten-nginx-ingress-default-backend   ClusterIP      10.0.255.77    <none>          80/TCP                       20m

Não existem regras de entrada foram criadas ainda.No ingress rules have been created yet. Se navegar até o endereço IP público, é apresentada a página 404 do padrão do controlador de entrada NGINX.If you browse to the public IP address, the NGINX ingress controller's default 404 page is displayed.

Configurar um nome DNSConfigure a DNS name

Para os certificados HTTPS funcionar corretamente, configure um FQDN para o endereço IP de controlador de entrada.For the HTTPS certificates to work correctly, configure an FQDN for the ingress controller IP address. Atualize o seguinte script com o endereço IP do seu controlador de entrada e um nome exclusivo que pretende utilizar para o FQDN:Update the following script with the IP address of your ingress controller and a unique name that you would like to use for the FQDN:

#!/bin/bash

# Public IP address of your ingress controller
IP="51.145.155.210"

# Name to associate with public IP address
DNSNAME="demo-aks-ingress"

# Get the resource-id of the public ip
PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]" --output tsv)

# Update public ip address with DNS name
az network public-ip update --ids $PUBLICIPID --dns-name $DNSNAME

O controlador de entrada está agora acessível através do FQDN.The ingress controller is now accessible through the FQDN.

Instalar o Gestor de certificadoInstall cert-manager

O controlador de entrada do NGINX oferece suporte a terminação de TLS.The NGINX ingress controller supports TLS termination. Existem várias formas de obter e configurar certificados para HTTPS.There are several ways to retrieve and configure certificates for HTTPS. Este artigo demonstra como utilizar Gestor de cert, que fornece automática [permite encriptar] lets-encrypt geração de certificados e funcionalidade de gestão.This article demonstrates using cert-manager, which provides automatic Lets Encrypt certificate generation and management functionality.

Nota

Este artigo utiliza o staging ambiente para encriptar vamos.This article uses the staging environment for Let's Encrypt. Nas implementações de produção, utilize letsencrypt-prod e https://acme-v02.api.letsencrypt.org/directory nas definições de recursos e ao instalar o gráfico do Helm.In production deployments, use letsencrypt-prod and https://acme-v02.api.letsencrypt.org/directory in the resource definitions and when installing the Helm chart.

Para instalar o controlador de Gestor de certificados num cluster habilitados no RBAC, utilize o seguinte helm install comando:To install the cert-manager controller in an RBAC-enabled cluster, use the following helm install command:

# Install the CustomResourceDefinition resources separately
kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.8/deploy/manifests/00-crds.yaml

# Create the namespace for cert-manager
kubectl create namespace cert-manager

# Label the cert-manager namespace to disable resource validation
kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true

# Add the Jetstack Helm repository
helm repo add jetstack https://charts.jetstack.io

# Update your local Helm chart repository cache
helm repo update

# Install the cert-manager Helm chart
helm install \
  --name cert-manager \
  --namespace cert-manager \
  --version v0.8.0 \
  jetstack/cert-manager

Para obter mais informações sobre a configuração do Gestor de certificados, consulte a cert-Gestor projeto.For more information on cert-manager configuration, see the cert-manager project.

Criar um emissor de cluster de ACCreate a CA cluster issuer

Antes dos certificados podem ser emitidos, Gestor de certificados requer um [emissor] cert-manager-issuer ou [ClusterIssuer] cert-manager-cluster-issuer recursos.Before certificates can be issued, cert-manager requires an Issuer or ClusterIssuer resource. Esses recursos do Kubernetes são idênticos em funcionalidade, no entanto Issuer funciona num único espaço de nomes, e ClusterIssuer funciona em todos os espaços de nomes.These Kubernetes resources are identical in functionality, however Issuer works in a single namespace, and ClusterIssuer works across all namespaces. Para obter mais informações, consulte a [cert-manager emissor] cert-manager-issuer documentação.For more information, see the cert-manager issuer documentation.

Criar um emissor de cluster, tal como cluster-issuer.yaml, usando o manifesto de exemplo seguinte.Create a cluster issuer, such as cluster-issuer.yaml, using the following example manifest. Atualize o endereço de e-mail com um endereço válido da sua organização:Update the email address with a valid address from your organization:

apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
  namespace: ingress-basic
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    email: user@contoso.com
    privateKeySecretRef:
      name: letsencrypt-staging
    http01: {}

Para criar o emissor, utilize o kubectl apply -f cluster-issuer.yaml comando.To create the issuer, use the kubectl apply -f cluster-issuer.yaml command.

$ kubectl apply -f cluster-issuer.yaml

clusterissuer.certmanager.k8s.io/letsencrypt-staging created

Executar aplicações de demonstraçãoRun demo applications

Um controlador de entrada e de uma solução de gestão de certificado foram configuradas.An ingress controller and a certificate management solution have been configured. Agora vamos executadas dois demonstrar aplicativos no seu cluster do AKS.Now let's run two demo applications in your AKS cluster. Neste exemplo, o Helm é utilizada para implementar duas instâncias de um aplicativo "Hello world" simples.In this example, Helm is used to deploy two instances of a simple 'Hello world' application.

Antes de instalar os gráficos do Helm de exemplo, adicione o repositório de exemplos do Azure para o seu ambiente do Helm da seguinte forma:Before you can install the sample Helm charts, add the Azure samples repository to your Helm environment as follows:

helm repo add azure-samples https://azure-samples.github.io/helm-charts/

Crie a primeira aplicação de demonstração de um gráfico Helm com o seguinte comando:Create the first demo application from a Helm chart with the following command:

helm install azure-samples/aks-helloworld --namespace ingress-basic

Agora a instalar uma segunda instância do aplicativo de demonstração.Now install a second instance of the demo application. Para a segunda instância, especifique um novo título para que as duas aplicações são visualmente distintas.For the second instance, you specify a new title so that the two applications are visually distinct. Também especificar um nome de serviço único:You also specify a unique service name:

helm install azure-samples/aks-helloworld \
    --namespace ingress-basic \
    --set title="AKS Ingress Demo" \
    --set serviceName="ingress-demo"

Criar uma rota de entradaCreate an ingress route

Ambos os aplicativos agora estão em execução no seu cluster do Kubernetes, no entanto, estes são configurados com um serviço do tipo ClusterIP.Both applications are now running on your Kubernetes cluster, however they're configured with a service of type ClusterIP. Como tal, os aplicativos não estão acessíveis a partir da internet.As such, the applications aren't accessible from the internet. Para que fiquem disponíveis publicamente, crie um recurso de entrada do Kubernetes.To make them publicly available, create a Kubernetes ingress resource. O recurso de entrada configura as regras que encaminham o tráfego para uma das duas aplicações.The ingress resource configures the rules that route traffic to one of the two applications.

No exemplo a seguir, o tráfego para o endereço https://demo-aks-ingress.eastus.cloudapp.azure.com/ é encaminhado para o serviço com o nome aks-helloworld.In the following example, traffic to the address https://demo-aks-ingress.eastus.cloudapp.azure.com/ is routed to the service named aks-helloworld. O tráfego para o endereço https://demo-aks-ingress.eastus.cloudapp.azure.com/hello-world-two é encaminhado para o ingress-demo serviço.Traffic to the address https://demo-aks-ingress.eastus.cloudapp.azure.com/hello-world-two is routed to the ingress-demo service. Atualização do anfitriões e anfitrião para o nome DNS que criou no passo anterior.Update the hosts and host to the DNS name you created in a previous step.

Crie um ficheiro denominado hello-world-ingress.yaml e copie o exemplo seguinte YAML.Create a file named hello-world-ingress.yaml and copy in the following example YAML.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hello-world-ingress
  namespace: ingress-basic
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt-staging
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  tls:
  - hosts:
    - demo-aks-ingress.eastus.cloudapp.azure.com
    secretName: tls-secret
  rules:
  - host: demo-aks-ingress.eastus.cloudapp.azure.com
    http:
      paths:
      - backend:
          serviceName: aks-helloworld
          servicePort: 80
        path: /(.*)
      - backend:
          serviceName: ingress-demo
          servicePort: 80
        path: /hello-world-two(/|$)(.*)

Crie o recurso de entrada com o kubectl apply -f hello-world-ingress.yaml comando.Create the ingress resource using the kubectl apply -f hello-world-ingress.yaml command.

$ kubectl apply -f hello-world-ingress.yaml

ingress.extensions/hello-world-ingress created

Criar um objeto de certificadoCreate a certificate object

Em seguida, um recurso de certificado tem de ser criado.Next, a certificate resource must be created. O recurso de certificado define o certificado X.509 desejado.The certificate resource defines the desired X.509 certificate. Para obter mais informações, consulte cert-Gestor certificados.For more information, see cert-manager certificates.

Gestor de CERT provavelmente criou automaticamente um objeto de certificado para si com entrada-shim, que é implementada automaticamente com o Gestor de cert desde v0.2.2.Cert-manager has likely automatically created a certificate object for you using ingress-shim, which is automatically deployed with cert-manager since v0.2.2. Para obter mais informações, consulte a documentação de entrada shim.For more information, see the ingress-shim documentation.

Para verificar se o certificado foi criado com êxito, utilize o kubectl describe certificate tls-secret --namespace ingress-basic comando.To verify that the certificate was created successfully, use the kubectl describe certificate tls-secret --namespace ingress-basic command.

Se o certificado foi emitido, verá um resultado semelhante ao seguinte:If the certificate was issued, you will see output similar to the following:

Type    Reason          Age   From          Message
----    ------          ----  ----          -------
  Normal  CreateOrder     11m   cert-manager  Created new ACME order, attempting validation...
  Normal  DomainVerified  10m   cert-manager  Domain "demo-aks-ingress.eastus.cloudapp.azure.com" verified with "http-01" validation
  Normal  IssueCert       10m   cert-manager  Issuing certificate...
  Normal  CertObtained    10m   cert-manager  Obtained certificate from ACME server
  Normal  CertIssued      10m   cert-manager  Certificate issued successfully

Se precisar de criar um recurso de certificado adicionais, pode fazê-lo com o manifesto de exemplo seguinte.If you need to create an additional certificate resource, you can do so with the following example manifest. Atualização do dnsNames e domínios para o nome DNS que criou no passo anterior.Update the dnsNames and domains to the DNS name you created in a previous step. Se usar um controlador de entrada apenas internos, especifique o nome DNS interno para o seu serviço.If you use an internal-only ingress controller, specify the internal DNS name for your service.

apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: tls-secret
  namespace: ingress-basic
spec:
  secretName: tls-secret-staging
  dnsNames:
  - demo-aks-ingress.eastus.cloudapp.azure.com
  acme:
    config:
    - http01:
        ingressClass: nginx
      domains:
      - demo-aks-ingress.eastus.cloudapp.azure.com
  issuerRef:
    name: letsencrypt-staging
    kind: ClusterIssuer

Para criar o recurso de certificado, utilize o kubectl apply -f certificates.yaml comando.To create the certificate resource, use the kubectl apply -f certificates.yaml command.

$ kubectl apply -f certificates.yaml

certificate.certmanager.k8s.io/tls-secret-staging created

Testar a configuração de entradaTest the ingress configuration

Abra um navegador da web para o FQDN do seu controlador de entrada do Kubernetes, tal como https://demo-aks-ingress.eastus.cloudapp.azure.com .Open a web browser to the FQDN of your Kubernetes ingress controller, such as https://demo-aks-ingress.eastus.cloudapp.azure.com.

Conforme estes exemplos utilizam letsencrypt-staging, o certificado emitido de SSL não é considerado fidedigno pelo navegador.As these examples use letsencrypt-staging, the issued SSL certificate is not trusted by the browser. Aceite o pedido de aviso para continuar a sua aplicação.Accept the warning prompt to continue to your application. As informações do certificado mostram isso falsificação LE X1 intermediários certificado é emitido por vamos encriptar.The certificate information shows this Fake LE Intermediate X1 certificate is issued by Let's Encrypt. Este certificado falso indica cert-manager processou o pedido corretamente e recebeu um certificado do fornecedor:This fake certificate indicates cert-manager processed the request correctly and received a certificate from the provider:

Vamos encriptar o certificado de teste

Quando altera a encriptar vamos usar prod vez staging, é utilizado um certificado fidedigno emitido por vamos encriptar, conforme mostrado no exemplo a seguir:When you change Let's Encrypt to use prod rather than staging, a trusted certificate issued by Let's Encrypt is used, as shown in the following example:

Vamos encriptar certificado

A aplicação de demonstração é mostrada no navegador da web:The demo application is shown in the web browser:

Um exemplo de aplicativo

Agora, adicione a /hello-world-two caminho para o FQDN, tal como https://demo-aks-ingress.eastus.cloudapp.azure.com/hello-world-two .Now add the /hello-world-two path to the FQDN, such as https://demo-aks-ingress.eastus.cloudapp.azure.com/hello-world-two. O segundo aplicativo de demonstração com o título personalizado é apresentado:The second demo application with the custom title is shown:

Exemplo de aplicativo dois

Limpar recursosClean up resources

Este artigo usou o Helm para instalar os componentes de entrada, certificados e aplicações de exemplo.This article used Helm to install the ingress components, certificates, and sample apps. Quando implementa um gráfico Helm, um número de recursos do Kubernetes é criado.When you deploy a Helm chart, a number of Kubernetes resources are created. Estes recursos incluem pods, implementações e serviços.These resources includes pods, deployments, and services. Para limpar estes recursos, pode optar por eliminar o espaço de nomes de exemplo inteiro ou os recursos individuais.To clean up these resources, you can either delete the entire sample namespace, or the individual resources.

Eliminar o espaço de nomes de exemplo e todos os recursosDelete the sample namespace and all resources

Para eliminar o espaço de nomes de exemplo completo, utilize o kubectl delete de comando e especifique o nome do espaço de nomes.To delete the entire sample namespace, use the kubectl delete command and specify your namespace name. Todos os recursos no espaço de nomes são eliminados.All the resources in the namespace are deleted.

kubectl delete namespace ingress-basic

Em seguida, remova o repositório Helm para a aplicação hello world do AKS:Then, remove the Helm repo for the AKS hello world app:

helm repo remove azure-samples

Eliminar recursos individualmenteDelete resources individually

Em alternativa, uma abordagem mais granular é eliminar os recursos individuais que criou.Alternatively, a more granular approach is to delete the individual resources created. Primeiro, remova os recursos de certificado:First, remove the certificate resources:

kubectl delete -f certificates.yaml
kubectl delete -f cluster-issuer.yaml

Agora, lista as versões do Helm com a helm list comando.Now list the Helm releases with the helm list command. Procure gráficos chamados entrada de nginx, Gestor de certificado, e aks-helloworld, conforme mostrado no seguinte exemplo:Look for charts named nginx-ingress, cert-manager, and aks-helloworld, as shown in the following example output:

$ helm list

NAME                    REVISION    UPDATED                     STATUS      CHART                   APP VERSION NAMESPACE
billowing-kitten        1           Wed Mar  6 19:37:43 2019    DEPLOYED    nginx-ingress-1.3.1     0.22.0      kube-system
loitering-waterbuffalo  1           Wed Mar  6 20:25:01 2019    DEPLOYED    cert-manager-v0.6.6     v0.6.2      kube-system
flabby-deer             1           Wed Mar  6 20:27:54 2019    DEPLOYED    aks-helloworld-0.1.0                default
linting-echidna         1           Wed Mar  6 20:27:59 2019    DEPLOYED    aks-helloworld-0.1.0                default

Eliminar as versões com a helm delete comando.Delete the releases with the helm delete command. O exemplo seguinte elimina a implementação de entrada do NGINX, o Gestor de certificados e as dois exemplos AKS Olá mundo de aplicações.The following example deletes the NGINX ingress deployment, certificate manager, and the two sample AKS hello world apps.

$ helm delete billowing-kitten loitering-waterbuffalo flabby-deer linting-echidna

release "billowing-kitten" deleted
release "loitering-waterbuffalo" deleted
release "flabby-deer" deleted
release "linting-echidna" deleted

Em seguida, remova o repositório Helm para a aplicação hello world do AKS:Next, remove the Helm repo for the AKS hello world app:

helm repo remove azure-samples

Elimine o próprio espaço de nomes.Delete the itself namespace. Utilize o kubectl delete de comando e especifique o nome do espaço de nomes:Use the kubectl delete command and specify your namespace name:

kubectl delete namespace ingress-basic

Por fim, remova a rota de entrada que eram direcionadas para o tráfego para as aplicações de exemplo:Finally, remove the ingress route that directed traffic to the sample apps:

kubectl delete -f hello-world-ingress.yaml

Passos SeguintesNext steps

Este artigo inclui alguns componentes externos ao AKS.This article included some external components to AKS. Para saber mais sobre estes componentes, consulte as seguintes páginas do projeto:To learn more about these components, see the following project pages:

Também pode:You can also: