Habilite o suporte a vários namespaces em um cluster AKS usando o AGIC
Os namespaces do Kubernetes possibilitam que um cluster do Kubernetes seja particionado e alocado para subgrupos de uma equipe maior. Esses subgrupos podem implantar e gerenciar a infraestrutura com controles mais precisos de recursos, segurança e configuração. 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 Application Gateway Kubernetes Ingress Controller (AGIC) pode ingerir eventos e observar vários namespaces. Se um administrador do Serviço Kubernetes do Azure (AKS) decidir usar o Gateway de Aplicativo do Azure como uma entrada, todos os namespaces usarão a mesma implantação do Gateway de Aplicativo. Uma única instalação do AGIC monitora namespaces acessíveis e configura a implantação do Application Gateway à qual ele está associado.
A versão 0.7 do AGIC continua a observar exclusivamente o namespace, a default
menos que você o altere explicitamente para um ou mais namespaces diferentes na configuração do Helm.
Gorjeta
Considere o Application Gateway for Containers para sua solução de ingresso do Kubernetes.
Habilitar suporte a vários namespaces
Modifique o arquivo helm-config.yaml de uma das seguintes maneiras:
- Exclua a
watchNamespace
chave inteiramente de helm-config.yaml. A AGIC observa todos os namespaces. - Defina
watchNamespace
como uma cadeia de caracteres vazia. A AGIC observa todos os namespaces. - Adicione vários namespaces separados por uma vírgula (por exemplo,
watchNamespace: default,secondNamespace
). A AGIC observa exclusivamente esses namespaces.
- Exclua a
Aplique as alterações de modelo do Helm executando
helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure
.
Depois de implantar o AGIC com a capacidade de observar vários namespaces, ele executa as seguintes ações:
- Lista recursos de entrada de todos os namespaces acessíveis
- Filtra para ingressar recursos anotados com
kubernetes.io/ingress.class: azure/application-gateway
- Compõe uma configuração combinada do Application Gateway
- Aplica a configuração à implantação do Gateway de Aplicativo associada por meio do Azure Resource Manager
Lidar com configurações conflitantes
Recursos de entrada com vários namespaces podem instruir a AGIC a criar configurações conflitantes para uma única implantação do Application Gateway. Ou seja, duas entradas poderiam reivindicar o mesmo domínio.
No topo da hierarquia, a AGIC pode criar ouvintes (endereço IP, porta e host) e regras de roteamento (ouvinte de ligação, pool de back-end e configurações HTTP). Vários namespaces e entradas podem compartilhá-los.
Por outro lado, o AGIC poderia criar caminhos, pools de back-end, configurações HTTP e certificados TLS para apenas um namespace e remover duplicatas.
Por exemplo, considere os seguintes recursos de entrada duplicados staging
definidos nos namespaces 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 com base no princípio "primeiro a entrar, primeiro a sair" para um dos recursos. Se dois recursos de entrada forem criados ao mesmo tempo, o anterior no alfabeto terá precedência. Com base nessa propriedade, a AGIC cria configurações 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 Application Gateway criados incluem o nome do namespace (production
) para o qual a AGIC os criou.
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 reconfigura o Application Gateway e redireciona o tráfego de namespace-B
para namespace-A
.
Por exemplo, se você adicionar staging
primeiro, a AGIC configurará 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:
- Limite os namespaces definindo explicitamente namespaces que a AGIC deve observar por meio da
watchNamespace
chave YAML em helm-config.yaml. - Use os objetos Role e 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 accessible 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>