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
Azure Kubernetes Service