- Orquestación de Contenedores con Kubernetes
- Google Cloud Platform
- Linux (opcional)
- Docker
- Linea de comandos de Google Cloud (gcloud)
- Linea de comandos de Kubectl
Para poder realizar el ejemplo practico en Google Cloud Platform sin incurrir en gastos adicionales, se recomienda utilizar los $300.00 dolares que otorga Google Cloud como regalo al crear una nueva cuenta.
En este paso las aplicaciones tanto de backend y frontend serán dockerizadas y subidas a un registro de Google Cloud Platform, que en este caso será Artifact Registry.
Google Artifact Registry es un servicio de administración y almacenamiento de artefactos de software que permite a los desarrolladores almacenar, administrar y distribuir imágenes de contenedores y paquetes de software en un registro privado seguro. Proporciona una solución integrada y escalable para almacenar y organizar activos como imágenes de Docker, paquetes de sistema y bibliotecas de código, lo que facilita el desarrollo, la implementación y la colaboración en proyectos de software.
Como alternativa, también existe Container Registry de Google , el cual no se recomienda utilizarlo debido a que ya está obsoleto.
- Buscar el servicio Artifact Registry en la consola de Google Cloud Platform.
- Clic en el icono para crear nuevo repositorio.
- Nombrar el repositorio, su tipo y la región en la cual estará ubicado.
- Crear el repositorio
-
Generar build en Docker
docker build -t chat_backend .
-
Etiquetar y subir al registro
docker tag chat_backend us-central1-docker.pkg.dev/my-devops-project-392822/conferencia/chat_backend:latest
docker push us-central1-docker.pkg.dev/my-devops-project-392822/conferencia/chat_backend:v3
docker tag ticket_server gcr.io/my-devops-project-392822/ejemplo/server:latest
docker push gcr.io/my-devops-project-392822/ejemplo/server:latest
-
Generar build en Docker
docker build -t chat_frontend .
-
Etiquetar y subir al registro
docker tag chat_frontend us-central1-docker.pkg.dev/my-devops-project-392822/conferencia/chatfrontend:latest
docker push us-central1-docker.pkg.dev/my-devops-project-392822/conferencia/chatfrontend:latest
docker tag ticket_server gcr.io/my-devops-project-392822/ejemplo/server:latest
docker push gcr.io/my-devops-project-392822/ejemplo/server:latest
-
En la parte superior derecha de la pantalla seleccionar el icono de la terminal que está integrada en Google Cloud Plarform
-
Una vez abiera la terminal de GCP, ingresar el siguiente comando
gcloud container clusters create cluster-de-ejemplo \ --num-nodes=2 \ --machine-type=n1-standard-1 \ --zone=us-central1-a --preemptible
El comando anterior creará un cluster con las siguientes caracteristicas:
- Nombre del clúster: cluster-de-ejemplo
- Número de nodos: 2
- Tipo de máquina: n1-standard-1
- Zona: us-central1-a
- Preemptible: Sí (se están utilizando nodos preemptibles)
- Para evitar incurrir en gastos adicionales, se recomienda crear un cluster zonal debiado a que los clústeres zonales tienden a ser más económicos pero con una menor alta disponibilidad, mientras que los clústeres regionales son más costosos pero ofrecen una alta disponibilidad superior. La elección entre ellos debe basarse en los requisitos de disponibilidad, capacidad financiera y otros factores relevantes para tu aplicación y cargas de trabajo. Por efecto se utilizar un cluster zonal.
La creación del cluster puede tomar varios minutos.
-
Conectar a Kubectl (desde entorno local)
Luego de crear el cluster de Kubernetes, se procede a conectar el cluster a la linea de comandos de Kubectl.
- Actualizar zona con la que se está trabajando
GCP_ZONE=us-east1-b
gcloud config set compute/zone $GCP_ZONE
- Obtener credenciales de cluster
gcloud container clusters get-credentials cluster-de-ejemplo
En Kubernetes, un namespace es un concepto que se utiliza para crear un espacio virtual aislado dentro de un clúster. Cumple la función de organizar y separar recursos y objetos relacionados en diferentes grupos lógicos, lo que ayuda a evitar conflictos y facilita la gestión de aplicaciones y cargas de trabajo en un entorno compartido.
- Crear un namespace:
kubectl create ns conferencia
-
Crear deployment
apiVersion: apps/v1 kind: Deployment metadata: name: mongodb-deployment namespace: conferencia spec: replicas: 2 selector: matchLabels: app: mongodb template: metadata: labels: app: mongodb spec: containers: - name: mongodb image: mongo:latest ports: - containerPort: 27017
-
Crear servicio
apiVersion: v1 kind: Service metadata: name: mongodb-service namespace: conferencia spec: type: ClusterIP # Puedes usar LoadBalancer si estás en un entorno compatible ports: - port: 27017 targetPort: 27017 selector: app: mongodb
-
Crear deployment
apiVersion: apps/v1 kind: Deployment metadata: name: chatappserver namespace: conferencia labels: app: chatappserver spec: replicas: 3 selector: matchLabels: app: chatappserver template: metadata: labels: app: chatappserver spec: containers: - name: chatappserver image: us-central1-docker.pkg.dev/my-devops-project-392822/conferencia/chat_backend:v3 ports: - containerPort: 8080 env: - name: PORT value: "8080" - name: DB_CNN_STRING value: "mongodb://10.100.6.196:27017/chatdb" - name: JWT_KEY value: "p@l4Br4zzz3kr3ttttta"
-
Crear servicio
apiVersion: v1 kind: Service metadata: name: chatappserver-svc namespace: conferencia spec: selector: app: chatappserver ports: - protocol: TCP port: 8080 targetPort: 8080
-
Crear deployment
apiVersion: apps/v1 kind: Deployment metadata: name: chatappfrontend namespace: conferencia labels: app: chatappfrontend spec: replicas: 3 selector: matchLabels: app: chatappfrontend template: metadata: labels: app: chatappfrontend spec: containers: - name: chatappfrontend image: us-central1-docker.pkg.dev/my-devops-project-392822/conferencia/chatfrontend:v4 ports: - containerPort: 80
-
Crear servicio
apiVersion: v1 kind: Service metadata: name: chatappfrontend-svc namespace: conferencia spec: selector: app: chatappfrontend ports: - protocol: TCP port: 80 targetPort: 80 # type: ClusterIP
-
Instalación de NGINX Ingress Controller
El controlador de ingreso Nginx para Kubernetes es un componente de software diseñado para facilitar y gestionar el enrutamiento del tráfico de red entrante hacia los servicios dentro de un clúster de Kubernetes. Actúa como un punto de entrada externo que permite la exposición de servicios de la aplicación a través de reglas de enrutamiento basadas en nombres de host, rutas y otros atributos.
Este controlador de ingreso utiliza el servidor web Nginx para gestionar las solicitudes entrantes y dirigirlas hacia los servicios adecuados en función de las reglas de configuración definidas. Proporciona características como balanceo de carga, redirecciones, reescritura de URL y soporte para la terminación SSL/TLS.
-
Crear un namespace
kubectl create namespace nginx-ingress
-
Desplegar Nginx Controller
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud/deploy.yaml
-
Crear Ingress para frontend
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: chatapp-frontend-ingress namespace: conferencia annotations: kubernetes.io/ingress.name: "nginx" spec: rules: - host: "" http: paths: - pathType: ImplementationSpecific path: / backend: service: name: chatappfrontend-svc port: number: 80
En conclusión, la orquestación de contenedores con Kubernetes representa un gran avance en el mundo de la tecnología, permitiendo a las organizaciones optimizar sus procesos de desarrollo y despliegue de aplicaciones. Hemos explorado cómo Kubernetes proporciona una plataforma robusta y flexible para gestionar y escalar contenedores de manera eficiente, brindando automatización, resiliencia y escalabilidad a nuestras aplicaciones. A medida que continuamos avanzando en esta era digital, es esencial comprender y dominar las capacidades de Kubernetes para aprovechar al máximo su potencial. Al adoptar Kubernetes, estamos preparados para afrontar los desafíos de la orquestación de contenedores y construir un futuro tecnológico más ágil, adaptable y exitoso