Spring Cloud: Deployment en GKE
Posted on April 10, 2024 • 4 minutes • 653 words • Other languages: English
Este es una continuación de Spring Cloud: api-gateway and naming-server concepts .
- ¡Mirá el código!
- Acordate siempre de borrar tu clúster cuando te vayas
- Creá un clúster GKE
- Desplegá lo que necesites en el clúster
- Probémoslo
- Recordá borrar el clúster cuando termines
¡Mirá el código!
Podés chequear el código en los siguientes repositorios (en todos, quedate en la rama feature/gke
. Puede que veás otras ramas; eso soy yo experimentando con otras soluciones):
Acordate siempre de borrar tu clúster cuando te vayas
¡BORRÁ EL CLÚSTER! ¡BORRÁ EL CLÚSTER! Acordate de borrar tu clúster cuando no lo estés usando. Los clústeres gastan dinero solo por existir. No son tan caros, pero es plata tirada a la basura.
Al escribir este blog, me fui a dormir y continué al día siguiente, dejando un clúster corriendo durante casi 10 horas.
- Por suerte, el clúster estaba vacío, así que la pérdida es insignificante (solo £0.016). Podría haber sido peor.
- Se nota que el 4 de abril gasté casi £1. Ese día dejé un clúster con cuatro microservicios corriendo por unas 5 horas.
- El 8 de abril hice lo mismo, pero con Cloud Run, otra solución de Google Cloud que trabaja con imágenes Docker, pero es menos orientada a operaciones. Como el gasto es de pago por uso, se nota que es mucho más económico. Probablemente, escriba un blog de Cloud Run después.
Creá un clúster GKE
Asumo que ya tenés todo listo en tu Google Console. Si no, Google es tu mejor amigo acá.
Un clúster se puede crear de varias maneras. Yo decidí preguntarle a ChatGPT, le expliqué lo que quería desplegar para que fuera barato, y me tiró este comando de gcloud cli:
gcloud beta container --project "fujiwara-383901" clusters create "pollito-demo-cluster" --no-enable-basic-auth --cluster-version "1.27.8-gke.1067004" --release-channel "regular" --machine-type "e2-medium" --image-type "COS_CONTAINERD" --disk-type "pd-ssd" --disk-size "50" --metadata disable-legacy-endpoints=true --scopes "https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append" --num-nodes "3" --logging=SYSTEM,WORKLOAD --monitoring=SYSTEM --enable-ip-alias --network "projects/fujiwara-383901/global/networks/default" --subnetwork "projects/fujiwara-383901/regions/europe-southwest1/subnetworks/default" --no-enable-intra-node-visibility --default-max-pods-per-node "110" --security-posture=standard --workload-vulnerability-scanning=disabled --no-enable-master-authorized-networks --addons HorizontalPodAutoscaling,HttpLoadBalancing,GcePersistentDiskCsiDriver --enable-autoupgrade --enable-autorepair --max-surge-upgrade 1 --max-unavailable-upgrade 0 --enable-autoprovisioning --min-cpu 1 --max-cpu 2 --min-memory 2 --max-memory 6 --enable-autoprovisioning-autorepair --enable-autoprovisioning-autoupgrade --autoprovisioning-max-surge-upgrade 1 --autoprovisioning-max-unavailable-upgrade 0 --autoscaling-profile optimize-utilization --enable-vertical-pod-autoscaling --enable-shielded-nodes --zone "europe-southwest1-a"
Adaptá el comando a tu proyecto y a la región que prefieras.
Desplegá lo que necesites en el clúster
El orden en que se despliegan los microservicios no importa mucho, pero para prevenir errores innecesarios en los logs, yo sigo este orden:
naming-server
.api-gateway
.microservice-b
.microservice-a
.
-
Instalá gcloud CLI y kubectl en tu máquina.
-
Hacé clic en “Establish Connection”. Eso te va a dar un comando de gcloud.
-
Pegá el comando en tu terminal favorita.
-
Navegá hasta donde esté el archivo deployment.yaml. Yo decidí ponerlo en deployment/kubernetes/prod.
-
Ejecutá:
kubectl apply -f deployment.yaml
Deberías ver algo similar a esto:
E0411 12:36:32.181316 19120 memcache.go:287] couldn't get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request
E0411 12:36:32.280107 19120 memcache.go:121] couldn't get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request
Warning: autopilot-default-resources-mutator:Autopilot updated Deployment default/naming-server: adjusted resources to meet requirements for containers [spring-cloud-v2-naming-server] (see http://g.co/gke/autopilot-resources)
deployment.apps/naming-server created
service/naming-server created
Ahora, repetí el proceso de despliegue para el resto de los microservicios.
Después de unos minutos, ejecutá:
kubectl get pods
Para verificar que todo esté corriendo sin problemas.
NAME READY STATUS RESTARTS AGE
api-gateway-85cd954d8-57kp2 1/1 Running 0 10m
microservice-a-6978854d7b-24j45 1/1 Running 0 58m
microservice-b-6f6c5944b4-tgcvb 1/1 Running 0 17m
naming-server-f4795fd84-q9l8x 1/1 Running 0 14m
Probémoslo
Para obtener la URL, ejecutá:
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
api-gateway LoadBalancer 10.111.196.131 34.175.79.29 8765:30836/TCP 114m
kubernetes ClusterIP 10.111.192.1 <none> 443/TCP 126m
microservice-a ClusterIP 10.111.196.50 <none> 8081/TCP 63m
microservice-b ClusterIP 10.111.194.149 <none> 8080/TCP 110m
naming-server ClusterIP 10.111.193.218 <none> 8761/TCP 116m
Vas a notar que solo el api-gateway tiene EXTERNAL-IP. Tomá esa URL, agregale el puerto al final, sumale /microservice-a, y deberías obtener una respuesta.
curl --location '34.175.79.29:8765/microservice-a'
¡Felicitaciones, ahora desplegaste tus servicios en GKE!
Recordá borrar el clúster cuando termines
Un recordatorio :D