Compartir por


Entradas externas o internas de Azure Kubernetes Service (AKS) para el despliegue del complemento de malla de servicios Istio

En este artículo se muestra cómo implementar entradas externas o internas para el complemento de malla de servicio de Istio para el clúster de Azure Kubernetes Service (AKS).

Nota:

Al realizar una actualización de revisión secundaria del complemento Istio, se creará otra implementación para las puertas de enlace externas o internas para la nueva revisión del plano de control.

Requisitos previos

En esta guía se supone que ha seguido la documentación para habilitar el complemento Istio en un clúster de AKS, implementar una aplicación de ejemplo y establecer variables de entorno.

Habilitar puerta de enlace de entrada externa

Usa az aks mesh enable-ingress-gateway para habilitar una entrada de Istio accesible externamente en el clúster de AKS:

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type external

Usa kubectl get svc para comprobar el servicio asignado a la puerta de enlace de entrada:

kubectl get svc aks-istio-ingressgateway-external -n aks-istio-ingress

Observa en el resultado que la dirección IP externa del servicio es de acceso 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

Nota:

Todavía no se admiten las personalizaciones de dirección IP en puertas de enlace internas y externas. El complemento Istio revierte las personalizaciones de dirección IP en las especificaciones de entrada. Está previsto permitir estas personalizaciones en la implementación de la API de puerta de enlace para el complemento Istio en el futuro.

No se puede acceder a las aplicaciones desde fuera del clúster de forma predeterminada después de habilitar la puerta de enlace de entrada. Para hacer que una aplicación sea accesible, asigna la entrada de la implementación de muestra a la puerta de enlace de ingreso de Istio mediante el siguiente manifiesto:

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

El selector utilizado en el objeto Puerta de enlace apunta a istio: aks-istio-ingressgateway-external, que se puede encontrar como etiqueta en el servicio asignado a la entrada externa que se habilitó anteriormente.

Configura las variables de entorno para el host y los puertos de entrada externos:

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

Recupera la dirección externa de la aplicación de ejemplo:

echo "http://$GATEWAY_URL_EXTERNAL/productpage"

Ve a la dirección URL desde la salida del comando anterior y confirma que se muestra la página del producto de la aplicación de ejemplo. Como alternativa, también puedes usar curl para confirmar que la aplicación de ejemplo es accesible. Por ejemplo:

curl -s "http://${GATEWAY_URL_EXTERNAL}/productpage" | grep -o "<title>.*</title>"

Confirma que la página del producto de la aplicación de ejemplo es accesible. El resultado esperado es:

<title>Simple Bookstore App</title>

Habilitar la puerta de enlace de entrada interna

Usa az aks mesh enable-ingress-gateway para habilitar una entrada interna de Istio en el clúster de AKS:

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type internal

Usa kubectl get svc para comprobar el servicio asignado a la puerta de enlace de entrada:

kubectl get svc aks-istio-ingressgateway-internal -n aks-istio-ingress

Observa desde la salida que la dirección IP externa del servicio no es una accesible públicamente y, en su lugar, solo es accesible 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

Después de habilitar la puerta de enlace de entrada, las aplicaciones deben exponerse a través de la puerta de enlace y las reglas de enrutamiento deben configurarse en consecuencia. Usa el siguiente manifiesto para asignar la entrada de la implementación de ejemplo a la puerta de enlace de entrada de 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

El selector que se utiliza en el objeto Puerta de enlace apunta a istio: aks-istio-ingressgateway-internal, que se puede encontrar como etiqueta en el servicio asignado a la entrada interna que se habilitó anteriormente.

Configura las variables de entorno para el host y los puertos de entrada internos:

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

Recupera la dirección de la aplicación de ejemplo:

echo "http://$GATEWAY_URL_INTERNAL/productpage"

Ve a la dirección URL desde la salida del comando anterior y confirma que NO se muestra la página del producto de la aplicación de ejemplo. Como alternativa, también puedes usar curl para confirmar que la aplicación de ejemplo NO es accesible. Por ejemplo:

curl -s "http://${GATEWAY_URL_INTERNAL}/productpage" | grep -o "<title>.*</title>"

Usa kubectl exec para confirmar que la aplicación es accesible desde dentro de la red virtual del clúster:

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>"

Confirma que la página del producto de la aplicación de ejemplo es accesible. El resultado esperado es:

<title>Simple Bookstore App</title>

Personalización de anotaciones del servicio de puerta de enlace de entrada

Las anotaciones siguientes se pueden agregar al servicio Kubernetes para las puertas de enlace de entrada externas e internas:

  • service.beta.kubernetes.io/azure-load-balancer-internal-subnet: para enlazar una puerta de enlace de entrada interna a una subred específica.
  • service.beta.kubernetes.io/azure-shared-securityrule: para exponer la puerta de enlace de entrada a través de una regla de seguridad aumentada.
  • service.beta.kubernetes.io/azure-allowed-service-tags: para especificar qué etiquetas de servicio puede recibir las solicitudes de la puerta de enlace de entrada.
  • service.beta.kubernetes.io/azure-load-balancer-ipv4: para configurar una dirección IPv4 estática.
  • service.beta.kubernetes.io/azure-load-balancer-resource-group: para especificar el grupo de recursos de una dirección IP pública en un grupo de recursos diferente del clúster.
  • service.beta.kubernetes.io/azure-pip-name: para especificar el nombre de una dirección IP pública.

Eliminar recursos

Si desea limpiar las puertas de enlace de entrada internas o externas de Istio, pero deje habilitada la malla en el clúster, ejecute el siguiente comando:

az aks mesh disable-ingress-gateway --ingress-gateway-type <external/internal> --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

Si quieres limpiar la malla de servicio de Istio y la entrada (dejando atrás el clúster), ejecuta el siguiente comando:

az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

Si quieres limpiar todos los recursos creados a partir de los documentos de instrucciones paso a paso de Istio, ejecuta el siguiente comando:

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

Pasos siguientes

Nota:

En caso de que se produzca algún problema con la implementación de la puerta de enlace de entrada de Istio o la configuración del enrutamiento del tráfico de entrada, consulte artículo sobre la solución de problemas de puertas de enlace de entrada de Istio