Configurações avançadas de entrada e controlador de entrada NGINX com o complemento de roteamento de aplicativos
O complemento de roteamento de aplicativos dá suporte a duas maneiras de configurar controladores de entrada e objetos de entrada:
- Configuração do controlador de entrada NGINX, como criar vários controladores, configurar balanceadores de carga privados e definir endereços IP estáticos.
- Configuração por recurso de entrada por meio de anotações.
Pré-requisitos
Um cluster do AKS com o complemento de roteamento de aplicativos.
Conectar-se ao cluster do AKS
Para se conectar ao cluster do Kubernetes no computador local, use o kubectl
, o cliente de linha de comando do Kubernetes. Instale-o localmente usando o comando az aks install-cli. Se você usa o Azure Cloud Shell, o kubectl
já estará instalado.
Configure o kubectl para se conectar ao seu cluster do Kubernetes usando o comando az aks get-credentials
.
az aks get-credentials -resource-group <ResourceGroupName> --name <ClusterName>
Configuração do controlador de entrada NGINX
O complemento de roteamento de aplicativos usa uma definição de recurso personalizado (CRD) do Kubernetes chamada NginxIngressController
para configurar controladores de entrada NGINX. Você pode criar mais controladores de entrada ou modificar a configuração existente.
Aqui está uma referência às propriedades que você pode definir para configurar um NginxIngressController
.
Propriedade | Descrição |
---|---|
ingressClassName | O nome do IngressClass que será usado para o controlador de entrada NGINX. O padrão é o nome do NginxIngressController se não for especificado. |
controllerNamePrefix | Um nome usado para prefixar os recursos gerenciados do controlador de entrada NGINX. Assume o padrão de nginx . |
loadBalancerAnnotations | Um conjunto de anotações para controlar o comportamento do serviço do controlador de entrada NGINX, definindo anotações do balanceador de carga |
escala | Opções de configuração de como o controlador de entrada NGINX é dimensionado. |
scaling.minReplicas | O limite inferior para o número de réplicas do entrada Controller. O padrão é 2 pods. |
scaling.maxReplicas | O limite superior para o número de réplicas do entrada Controller. O padrão é 100 pods. |
scaling.threshold | Define a rapidez com que os pods do controlador de entrada NGINX devem ser dimensionados com base na carga de trabalho. Rapid significa que o entrada Controller será dimensionado de forma rápida e agressiva para lidar com picos de tráfego repentinos e significativos. Steady prioriza a economia com menos réplicas e mais trabalho. Balanced é uma boa combinação entre os dois que funciona para a maioria dos casos de uso. Se não for especificado, esse campo será padronizado como Balanced . |
defaultBackendService | O serviço Kubernetes que o controlador de ingresso NGINX deve usar como padrão, que lida com todos os caminhos de URL e hospeda o controlador entrada-NGINX não entende (ou seja, todas as solicitações que não são mapeadas com um Ingress). O controlador direciona o tráfego para a primeira porta do serviço. Se não for especificado, isso usará o backend padrão que está integrado. |
defaultBackendService.namespace | Namespace do serviço. |
defaultBackendService.name | Nome do serviço. |
defaultSSLCertificate | O segredo referido por essa propriedade contém o certificado padrão a ser usado ao acessar o serviço de backend padrão. Se essa propriedade não for fornecida, o NGINX usará um certificado autoassinado. Se a seção tls: não estiver definida em um entrada, o NGINX fornecerá o certificado padrão, mas não forçará o redirecionamento HTTPS. |
defaultSSLCertificate.forceSSLRedirect | Força um redirecionamento para entrada que não especificam uma seção tls: . |
defaultSSLCertificate.keyVaultURI | O URI do Azure Key Vault onde o certificado SSL padrão pode ser encontrado. O complemento precisa ser configurado para usar o cofre de chaves. |
defaultSSLCertificate.secret | Configura o nome e o namespace onde o segredo SSL padrão está no cluster. |
defaultSSLCertificate.secret.name | Nome do segredo. |
defaultSSLCertificate.secret.namespace | Namespace do segredo. |
Configurações comuns
Controlar a configuração padrão do controlador de entrada NGINX (versão prévia)
Observação
O controle da configuração do controlador de entrada NGINX ao habilitar o complemento está disponível em API 2024-06-02-preview
, no Kubernetes versão 1.30 ou posterior e na versão prévia do AKS, extensão da CLI do Azure, versão 7.0.0b5
ou posterior. Para verificar a versão do cluster do AKS, consulte Verificar se há atualizações de cluster do AKS disponíveis.
Quando você habilita o complemento de roteamento de aplicativos com o NGINX, ele cria um controlador de entrada chamado default
no app-routing-namespace
configurado com um balanceador de carga do Azure voltado para o público. Esse controlador de entrada usa um nome de classe de entrada de webapprouting.kubernetes.azure.com
.
Você também pode controlar se o padrão obtém um IP público ou interno ou se ele é criado ao habilitar o complemento.
Aqui estão as opções de configuração possíveis:
None
: o controlador de entrada Nginx padrão não é criado e não será excluído se ele já existir. Os usuários devem excluir o recurso personalizado padrãoNginxIngressController
manualmente, se desejado.Internal
: o controlador de entrada Nginx padrão é criado com um balanceador de carga interno. Qualquer alteração de anotações no recurso personalizadoNginxIngressController
para torná-lo externo será substituída.External
: o controlador de entrada Nginx padrão criado com um balanceador de carga externo. Qualquer alteração de anotações no recurso personalizadoNginxIngressController
para torná-lo interno será substituída.AnnotationControlled
(padrão): o controlador de entrada Nginx padrão é criado com um balanceador de carga externo. Os usuários podem editar o recurso personalizado padrãoNginxIngressController
para configurar anotações do balanceador de carga.
Controlar a configuração padrão do controlador de entrada ao criar o cluster
Para habilitar o roteamento de aplicativos em um novo cluster, use o comando az aks create
, especificando os sinalizadores --enable-app-routing
e --app-routing-default-nginx-controller
. Você precisa definir <DefaultIngressControllerType>
como uma das opções de configuração descritas anteriormente.
az aks create \
--resource-group <ResourceGroupName> \
--name <ClusterName> \
--location <Location> \
--enable-app-routing \
--app-routing-default-nginx-controller <DefaultIngressControllerType>
Atualizar a configuração padrão do controlador de entrada em um cluster existente
Para atualizar a configuração do controlador de entrada padrão de roteamento de aplicativos em um cluster existente, use o comando az aks approuting update
, especificando o sinalizador --nginx
. Você precisa definir <DefaultIngressControllerType>
como uma das opções de configuração descritas anteriormente.
az aks approuting update --resource-group <ResourceGroupName> --name <ClusterName> --nginx <DefaultIngressControllerType>
Criar outro controlador de entrada NGINX voltado para o público
Para criar outro controlador de entrada NGINX com um Azure Load Balancer voltado para o público:
Copie o manifesto YAML a seguir em um novo arquivo chamado nginx-public-controller.yaml e salve o arquivo em seu computador local.
apiVersion: approuting.kubernetes.azure.com/v1alpha1 kind: NginxIngressController metadata: name: nginx-public spec: ingressClassName: nginx-public controllerNamePrefix: nginx-public
Crie os recursos do controlador de entrada NGINX usando o comando
kubectl apply
.kubectl apply -f nginx-public-controller.yaml
O seguinte exemplo de saída mostra o recurso criado:
nginxingresscontroller.approuting.kubernetes.azure.com/nginx-public created
Criar um controlador de entrada NGINX interno com um endereço IP privado
Para criar um controlador de entrada NGINX com um Azure Load Balancer voltado para dentro com um endereço IP privado:
Copie o manifesto YAML a seguir em um novo arquivo chamado nginx-internal-controller.yaml e salve o arquivo em seu computador local.
apiVersion: approuting.kubernetes.azure.com/v1alpha1 kind: NginxIngressController metadata: name: nginx-internal spec: ingressClassName: nginx-internal controllerNamePrefix: nginx-internal loadBalancerAnnotations: service.beta.kubernetes.io/azure-load-balancer-internal: "true"
Crie os recursos do controlador de entrada NGINX usando o comando
kubectl apply
.kubectl apply -f nginx-internal-controller.yaml
O seguinte exemplo de saída mostra o recurso criado:
nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
Criar um controlador de entrada NGINX com um endereço IP estático
Para criar um controlador de entrada NGINX com um endereço IP estático no Azure Load Balancer:
Crie um grupo de recursos do Azure usando o comando
az group create
.az group create --name myNetworkResourceGroup --location eastus
Crie um endereço IP público estático usando o comando
az network public ip create
.az network public-ip create \ --resource-group myNetworkResourceGroup \ --name myIngressPublicIP \ --sku Standard \ --allocation-method static
Observação
Se você estiver usando um balanceador de carga de SKU Básico no seu cluster do AKS, use Básico no parâmetro
--sku
ao definir um IP público. Somente os IPs de SKU Básico funcionam com o balanceador de carga de SKU Básico e somente os IPs de SKU Standard funcionam com os balanceadores de carga de SKU Standard.Certifique-se de que a identidade do cluster utilizada pelo cluster do AKS tenha permissões delegadas para o grupo de recursos do IP público usando o comando
az role assignment create
.Observação
Atualize
<ClusterName>
e<ClusterResourceGroup>
com o nome do cluster do AKS e o nome do grupo de recursos.CLIENT_ID=$(az aks show --name <ClusterName> --resource-group <ClusterResourceGroup> --query identity.principalId -o tsv) RG_SCOPE=$(az group show --name myNetworkResourceGroup --query id -o tsv) az role assignment create \ --assignee ${CLIENT_ID} \ --role "Network Contributor" \ --scope ${RG_SCOPE}
Copie o manifesto YAML a seguir em um novo arquivo chamado nginx-staticip-controller.yaml e salve o arquivo em seu computador local.
Observação
Você pode usar
service.beta.kubernetes.io/azure-pip-name
para nome IP público ou usarservice.beta.kubernetes.io/azure-load-balancer-ipv4
para um endereço IPv4 eservice.beta.kubernetes.io/azure-load-balancer-ipv6
para um endereço IPv6, conforme mostrado no exemplo YAML. Adicionar a anotaçãoservice.beta.kubernetes.io/azure-pip-name
garante a criação mais eficiente do LoadBalancer e é altamente recomendável para evitar possíveis limitações.apiVersion: approuting.kubernetes.azure.com/v1alpha1 kind: NginxIngressController metadata: name: nginx-static spec: ingressClassName: nginx-static controllerNamePrefix: nginx-static loadBalancerAnnotations: service.beta.kubernetes.io/azure-pip-name: "myIngressPublicIP" service.beta.kubernetes.io/azure-load-balancer-resource-group: "myNetworkResourceGroup"
Crie os recursos do controlador de entrada NGINX usando o comando
kubectl apply
.kubectl apply -f nginx-staticip-controller.yaml
O seguinte exemplo de saída mostra o recurso criado:
nginxingresscontroller.approuting.kubernetes.azure.com/nginx-static created
Verificar se o controlador de entrada foi criado
Você pode verificar o status do controlador de entrada NGINX usando o comando kubectl get nginxingresscontroller
.
Observação
Atualize <IngressControllerName>
com o nome que você usou ao criar o `NginxIngressController``.
kubectl get nginxingresscontroller -n <IngressControllerName>
A saída de exemplo a seguir mostra o recurso criado. Pode levar alguns minutos para que o controlador esteja disponível:
NAME INGRESSCLASS CONTROLLERNAMEPREFIX AVAILABLE
nginx-public nginx-public nginx True
Você também pode exibir as condições para solucionar problemas:
kubectl get nginxingresscontroller -n <IngressControllerName> -o jsonpath='{range .items[*].status.conditions[*]}{.lastTransitionTime}{"\t"}{.status}{"\t"}{.type}{"\t"}{.message}{"\n"}{end}'
A saída de exemplo a seguir mostra as condições de um controlador de entrada íntegro:
2023-11-29T19:59:24Z True IngressClassReady Ingress Class is up-to-date
2023-11-29T19:59:50Z True Available Controller Deployment has minimum availability and IngressClass is up-to-date
2023-11-29T19:59:50Z True ControllerAvailable Controller Deployment is available
2023-11-29T19:59:25Z True Progressing Controller Deployment has successfully progressed
Usar o controlador de entrada em uma entrada
Copie o manifesto YAML a seguir em um novo arquivo chamado ingress.yaml e salve o arquivo no computador local.
Observação
Atualize
<Hostname>
com o nome do host DNS. O<IngressClassName>
é o que você definiu ao criar oNginxIngressController
.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: aks-helloworld namespace: hello-web-app-routing spec: ingressClassName: <IngressClassName> rules: - host: <Hostname> http: paths: - backend: service: name: aks-helloworld port: number: 80 path: / pathType: Prefix
Crie os recursos de cluster usando o comando
kubectl apply
.kubectl apply -f ingress.yaml -n hello-web-app-routing
O seguinte exemplo de saída mostra o recurso criado:
ingress.networking.k8s.io/aks-helloworld created
Verificar se a entrada gerenciada foi criada
Verifique se a entrada gerenciada foi criada usando o comando kubectl get ingress
.
kubectl get ingress -n hello-web-app-routing
A saída de exemplo a seguir mostra a entrada gerenciada criada. A classe de entrada, o host e o endereço IP podem ser diferentes:
NAME CLASS HOSTS ADDRESS PORTS AGE
aks-helloworld webapprouting.kubernetes.azure.com myapp.contoso.com 20.51.92.19 80, 443 4m
Limpar controladores de entrada
Você pode remover o controlador de entrada NGINX usando o comando kubectl delete nginxingresscontroller
.
Observação
Atualize <IngressControllerName>
com o nome que você usou ao criar o NginxIngressController
.
kubectl delete nginxingresscontroller -n <IngressControllerName>
Configuração por recurso de entrada por meio de anotações
O controlador de entrada NGINX dá suporte à adição de anotações a objetos de entrada específicos para personalizar seu comportamento.
Você pode anotar o objeto de entrada adicionando a respectiva anotação no campo metadata.annotations
.
Observação
Chaves e valores de anotação só podem ser cadeias de caracteres. Outros tipos, como valores boolianos ou numéricos, devem ser citados, ou seja "true"
, "false"
, "100"
.
Aqui estão algumas anotações de exemplos para configurações comuns. Examine a documentação de anotações de entrada do NGINX para obter uma lista completa.
Tamanho máximo do corpo personalizado
Para NGINX, um erro 413 é retornado ao cliente quando o tamanho em uma solicitação excede o tamanho máximo permitido do corpo da solicitação do cliente. Para substituir o valor padrão, use a anotação:
nginx.ingress.kubernetes.io/proxy-body-size: 4m
Veja um exemplo de configuração de entrada usando esta anotação:
Observação
Atualize <Hostname>
com o nome do host DNS.
O <IngressClassName>
é o que você definiu ao criar o NginxIngressController
.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: 4m
spec:
ingressClassName: <IngressClassName>
rules:
- host: <Hostname>
http:
paths:
- backend:
service:
name: aks-helloworld
port:
number: 80
path: /
pathType: Prefix
Tempo limite de conexão personalizado
Você pode alterar o tempo limite pelo qual o controlador de entrada NGINX aguarda para fechar uma conexão com sua carga de trabalho. Todos os valores de tempo limite são sem unidade e em segundos. Para substituir o tempo limite padrão, use a seguinte anotação para definir um tempo limite de leitura de proxy válido de 120 segundos:
nginx.ingress.kubernetes.io/proxy-read-timeout: "120"
Examine os tempos limite personalizados para outras opções de configuração.
Veja um exemplo de configuração de entrada usando esta anotação:
Observação
Atualize <Hostname>
com o nome do host DNS.
O <IngressClassName>
é o que você definiu ao criar o NginxIngressController
.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: "120"
spec:
ingressClassName: <IngressClassName>
rules:
- host: <Hostname>
http:
paths:
- backend:
service:
name: aks-helloworld
port:
number: 80
path: /
pathType: Prefix
Protocolo de back-end
Por padrão, o controlador de entrada NGINX usa HTTP
para alcançar os serviços. Para configurar protocolos de back-end alternativos, como HTTPS
ou GRPC
, use a anotação:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
or
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
Examine os protocolos de back-end para outras opções de configuração.
Veja um exemplo de configuração de entrada usando esta anotação:
Observação
Atualize <Hostname>
com o nome do host DNS.
O <IngressClassName>
é o que você definiu ao criar o NginxIngressController
.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
ingressClassName: <IngressClassName>
rules:
- host: <Hostname>
http:
paths:
- backend:
service:
name: aks-helloworld
port:
number: 80
path: /
pathType: Prefix
Compartilhamento de Recursos entre Origens (CORS)
Para habilitar o Compartilhamento de Recursos entre Origens (CORS) em uma regra de entrada, use a anotação:
nginx.ingress.kubernetes.io/enable-cors: "true"
Examine habilitar o CORS para outras opções de configuração.
Veja um exemplo de configuração de entrada usando esta anotação:
Observação
Atualize <Hostname>
com o nome do host DNS.
O <IngressClassName>
é o que você definiu ao criar o NginxIngressController
.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
spec:
ingressClassName: <IngressClassName>
rules:
- host: <Hostname>
http:
paths:
- backend:
service:
name: aks-helloworld
port:
number: 80
path: /
pathType: Prefix
Desabilitar o redirecionamento do SSL
Por padrão, o controlador redirecionará (308) para HTTPS se o TLS estiver habilitado para uma entrada. Para desabilitar esse recurso para recursos de entrada específicos, use a anotação:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
Examine a imposição HTTPS do lado do servidor por meio do redirecionamento para outras opções de configuração.
Veja um exemplo de configuração de entrada usando esta anotação:
Observação
Atualize <Hostname>
com o nome do host DNS.
O <IngressClassName>
é o que você definiu ao criar o NginxIngressController
.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
ingressClassName: <IngressClassName>
rules:
- host: <Hostname>
http:
paths:
- backend:
service:
name: aks-helloworld
port:
number: 80
path: /
pathType: Prefix
Reescrita de URL
Em alguns cenários, a URL exposta no serviço de back-end difere do caminho especificado na regra de entrada. Sem uma reescrita, qualquer solicitação retorna 404. Essa configuração é particularmente útil com o roteamento baseado em caminho, em que você pode atender a dois aplicativos Web diferentes no mesmo domínio. Você pode definir o caminho esperado pelo serviço usando a anotação:
nginx.ingress.kubernetes.io/rewrite-target": /$2
Veja um exemplo de configuração de entrada usando esta anotação:
Observação
Atualize <Hostname>
com o nome do host DNS.
O <IngressClassName>
é o que você definiu ao criar o NginxIngressController
.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
ingressClassName: <IngressClassName>
rules:
- host: <Hostname>
http:
paths:
- path: /app-one(/|$)(.*)
pathType: Prefix
backend:
service:
name: app-one
port:
number: 80
- path: /app-two(/|$)(.*)
pathType: Prefix
backend:
service:
name: app-two
port:
number: 80
Próximas etapas
Saiba mais sobre como monitorar as métricas do controlador ingress-nginx incluídas com o complemento de roteamento de aplicativos com o Prometheus no Grafana como parte da análise do desempenho e do uso do aplicativo.
Azure Kubernetes Service