Desplegar la aplicación de ejemplo Online Boutique
En esta guía se explica cómo instalar la aplicación de ejemplo Online Boutique para demostrar Cloud Service Mesh. Si no has instalado Cloud Service Mesh, consulta la guía de instalación.
Descargar y desplegar el ejemplo
Para implementar la aplicación, primero debes descargar los manifiestos de Online Boutique del repositorio anthos-service-mesh-packages
con kpt. La aplicación de ejemplo Online Boutique del repositorio anthos-service-mesh-packages se ha modificado a partir del conjunto original de manifiestos del repositorio microservices-demo. Siguiendo las prácticas recomendadas, cada servicio se implementa en un espacio de nombres independiente con una cuenta de servicio única.
Instala
kptsi aún no lo has hecho:gcloud components install kptDescarga el ejemplo con
kpt:kpt pkg get \ https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/samples/online-boutique \ online-boutiqueResultado 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).Ve al directorio
online-boutique:cd online-boutiqueCrea los espacios de nombres de la aplicación:
kubectl apply -f kubernetes-manifests/namespacesResultado 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 createdDespliega el ejemplo en el clúster.
Crea las cuentas de servicio y las implementaciones:
kubectl apply -f kubernetes-manifests/deploymentsResultado 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 createdCrea los servicios:
kubectl apply -f kubernetes-manifests/servicesResultado 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 createdCrea las entradas de servicio:
kubectl apply -f istio-manifests/allow-egress-googleapis.yamlResultado esperado:
serviceentry.networking.istio.io/allow-egress-googleapis created serviceentry.networking.istio.io/allow-egress-google-metadata created
Habilitar la inyección automática de sidecars
Para habilitar la inyección automática, debe etiquetar sus espacios de nombres con las etiquetas de inyección predeterminadas si la etiqueta predeterminada está configurada, o con la etiqueta de revisión de su espacio de nombres. La etiqueta que añadas también depende de si has implementado Cloud Service Mesh gestionado o has instalado el plano de control en el clúster. El webhook del inyector de sidecar usa la etiqueta para asociar los sidecars inyectados con una revisión de plano de control concreta.
En el clúster
Usa el siguiente comando para localizar la etiqueta en
istiod:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'El comando muestra la etiqueta de revisión que corresponde a la versión de Cloud Service Mesh. Por ejemplo:
asm-11910-9Aplica 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
istiodque has anotado 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 labeledReinicia 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 gestionada
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 lanzamiento de Cloud Service Mesh gestionado:
asm-managedpara regular,asm-managed-rapidpara rápido oasm-managed-stablepara 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 labeledSi también has implementado el plano de datos gestionado 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
Exponer y acceder a la aplicación
La forma de exponer la aplicación fuera de la malla depende de si has implementado una pasarela de entrada. Puedes exponer la aplicación mediante una pasarela de entrada de Istio o mediante un servicio de Kubernetes.
Usar una pasarela de entrada
Si has implementado una pasarela de entrada en el clúster tal como se especifica en el requisito previo, sigue estos pasos para exponer la aplicación mediante la pasarela.
Despliega un
Gatewayy unVirtualServicepara el servicio de frontendkubectl apply -f istio-manifests/frontend-gateway.yamlResultado esperado:
gateway.networking.istio.io/frontend-gateway created virtualservice.networking.istio.io/frontend-ingress createdObtén la dirección IP externa de la pasarela de entrada. Sustituye los marcadores de posición por la siguiente información:
GATEWAY_SERVICE_NAME : el nombre del servicio de la puerta de enlace de entrada. Si has implementado la pasarela de ejemplo sin modificarla o si has implementado la pasarela de entrada predeterminada, el nombre es
istio-ingressgateway.GATEWAY_NAMESPACE: el espacio de nombres en el que has implementado la pasarela de entrada. Si ha implementado la pasarela de entrada predeterminada, el espacio de nombres es
istio-system.
kubectl get service GATEWAY_SERVICE_NAME -n GATEWAY_NAMESPACELa salida es similar a la 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 27mEn este ejemplo, la dirección IP de la pasarela de entrada es
35.239.7.64.Visita la aplicación en tu navegador para confirmar la instalación:
http://EXTERNAL_IP/
No hay pasarela de entrada
Si no has implementado una pasarela de entrada o has decidido exponer la aplicación mediante un servicio de Kubernetes, sigue estos pasos:
Despliega un servicio de tipo
LoadBalancerpara exponer el servicio frontendkubectl apply -f frontend-external.yamlBusca la dirección IP externa del servicio
frontend-external:kubectl get service frontend-external -n frontendVisita 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 Google Cloud consola. Ten en cuenta que el gráfico de topología puede tardar hasta 10 minutos en mostrar los servicios de tu malla.
Limpieza
Antes de eliminar Online Boutique, te recomendamos que sigas el ejemplo de Anthos Service Mesh: mTLS, que usa la muestra. Cuando hayas terminado de explorar, usa los siguientes comandos para quitar la muestra Online Boutique:
Elimina los espacios de nombres de la aplicación:
kubectl delete -f kubernetes-manifests/namespacesResultado 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" deletedElimina las entradas de servicio:
kubectl delete -f istio-manifests/allow-egress-googleapis.yamlResultado esperado:
serviceentry.networking.istio.io "allow-egress-googleapis" deleted serviceentry.networking.istio.io "allow-egress-google-metadata" deleted