Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo mostra como implantar entradas externas ou internas para o complemento de malha de serviço Istio para cluster do Serviço Kubernetes do Azure (AKS).
Nota
Quando você executa uma pequena atualização de revisão do complemento Istio, outra implantação para os gateways externos / internos será criada para a nova revisão do plano de controle.
Pré-requisitos
Este guia pressupõe que você seguiu a documentação para habilitar o complemento Istio em um cluster AKS, implantar um aplicativo de exemplo e definir variáveis de ambiente.
Ativar porta de entrada externa
Nota
Para programar os pods do gateway de ingresso em nós específicos, utilize o rótulo de nó azureservicemesh/istio.replica.preferred ou os nós de sistema do AKS. Os pods têm afinidades de nós com uma preferência ponderada de 100 para nós rotulados azureservicemesh/istio.replica.preferred: true e uma preferência ponderada de 50 para nós do sistema AKS (rotulados kubernetes.azure.com/mode: system). Esta configuração significa que, se a azureservicemesh/istio.replica.preferred: true etiqueta não for encontrada ou se tais nós não forem agendados, os pods são agendados em nós do sistema AKS.
Para revisões anteriores a asm-1-30, estes pesos invertem-se: 100 para nós do sistema AKS e 50 para nós azureservicemesh/istio.replica.preferred: true.
Use az aks mesh enable-ingress-gateway para habilitar uma entrada do Istio acessível externamente em seu cluster AKS:
az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type external
Use kubectl get svc para verificar o serviço mapeado para o gateway de ingresso:
kubectl get svc aks-istio-ingressgateway-external -n aks-istio-ingress
Observe a partir da saída que o endereço IP externo do serviço é acessível ao público:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
aks-istio-ingressgateway-external LoadBalancer 10.0.10.249 <EXTERNAL_IP> 15021:30705/TCP,80:32444/TCP,443:31728/TCP 4m21s
Os aplicativos não são acessíveis de fora do cluster por padrão depois de habilitar o gateway de entrada. Para tornar um aplicativo acessível, mapeie a entrada da implantação de exemplo para o gateway de entrada do Istio usando o seguinte manifesto:
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: bookinfo-gateway-external
spec:
selector:
istio: aks-istio-ingressgateway-external
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: bookinfo-vs-external
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway-external
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
EOF
Nota
O seletor usado no objeto Gateway aponta para istio: aks-istio-ingressgateway-external, que pode ser encontrado como rótulo no serviço mapeado para a entrada externa habilitada anteriormente.
Definir variáveis de ambiente para portas e host de entrada externo:
export INGRESS_HOST_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_EXTERNAL=$INGRESS_HOST_EXTERNAL:$INGRESS_PORT_EXTERNAL
Recupere o endereço externo do aplicativo de exemplo:
echo "http://$GATEWAY_URL_EXTERNAL/productpage"
Navegue até a URL a partir da saída do comando anterior e confirme se a página do produto do aplicativo de exemplo é exibida. Como alternativa, você também pode usar curl para confirmar que o aplicativo de exemplo está acessível. Por exemplo:
curl -s "http://${GATEWAY_URL_EXTERNAL}/productpage" | grep -o "<title>.*</title>"
Confirme se a página do produto do aplicativo de exemplo está acessível. O resultado esperado é:
<title>Simple Bookstore App</title>
Ativar a porta de entrada interna
Utilize az aks mesh enable-ingress-gateway para habilitar um ingresso interno do Istio no seu cluster AKS:
az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type internal
Use kubectl get svc para verificar o serviço mapeado para o gateway de ingresso:
kubectl get svc aks-istio-ingressgateway-internal -n aks-istio-ingress
Observe a partir da saída que o endereço IP externo do serviço não é acessível publicamente e, em vez disso, é apenas acessível localmente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
aks-istio-ingressgateway-internal LoadBalancer 10.0.182.240 <IP> 15021:30764/TCP,80:32186/TCP,443:31713/TCP 87s
Depois de habilitar o gateway de entrada, os aplicativos precisam ser expostos por meio do gateway e as regras de roteamento precisam ser configuradas de acordo. Use o manifesto a seguir para mapear a entrada da implantação de exemplo para o gateway de entrada do Istio:
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: bookinfo-internal-gateway
spec:
selector:
istio: aks-istio-ingressgateway-internal
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: bookinfo-vs-internal
spec:
hosts:
- "*"
gateways:
- bookinfo-internal-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
EOF
Nota
O seletor usado no objeto Gateway aponta para istio: aks-istio-ingressgateway-internal, que pode ser encontrado como rótulo no serviço mapeado para a entrada interna habilitada anteriormente.
Defina variáveis de ambiente para portas e host de entrada interno:
export INGRESS_HOST_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_INTERNAL=$INGRESS_HOST_INTERNAL:$INGRESS_PORT_INTERNAL
Recupere o endereço do aplicativo de exemplo:
echo "http://$GATEWAY_URL_INTERNAL/productpage"
Navegue até ao URL indicado na saída do comando anterior e confirme que a página do produto da aplicação de exemplo NÃO é exibida. Em alternativa, também pode utilizar curl para confirmar que a aplicação de exemplo NÃO está acessível. Por exemplo:
curl -s "http://${GATEWAY_URL_INTERNAL}/productpage" | grep -o "<title>.*</title>"
Use kubectl exec para confirmar se o aplicativo está acessível de dentro da rede virtual do cluster:
kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS "http://$GATEWAY_URL_INTERNAL/productpage" | grep -o "<title>.*</title>"
Confirme se a página do produto do aplicativo de exemplo está acessível. O resultado esperado é:
<title>Simple Bookstore App</title>
Personalizações do gateway de entrada
Anotações
Anotações de serviço
As seguintes anotações podem ser adicionadas ao serviço Kubernetes para gateways de entrada externos e internos. Consulte o documento sobre a configuração de balanceadores de carga públicos para mais informações sobre estas anotações.
-
external-dns.alpha.kubernetes.io/hostname: para especificar o domínio para os registros DNS do recurso. Para obter mais informações, consulte external-dns. -
service.beta.kubernetes.io/azure-allowed-ip-ranges: para especificar uma lista de intervalos de IP permitidos separados por vírgulas. -
service.beta.kubernetes.io/azure-allowed-service-tags: para especificar de quais tags de serviço o gateway de entrada pode receber solicitações. -
service.beta.kubernetes.io/azure-disable-load-balancer-floating-ip: defina paratruepara desativar o endereço IP flutuante na regra do balanceador de carga. -
service.beta.kubernetes.io/azure-load-balancer-internal-subnet: nome da sub-rede à qual vincular o gateway de entrada interno. Essa sub-rede deve existir na mesma rede virtual que a malha. -
service.beta.kubernetes.io/azure-load-balancer-ipv4: para configurar um endereço IPv4 estático. -
service.beta.kubernetes.io/azure-load-balancer-disable-tcp-reset: para controlar se o Balanceador de Carga do Azure habilita a Redefinição de TCP. -
service.beta.kubernetes.io/azure-load-balancer-resource-group: para especificar o grupo de recursos de um IP público em um grupo de recursos diferente do cluster. -
service.beta.kubernetes.io/azure-load-balancer-tcp-idle-timeout: para configurar o tempo limite de ociosidade TCP em minutos para conexões por meio do Balanceador de Carga do Azure. -
service.beta.kubernetes.io/azure-pip-ip-tags: para especificar uma lista de IpTags separadas por vírgulas. -
service.beta.kubernetes.io/azure-pip-name: para especificar o nome de um endereço IP público. -
service.beta.kubernetes.io/azure-shared-securityrule: para expor o gateway de entrada por meio de uma regra de segurança aumentada.
O complemento suporta as seguintes anotações de sondas de saúde para portas 80 e 443:
service.beta.kubernetes.io/port_{port}_no_lb_ruleservice.beta.kubernetes.io/port_{port}_no_probe_ruleservice.beta.kubernetes.io/port_{port}_health-probe_protocolservice.beta.kubernetes.io/port_{port}_health-probe_portservice.beta.kubernetes.io/port_{port}_health-probe_intervalservice.beta.kubernetes.io/port_{port}_health-probe_num-of-probeservice.beta.kubernetes.io/port_{port}_health-probe_request-path
Anotações de implantação
As seguintes anotações podem ser adicionadas à implementação do Kubernetes para gateways de entrada externos e internos:
- Em
spec.template.metadata.annotations:proxy.istio.io/config. Use esta anotação para configurar definições comogatewayTopology.numTrustedProxies.ProxyConfigAs anotações adicionadas ao pod do gateway de entrada ou a outras cargas de trabalho na malha substituem osProxyConfigvalores definidos no MeshConfig predefinido e no MeshConfig partilhado.
Política de tráfego externo
O complemento suporta a personalização de .spec.externalTrafficPolicy no serviço Kubernetes para o gateway de ingress. Definir .spec.externalTrafficPolicy para Local preserva o IP de origem do cliente no gateway de entrada do Istio e evita uma segunda passagem no caminho de tráfego para os pods de gateway de entrada de back-end.
kubectl patch service aks-istio-ingressgateway-external -n aks-istio-ingress --type merge --patch '{"spec": {"externalTrafficPolicy": "Local"}}'
Nota
Modificar o .spec.externalTrafficPolicy para Local risca uma propagação potencialmente desequilibrada do tráfego. Antes de aplicar essa alteração, é recomendável ler os documentos do Kubernetes para entender as compensações entre as diferentes externalTrafficPolicy configurações.
Eliminar recursos
Se você quiser limpar os gateways de entrada externos ou internos do Istio, mas deixar a malha habilitada no cluster, execute o seguinte comando:
az aks mesh disable-ingress-gateway --ingress-gateway-type <external/internal> --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
Se você quiser limpar a malha de serviço do Istio e as entradas (deixando para trás o cluster), execute o seguinte comando:
az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
Se você quiser limpar todos os recursos criados a partir dos documentos de orientação de instruções do Istio, execute o seguinte comando:
az group delete --name ${RESOURCE_GROUP} --yes --no-wait
Próximos passos
Nota
Se houver algum problema encontrado com a implantação do gateway de entrada do Istio ou com a configuração do roteamento de tráfego de entrada, consulte o artigo sobre solução de problemas de gateways de entrada de complementos do Istio
- Configurar a entrada para o complemento de malha de serviço Istio com a API do Kubernetes Gateway
- Gateway de entrada seguro para o complemento de malha de serviço Istio
- Configurar Gateway de Entrada Horizontal Pod Autoscaler (HPA)
- Implantar gateways de saída para o complemento de malha de serviço Istio