Habilite o suporte a vários namespaces em um cluster AKS com o Application Gateway Ingress Controller
Motivação
Os namespaces do Kubernetes possibilitam que um cluster do Kubernetes seja particionado e alocado para subgrupos de uma equipe maior. Essas subequipes podem então implantar e gerenciar a infraestrutura com controles mais precisos de recursos, segurança, configuração, etc. O Kubernetes permite que um ou mais recursos de entrada sejam definidos independentemente dentro de cada namespace.
A partir da versão 0.7 , o Kubernetes IngressController (AGIC) do Gateway de Aplicativo do Azure pode ingerir eventos e observar vários namespaces. Se o administrador do AKS decidir usar o Application Gateway como entrada, todos os namespaces usarão a mesma instância do Application Gateway. Uma única instalação do Ingress Controller monitora namespaces acessíveis e configura o Application Gateway ao qual está associado.
A versão 0.7 do AGIC continua a observar exclusivamente o namespace, a default
menos que ele seja explicitamente alterado para um ou mais namespaces diferentes na configuração do Helm. Consulte a secção seguinte.
Gorjeta
Consulte também O que é o Application Gateway for Containers.
Ativar suporte de múltiplos espaços de nomes
Para habilitar o suporte a vários namespaces:
- Modifique o arquivo helm-config.yaml de uma das seguintes maneiras:
- excluir a
watchNamespace
chave inteiramente de helm-config.yaml - AGIC observa todos os namespaces - definido
watchNamespace
como uma cadeia de caracteres vazia - AGIC observa todos os namespaces - adicionar vários namespaces separados por uma vírgula (
watchNamespace: default,secondNamespace
) - a AGIC observa esses namespaces exclusivamente
- excluir a
- aplicar alterações de modelo do Helm com:
helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure
Uma vez implantado com a capacidade de observar vários namespaces, o AGIC executa as seguintes ações:
- lista recursos de entrada de todos os namespaces acessíveis
- filtros para ingressar recursos anotados com
kubernetes.io/ingress.class: azure/application-gateway
- compõe a configuração combinada do Application Gateway
- aplica a configuração ao Application Gateway associado via ARM
Configurações conflitantes
Vários recursos de entrada de namespace podem instruir a AGIC a criar configurações conflitantes para um único Application Gateway. (Duas entradas reivindicando o mesmo domínio, por exemplo.)
No topo da hierarquia - ouvintes (endereço IP, porta e host) e regras de roteamento (ouvinte de ligação, pool de back-end e configurações HTTP) podem ser criados e compartilhados por vários namespaces/ingressos.
Por outro lado, caminhos, pools de back-end, configurações HTTP e certificados TLS podem ser criados apenas por um namespace e as duplicatas são removidas.
Por exemplo, considere os seguintes recursos de entrada duplicados definidos namespaces staging
e production
para www.contoso.com
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: websocket-ingress
namespace: staging
annotations:
kubernetes.io/ingress.class: azure/application-gateway
spec:
rules:
- host: www.contoso.com
http:
paths:
- backend:
serviceName: web-service
servicePort: 80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: websocket-ingress
namespace: production
annotations:
kubernetes.io/ingress.class: azure/application-gateway
spec:
rules:
- host: www.contoso.com
http:
paths:
- backend:
serviceName: web-service
servicePort: 80
Apesar dos dois recursos de entrada exigirem tráfego para www.contoso.com
ser roteado para os respetivos namespaces do Kubernetes, apenas um back-end pode atender ao tráfego. O AGIC cria uma configuração baseada em uma base "primeiro a entrar, primeiro a sair" para um dos recursos. Se dois recursos de entrada são criados ao mesmo tempo, o anterior no alfabeto tem precedência. Com base nessa propriedade, as configurações são criadas para a production
entrada. O Application Gateway é configurado com os seguintes recursos:
- Ouvinte:
fl-www.contoso.com-80
- Regra de roteamento:
rr-www.contoso.com-80
- Pool de back-end:
pool-production-contoso-web-service-80-bp-80
- Configurações HTTP:
bp-production-contoso-web-service-80-80-websocket-ingress
- Sonda de Saúde:
pb-production-contoso-web-service-80-websocket-ingress
Nota
Exceto para o ouvinte e a regra de roteamento, os recursos do Gateway de Aplicativo criados incluem o nome do namespace (production
) para o qual foram criados.
Se os dois recursos de entrada forem introduzidos no cluster AKS em momentos diferentes, é provável que o AGIC acabe em um cenário em que reconfigure o Application Gateway e redirecione o tráfego de namespace-B
para namespace-A
.
Por exemplo, se você adicionou staging
primeiro, a AGIC configura o Application Gateway para rotear o tráfego para o pool de back-end de preparação. Em um estágio posterior, a introdução production
da entrada faz com que a AGIC reprograme o Application Gateway, que inicia o roteamento do tráfego para o pool de production
back-end.
Restringir o acesso a namespaces
Por padrão, a AGIC configura o Application Gateway com base na Entrada anotada em qualquer namespace. Se você quiser limitar esse comportamento, você tem as seguintes opções:
- limitar os namespaces, definindo explicitamente namespaces AGIC deve observar através da
watchNamespace
chave YAML em helm-config.yaml - use Role/RoleBinding para limitar o AGIC a namespaces específicos
Exemplo de arquivo de configuração do Helm
# This file contains the essential configs for the ingress controller helm chart
# Verbosity level of the App Gateway Ingress Controller
verbosityLevel: 3
################################################################################
# Specify which application gateway the ingress controller manages
#
appgw:
subscriptionId: <subscriptionId>
resourceGroup: <resourceGroupName>
name: <applicationGatewayName>
# Setting appgw.shared to "true" creates an AzureIngressProhibitedTarget CRD.
# This prohibits AGIC from applying config for any host/path.
# Use "kubectl get AzureIngressProhibitedTargets" to view and change this.
shared: false
################################################################################
# Specify which kubernetes namespace the ingress controller watches
# Default value is "default"
# Leaving this variable out or setting it to blank or empty string would
# result in Ingress Controller observing all acessible namespaces.
#
# kubernetes:
# watchNamespace: <namespace>
################################################################################
# Specify the authentication with Azure Resource Manager
#
# Two authentication methods are available:
# - Option 1: AAD-Pod-Identity (https://github.com/Azure/aad-pod-identity)
armAuth:
type: aadPodIdentity
identityResourceID: <identityResourceId>
identityClientID: <identityClientId>
## Alternatively you can use Service Principal credentials
# armAuth:
# type: servicePrincipal
# secretJSON: <<Generate this value with: "az ad sp create-for-rbac --subscription <subscription-uuid> --role Contributor --sdk-auth | base64 -w0" >>
################################################################################
# Specify if the cluster is Kubernetes RBAC enabled or not
rbac:
enabled: false # true/false
# Specify aks cluster related information. THIS IS BEING DEPRECATED.
aksClusterConfiguration:
apiServerAddress: <aks-api-server-address>