Implementa la aplicación de muestra Online Boutique
En esta guía, se explica cómo instalar la aplicación de ejemplo Online Boutique para demostrar el funcionamiento de Cloud Service Mesh. Si no instalaste Cloud Service Mesh, consulta la guía de instalación.
Descarga e implementa la muestra
Para implementar la aplicación, primero debes descargar los manifiestos de Online Boutique desde el repositorio anthos-service-mesh-packages
mediante kpt
. La aplicación de ejemplo de Online Boutique en el repositorio anthos-service-mesh-packages
se modifica a partir del conjunto original de manifiestos en el repositorio microservices-demo
. De acuerdo con las prácticas recomendadas, cada servicio se implementa en un espacio de nombres distinto con una cuenta de servicio única.
Instala
kpt
si aún no lo hiciste:gcloud components install kpt
Descarga la muestra mediante
kpt
:kpt pkg get \ https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/samples/online-boutique \ online-boutique
Resultado esperado
Package "online-boutique": Fetching https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages@main From https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages * branch main -> FETCH_HEAD Adding package "samples/online-boutique". Fetched 1 package(s).
Navega al directorio
online-boutique
:cd online-boutique
Crea los espacios de nombres para la aplicación:
kubectl apply -f kubernetes-manifests/namespaces
Resultado esperado:
namespace/ad created namespace/cart created namespace/checkout created namespace/currency created namespace/email created namespace/frontend created namespace/loadgenerator created namespace/payment created namespace/product-catalog created namespace/recommendation created namespace/shipping created
Implementa la muestra en el clúster.
Crea las implementaciones y cuentas de servicio:
kubectl apply -f kubernetes-manifests/deployments
Resultado esperado:
serviceaccount/ad created deployment.apps/adservice created serviceaccount/cart created deployment.apps/cartservice created serviceaccount/checkout created deployment.apps/checkoutservice created serviceaccount/currency created deployment.apps/currencyservice created serviceaccount/email created deployment.apps/emailservice created serviceaccount/frontend created deployment.apps/frontend created serviceaccount/loadgenerator created deployment.apps/loadgenerator created serviceaccount/payment created deployment.apps/paymentservice created serviceaccount/product-catalog created deployment.apps/productcatalogservice created serviceaccount/recommendation created deployment.apps/recommendationservice created serviceaccount/shipping created deployment.apps/shippingservice created
Crea los servicios:
kubectl apply -f kubernetes-manifests/services
Resultado esperado:
service/adservice created service/cartservice created service/checkoutservice created service/currencyservice created service/emailservice created service/frontend created service/frontend-external created service/paymentservice created service/productcatalogservice created service/recommendationservice created service/shippingservice created
Crea las entradas de servicio:
kubectl apply -f istio-manifests/allow-egress-googleapis.yaml
Resultado esperado:
serviceentry.networking.istio.io/allow-egress-googleapis created serviceentry.networking.istio.io/allow-egress-google-metadata created
Habilita la inserción automática de sidecar
Para habilitar la inserción automática, etiqueta tus espacios de nombres con las etiquetas de inyección predeterminadas si la etiqueta predeterminada está configurada o con la etiqueta de revisión en tu espacio de nombres. La etiqueta que agregues también dependerá de si implementaste Cloud Service Mesh administrado o instaló el plano de control en el clúster. El webhook de inyector de sidecar usa la etiqueta para asociar los sidecar insertados con una revisión de plano de control en particular.
En el clúster
Usa el siguiente comando para encontrar la etiqueta en
istiod
:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
El comando genera la etiqueta de revisión que corresponde al La versión de Cloud Service Mesh, por ejemplo:
asm-1167-22
Aplica la etiqueta de revisión a los espacios de nombres de la aplicación. En el siguiente comando, REVISION es el valor de la etiqueta de revisión
istiod
que anotaste en el paso anterior.for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl label namespace $ns istio.io/rev=REVISION --overwrite done;
Resultado esperado:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
Reinicia los pods:
for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl rollout restart deployment -n ${ns} done;
Resultado esperado:
deployment.apps/adservice restarted deployment.apps/cartservice restarted deployment.apps/checkoutservice restarted deployment.apps/currencyservice restarted deployment.apps/emailservice restarted deployment.apps/frontend restarted deployment.apps/loadgenerator restarted deployment.apps/paymentservice restarted deployment.apps/productcatalogservice restarted deployment.apps/recommendationservice restarted deployment.apps/shippingservice restarted
Malla de servicios administrados
Aplica la etiqueta de revisión a los espacios de nombres de la aplicación. En el siguiente comando, la etiqueta REVISION debe ser el valor de tu canal de versiones administrado de Cloud Service Mesh:
asm-managed
para la versión normal,asm-managed-rapid
para la versión rápida oasm-managed-stable
para la versión estable.for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl label namespace $ns istio.io/rev=REVISION --overwrite done;
Resultado esperado:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
Si también implementaste el plano de datos administrado opcional, anota los espacios de nombres de la aplicación de la siguiente manera:
for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl annotate --overwrite namespace $ns mesh.cloud.google.com/proxy='{"managed":"true"}' done;
Reinicia los pods:
for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl rollout restart deployment -n ${ns} done;
Resultado esperado:
deployment.apps/adservice restarted deployment.apps/cartservice restarted deployment.apps/checkoutservice restarted deployment.apps/currencyservice restarted deployment.apps/emailservice restarted deployment.apps/frontend restarted deployment.apps/loadgenerator restarted deployment.apps/paymentservice restarted deployment.apps/productcatalogservice restarted deployment.apps/recommendationservice restarted deployment.apps/shippingservice restarted
Expón la aplicación y accede a ella
La forma en que expones la aplicación fuera de la malla depende de si implementaste una puerta de enlace de entrada. Puedes exponer la aplicación con una puerta de enlace de entrada de Istio o con un servicio de Kubernetes.
Usa la puerta de enlace de entrada
Si implementaste una puerta de enlace de entrada en el clúster como se especifica en los prerrequisitos, sigue estos pasos para exponer la aplicación con la puerta de enlace.
Implementa
Gateway
yVirtualService
para el servicio de frontendkubectl apply -f istio-manifests/frontend-gateway.yaml
Resultado esperado:
gateway.networking.istio.io/frontend-gateway created virtualservice.networking.istio.io/frontend-ingress created
Obtén la dirección IP externa de la puerta de enlace de entrada y reemplaza los marcadores de posición por la siguiente información:
GATEWAY_SERVICE_NAME: El nombre del servicio de puerta de enlace de entrada. Si implementaste la puerta de enlace de muestra sin modificación o si implementaste la puerta de enlace de entrada predeterminada, el nombre será
istio-ingressgateway
.GATEWAY_NAMESPACE: El espacio de nombres en el que implementaste la puerta de enlace de entrada. Si implementaste la puerta de enlace de entrada predeterminada, el espacio de nombres es
istio-system
.
kubectl get service GATEWAY_SERVICE_NAME -n GATEWAY_NAMESPACE
El resultado es similar al siguiente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
En este ejemplo, la dirección IP de la puerta de enlace de entrada es
35.239.7.64
.Visita la aplicación en tu navegador para confirmar la instalación:
http://EXTERNAL_IP/
Sin puerta de enlace de entrada
Si no implementaste una puerta de enlace de entrada o elegiste exponer la aplicación con un servicio de Kubernetes, sigue estos pasos:
Implementa un servicio de tipo
LoadBalancer
para exponer el servicio de frontend.kubectl apply -f frontend-external.yaml
Busca la dirección IP externa del servicio
frontend-external
:kubectl get service frontend-external -n frontend
Visita la aplicación en tu navegador para confirmar la instalación:
http://EXTERNAL_IP/
Puedes explorar las funciones de observabilidad de Cloud Service Mesh en la consola de Google Cloud. Ten en cuenta que pueden pasar hasta 10 minutos hasta que gráfico de topología muestre los servicios de tu malla.
Limpia
Antes de borrar Online Boutique, recomendamos que revises Cloud Service Mesh por ejemplo: mTLS, que utiliza la muestra. Cuando termines de explorar, usa los siguientes comandos para quitar la muestra de Online Boutique:
Borra los espacios de nombres de la aplicación:
kubectl delete -f kubernetes-manifests/namespaces
Resultado esperado:
namespace "ad" deleted namespace "cart" deleted namespace "checkout" deleted namespace "currency" deleted namespace "email" deleted namespace "frontend" deleted namespace "loadgenerator" deleted namespace "payment" deleted namespace "product-catalog" deleted namespace "recommendation" deleted namespace "shipping" deleted
Borra las entradas de servicio:
kubectl delete -f istio-manifests/allow-egress-googleapis.yaml
Resultado esperado:
serviceentry.networking.istio.io "allow-egress-googleapis" deleted serviceentry.networking.istio.io "allow-egress-google-metadata" deleted