Criar um controlador de entrada HTTPS e usar seus próprios certificados TLS no serviço kubernetes do Azure (AKS)Create an HTTPS ingress controller and use your own TLS certificates on Azure Kubernetes Service (AKS)

Um controlador de entrada é uma parte do software que fornece proxy reverso, roteamento de tráfego configurável e terminação de TLS para serviços Kubernetess.An ingress controller is a piece of software that provides reverse proxy, configurable traffic routing, and TLS termination for Kubernetes services. Os recursos de entrada do kubernetes são usados para configurar as regras de entrada e rotas para serviços individuais do kubernetes.Kubernetes ingress resources are used to configure the ingress rules and routes for individual Kubernetes services. Usando um controlador de entrada e regras de entrada, um único endereço IP pode ser usado para rotear o tráfego para vários serviços em um cluster 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 como implantar o controlador de entrada Nginx em um cluster do AKS (serviço kubernetes do Azure).This article shows you how to deploy the NGINX ingress controller in an Azure Kubernetes Service (AKS) cluster. Você gera seus próprios certificados e cria um segredo kubernetes para uso com a rota de entrada.You generate your own certificates, and create a Kubernetes secret for use with the ingress route. Por fim, dois aplicativos são executados no cluster AKS, cada um deles acessível por 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 usa Helm para instalar o controlador de entrada do NGINX e um aplicativo Web de exemplo.This article uses Helm to install the NGINX ingress controller and a sample web app. Você precisa ter o Helm inicializado em seu cluster AKS e usar uma conta de serviço para o gaveta.You need to have Helm initialized within your AKS cluster and using a service account for Tiller. Verifique se você está usando a versão mais recente do Helm.Make sure that you are using the latest release of Helm. Para obter instruções de atualização, consulte o Helm instalar documentos. Para obter mais informações sobre como configurar e usar o Helm, consulte instalar aplicativos com Helm no serviço kubernetes do Azure (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 que você esteja executando o CLI do Azure versão 2.0.64 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 Instalar a CLI do Azure.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, use Helm para instalar o Nginx-Ingres.To create the ingress controller, use Helm to install nginx-ingress. Para redundância adicional, duas réplicas dos controladores de entrada do Nginx são implantadas com --set controller.replicaCount o parâmetro.For added redundancy, two replicas of the NGINX ingress controllers are deployed with the --set controller.replicaCount parameter. Para se beneficiar totalmente da execução de réplicas do controlador de entrada, verifique se há mais de um nó no cluster 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 precisa ser agendado em um nó do Linux.The ingress controller also needs to be scheduled on a Linux node. Os nós do Windows Server (atualmente em visualização no AKS) não devem executar o controlador de entrada.Windows Server nodes (currently in preview in AKS) shouldn't run the ingress controller. Um seletor de nó é especificado --set nodeSelector usando o parâmetro para instruir o Agendador kubernetes a executar o controlador de entrada Nginx em um 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 a seguir cria um namespace kubernetes para os recursos de entrada chamados ingress-Basic.The following example creates a Kubernetes namespace for the ingress resources named ingress-basic. Especifique um namespace para seu próprio ambiente, conforme necessário.Specify a namespace for your own environment as needed. Se o cluster AKs não estiver habilitado para RBAC, --set rbac.create=false adicione aos comandos Helm.If your AKS cluster is not RBAC enabled, add --set rbac.create=false to the Helm commands.

Dica

Se você quiser habilitar a preservação de IP de origem do cliente para solicitações a contêineres em seu --set controller.service.externalTrafficPolicy=Local cluster, adicione ao comando Helm install.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. O IP de origem do cliente é armazenado no cabeçalho da solicitação em X-forwardd-for.The client source IP is stored in the request header under X-Forwarded-For. Ao usar um controlador de entrada com preservação de IP de origem do cliente habilitada, a passagem 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. Esse endereço IP público é estático para o período de vida útil do controlador de entrada.This public IP address is static for the life-span of the ingress controller. Se você excluir o controlador de entrada, a atribuição de endereço IP público será perdida.If you delete the ingress controller, the public IP address assignment is lost. Se você criar um controlador de entrada adicional, um novo endereço IP público será atribuído.If you then create an additional ingress controller, a new public IP address is assigned. Se você quiser manter o uso do endereço IP público, poderá 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, use o kubectl get service comando.To get the public IP address, use the kubectl get service command. Leva alguns minutos para que o endereço IP seja atribuído 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
virulent-seal-nginx-ingress-controller        LoadBalancer   10.0.48.240   40.87.46.190   80:31159/TCP,443:30657/TCP   7m
virulent-seal-nginx-ingress-default-backend   ClusterIP      10.0.50.5     <none>         80/TCP                       7m

Anote esse endereço IP público, pois ele é usado na última etapa para testar a implantação.Make a note of this public IP address, as it's used in the last step to test the deployment.

Nenhuma regra de entrada foi criada ainda.No ingress rules have been created yet. Se você navegar até o endereço IP público, a página padrão 404 do controlador de entrada do NGINX será exibida.If you browse to the public IP address, the NGINX ingress controller's default 404 page is displayed.

Gerar certificados TLSGenerate TLS certificates

Para este artigo, vamos gerar um certificado autoassinado com openssl.For this article, let's generate a self-signed certificate with openssl. Para uso em produção, você deve solicitar um certificado assinado e confiável por meio de um provedor ou sua própria autoridade de certificação (CA).For production use, you should request a trusted, signed certificate through a provider or your own certificate authority (CA). Na próxima etapa, você gerará um segredo kubernetes usando o certificado TLS e a chave privada gerada pelo OpenSSL.In the next step, you generate a Kubernetes Secret using the TLS certificate and private key generated by OpenSSL.

O exemplo a seguir gera um certificado X509 RSA de 2048 bits válido para 365 dias denominados AKs-ingress-TLS. CRT.The following example generates a 2048-bit RSA X509 certificate valid for 365 days named aks-ingress-tls.crt. O arquivo de chave privada é denominado AKs-ingress-TLS. Key.The private key file is named aks-ingress-tls.key. Um segredo do kubernetes TLS requer esses dois arquivos.A Kubernetes TLS secret requires both of these files.

Este artigo funciona com o nome comum da entidade demo.Azure.com e não precisa ser alterado.This article works with the demo.azure.com subject common name and doesn't need to be changed. Para uso em produção, especifique seus próprios valores organizacionais -subj para o parâmetro:For production use, specify your own organizational values for the -subj parameter:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -out aks-ingress-tls.crt \
    -keyout aks-ingress-tls.key \
    -subj "/CN=demo.azure.com/O=aks-ingress-tls"

Criar o segredo kubernetes para o certificado TLSCreate Kubernetes secret for the TLS certificate

Para permitir que o kubernetes use o certificado TLS e a chave privada para o controlador de entrada, você cria e usa um segredo.To allow Kubernetes to use the TLS certificate and private key for the ingress controller, you create and use a Secret. O segredo é definido uma vez e usa o certificado e o arquivo de chave criados na etapa anterior.The secret is defined once, and uses the certificate and key file created in the previous step. Em seguida, você faz referência a esse segredo ao definir rotas de entrada.You then reference this secret when you define ingress routes.

O exemplo a seguir cria um nome secreto AKs-ingress-TLS:The following example creates a Secret name aks-ingress-tls:

kubectl create secret tls aks-ingress-tls \
    --namespace ingress-basic \
    --key aks-ingress-tls.key \
    --cert aks-ingress-tls.crt

Executar aplicativos de demonstraçãoRun demo applications

Um controlador de entrada e um segredo com seu certificado foram configurados.An ingress controller and a Secret with your certificate have been configured. Agora, vamos executar dois aplicativos de demonstração em seu cluster AKS.Now let's run two demo applications in your AKS cluster. Neste exemplo, Helm é usado para implantar 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 de exemplo do Helm, adicione o repositório de exemplos do Azure ao seu ambiente Helm da seguinte maneira: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 o primeiro aplicativo de demonstração de um gráfico do 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, instale uma segunda instância do aplicativo de demonstração.Now install a second instance of the demo application. Para a segunda instância, você especifica um novo título para que os dois aplicativos sejam visualmente distintos.For the second instance, you specify a new title so that the two applications are visually distinct. Você também especifica um nome de serviço exclusivo: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

Os dois aplicativos agora estão em execução no cluster kubernetes, no entanto, eles 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. Assim, os aplicativos não são acessíveis pela Internet.As such, the applications aren't accessible from the internet. Para torná-los publicamente disponíveis, 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 roteiam o tráfego para um dos dois aplicativos.The ingress resource configures the rules that route traffic to one of the two applications.

No exemplo a seguir, o tráfego para o https://demo.azure.com/ endereço é roteado para o aks-helloworldserviço chamado.In the following example, traffic to the address https://demo.azure.com/ is routed to the service named aks-helloworld. O tráfego para o https://demo.azure.com/hello-world-two endereço é roteado ingress-demo para o serviço.Traffic to the address https://demo.azure.com/hello-world-two is routed to the ingress-demo service. Para este artigo, você não precisa alterar os nomes de host de demonstração.For this article, you don't need to change those demo host names. Para uso em produção, forneça os nomes especificados como parte do processo de solicitação e geração de certificado.For production use, provide the names specified as part of the certificate request and generation process.

Dica

Se o nome do host especificado durante o processo de solicitação de certificado, o nome CN não corresponder ao host definido em sua rota de entrada, o controlador de entrada exibirá um aviso de certificado falso do controlador de entrada do kubernetes .If the host name specified during the certificate request process, the CN name, doesn't match the host defined in your ingress route, you ingress controller displays a Kubernetes Ingress Controller Fake Certificate warning. Verifique se os nomes de host do certificado e da rota de entrada correspondem.Make sure your certificate and ingress route host names match.

A seção TLS informa a rota de entrada para usar o segredo chamado AKs-ingress-TLS para o host demo.Azure.com.The tls section tells the ingress route to use the Secret named aks-ingress-tls for the host demo.azure.com. Novamente, para uso em produção, especifique seu próprio endereço de host.Again, for production use, specify your own host address.

Crie um arquivo chamado hello-world-ingress.yaml e copie no exemplo a seguir 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
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  tls:
  - hosts:
    - demo.azure.com
    secretName: aks-ingress-tls
  rules:
  - host: demo.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 usando 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

Testar a configuração de entradaTest the ingress configuration

Para testar os certificados com nosso host demo.Azure.com falso, use curl e especifique o parâmetro --resolve .To test the certificates with our fake demo.azure.com host, use curl and specify the --resolve parameter. Esse parâmetro permite mapear o nome do demo.Azure.com para o endereço IP público do controlador de entrada.This parameter lets you map the demo.azure.com name to the public IP address of your ingress controller. Especifique o endereço IP público de seu próprio controlador de entrada, conforme mostrado no exemplo a seguir:Specify the public IP address of your own ingress controller, as shown in the following example:

curl -v -k --resolve demo.azure.com:443:40.87.46.190 https://demo.azure.com

Nenhum caminho adicional foi fornecido com o endereço, portanto, o controlador de entrada usa como padrão / a rota.No additional path was provided with the address, so the ingress controller defaults to the / route. O primeiro aplicativo de demonstração é retornado, conforme mostrado na seguinte saída de exemplo condensada:The first demo application is returned, as shown in the following condensed example output:

$ curl -v -k --resolve demo.azure.com:443:40.87.46.190 https://demo.azure.com

[...]
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <link rel="stylesheet" type="text/css" href="/static/default.css">
    <title>Welcome to Azure Kubernetes Service (AKS)</title>
[...]

O parâmetro -v em nosso curl comando gera informações detalhadas, incluindo o certificado TLS recebido.The -v parameter in our curl command outputs verbose information, including the TLS certificate received. Meio-caminho por meio de sua saída de ondulação, você pode verificar se o seu próprio certificado TLS foi usado.Half-way through your curl output, you can verify that your own TLS certificate was used. O parâmetro -k continua carregando a página, embora estejamos usando um certificado autoassinado.The -k parameter continues loading the page even though we're using a self-signed certificate. O exemplo a seguir mostra que o emissor: CN = demo. Azure. com; O = AKs-ingresso do certificado TLS foi usado:The following example shows that the issuer: CN=demo.azure.com; O=aks-ingress-tls certificate was used:

[...]
* Server certificate:
*  subject: CN=demo.azure.com; O=aks-ingress-tls
*  start date: Oct 22 22:13:54 2018 GMT
*  expire date: Oct 22 22:13:54 2019 GMT
*  issuer: CN=demo.azure.com; O=aks-ingress-tls
*  SSL certificate verify result: self signed certificate (18), continuing anyway.
[...]

Agora, adicione o caminho /Hello-World-Two ao endereço, como https://demo.azure.com/hello-world-two.Now add /hello-world-two path to the address, such as https://demo.azure.com/hello-world-two. O segundo aplicativo de demonstração com o título personalizado é retornado, conforme mostrado na seguinte saída de exemplo condensada:The second demo application with the custom title is returned, as shown in the following condensed example output:

$ curl -v -k --resolve demo.azure.com:443:137.117.36.18 https://demo.azure.com/hello-world-two

[...]
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <link rel="stylesheet" type="text/css" href="/static/default.css">
    <title>AKS Ingress Demo</title>
[...]

Limpar recursosClean up resources

Este artigo usou o Helm para instalar os componentes de entrada e aplicativos de exemplo.This article used Helm to install the ingress components and sample apps. Quando você implanta um gráfico do Helm, vários recursos do kubernetes são criados.When you deploy a Helm chart, a number of Kubernetes resources are created. Esses recursos incluem pods, implantações e serviços.These resources include pods, deployments, and services. Para limpar esses recursos, você pode excluir o namespace de exemplo inteiro ou os recursos individuais.To clean up these resources, you can either delete the entire sample namespace, or the individual resources.

Excluir o namespace de exemplo e todos os recursosDelete the sample namespace and all resources

Para excluir o namespace de exemplo inteiro, use kubectl delete o comando e especifique o nome do namespace.To delete the entire sample namespace, use the kubectl delete command and specify your namespace name. Todos os recursos no namespace são excluídos.All the resources in the namespace are deleted.

kubectl delete namespace ingress-basic

Em seguida, remova o repositório Helm para o aplicativo Hello World do AKS:Then, remove the Helm repo for the AKS hello world app:

helm repo remove azure-samples

Excluir recursos individualmenteDelete resources individually

Como alternativa, uma abordagem mais granular é excluir os recursos individuais criados.Alternatively, a more granular approach is to delete the individual resources created. Liste as versões Helm com helm list o comando.List the Helm releases with the helm list command. Procure gráficos chamados Nginx-ingress e AKs-HelloWorld, conforme mostrado na seguinte saída de exemplo:Look for charts named nginx-ingress and aks-helloworld, as shown in the following example output:

$ helm list

NAME            REVISION    UPDATED                     STATUS      CHART                   APP VERSION NAMESPACE
virulent-seal   1           Tue Oct 23 16:37:24 2018    DEPLOYED    nginx-ingress-0.22.1    0.15.0      kube-system
billowing-guppy 1           Tue Oct 23 16:41:38 2018    DEPLOYED    aks-helloworld-0.1.0                default
listless-quokka 1           Tue Oct 23 16:41:30 2018    DEPLOYED    aks-helloworld-0.1.0                default

Exclua as versões com helm delete o comando.Delete the releases with the helm delete command. O exemplo a seguir exclui a implantação de entrada do NGINX e os dois aplicativos de exemplo do AKS Hello World.The following example deletes the NGINX ingress deployment and the two sample AKS hello world apps.

$ helm delete virulent-seal billowing-guppy listless-quokka

release "virulent-seal" deleted
release "billowing-guppy" deleted
release "listless-quokka" deleted

Em seguida, remova o repositório Helm para o aplicativo Hello World do AKS:Next, remove the Helm repo for the AKS hello world app:

helm repo remove azure-samples

Remova a rota de entrada que direcionou o tráfego para os aplicativos de exemplo:Remove the ingress route that directed traffic to the sample apps:

kubectl delete -f hello-world-ingress.yaml

Exclua o segredo do certificado:Delete the certificate Secret:

kubectl delete secret aks-ingress-tls

Por fim, você pode excluir o namespace em si.Finally, you can delete the itself namespace. Use o kubectl delete comando e especifique o nome do namespace:Use the kubectl delete command and specify your namespace name:

kubectl delete namespace ingress-basic

Passos SeguintesNext steps

Este artigo incluía alguns componentes externos no AKS.This article included some external components to AKS. Para saber mais sobre esses 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: