Share via


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

Esta guía asume que has seguido la documentación para habilitar el complemento de Istio en un clúster de AKS, implementar una aplicación de muestra 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

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/v1alpha3
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/v1alpha3
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

Las aplicaciones no se asignan a la puerta de enlace de entrada de Istio después de habilitar la puerta de enlace de entrada. 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/v1alpha3
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/v1alpha3
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>

Eliminar recursos

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