Entradas externas ou internas do Serviço de Kubernetes do Azure (AKS) para a implantação do complemento de malha de serviço do Istio

Este artigo mostra como implantar entradas externas ou internas para o complemento de malha de serviço do Istio para o cluster do Serviço de Kubernetes do Azure (AKS).

Observação

Ao executar uma pequena atualização de revisão do complemento do 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 do AKS, implantar um aplicativo de exemplo e definir variáveis de ambiente.

Habilitar o gateway de entrada externo

Use az aks mesh enable-ingress-gateway para habilitar uma entrada Istio acessível externamente no seu cluster do 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 entrada:

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 é de acesso 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

Observação

As personalizações para o endereço IP em gateways internos e externos ainda não têm suporte. As personalizações de endereço IP nas especificações de entrada são revertidas pelo complemento Istio. Ele está planejado para permitir essas personalizações na implementação da API de Gateway para o complemento Istio no futuro.

Os aplicativos não são acessíveis fora do cluster por padrão após a habilitação do gateway de entrada. Para tornar um aplicativo acessível, mapeie a entrada da implantação do 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

Observação

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.

Defina variáveis de ambiente para o host e as portas de entrada externas:

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

Recuperar o endereço externo do aplicativo de exemplo:

echo "http://$GATEWAY_URL_EXTERNAL/productpage"

Navegue até a URL na saída do comando anterior e confirme se a página do produto do aplicativo de exemplo está sendo 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. A saída esperada é:

<title>Simple Bookstore App</title>

Habilitar o gateway de entrada interno

Use az aks mesh enable-ingress-gateway para habilitar uma entrada interna do Istio no seu cluster do 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 entrada:

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 ao público e, em vez disso, é acessível apenas 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 adequadamente. Use o seguinte manifesto para mapear a entrada da implantação de amostra no 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

Observação

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.

Definir as variáveis de ambiente para o host e as portas de entrada interna:

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

Recuperar o endereço do aplicativo de exemplo:

echo "http://$GATEWAY_URL_INTERNAL/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 NÃO está sendo exibida. Como alternativa, você também pode usar curl para confirmar que o aplicativo 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 que 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. A saída esperada é:

<title>Simple Bookstore App</title>

Personalização da anotação do serviço de gateway de entrada

As seguintes anotações podem ser adicionadas ao serviço Kubernetes para os gateways de entrada externos e internos:

  • service.beta.kubernetes.io/azure-load-balancer-internal-subnet: para associar um gateway de entrada interno a uma sub-rede específica.
  • service.beta.kubernetes.io/azure-shared-securityrule: para expor o gateway de entrada por meio de uma regra de segurança aumentada.
  • service.beta.kubernetes.io/azure-allowed-service-tags: para especificar quais categorias de serviço o gateway de entrada pode receber solicitações.
  • service.beta.kubernetes.io/azure-load-balancer-ipv4: para configurar um endereço IPv4 estático.
  • service.beta.kubernetes.io/azure-load-balancer-resource-group: para especificar o grupo de recursos de um IP em um grupo de recursos diferente do cluster.
  • service.beta.kubernetes.io/azure-pip-name: para especificar o nome de um IP.

Excluir 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}

Se você quiser limpar a malha de serviços do Istio e as entradas (deixando para trás o cluster), execute o comando a seguir:

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 prática do Istio, execute o comando a seguir:

az group delete --name ${RESOURCE_GROUP} --yes --no-wait

Próximas etapas

Observação

No caso de problemas encontrados com a implantação do gateway de entrada do Istio ou a configuração do roteamento de tráfego de entrada, consulte artigo sobre como solucionar problemas de gateways de entrada de complemento do Istio