Commit 61bc0b9b authored by Cristian Aguirre's avatar Cristian Aguirre

Update 31-07-23. Update README

parent 3176aa51
......@@ -207,8 +207,8 @@ ellos. Minio reemplazaría AWS S3 dado que ya nos va a proporcionar los buckets.
1.- Descargar el instalador y ejecutarlo con los siguientes comandos (Para Debian/Ubuntu):
```shell
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20230602231726.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20230602231726.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb
```
2.- Vamos a crear una carpeta para que se alojen ahí todos los buckets que en un futuro se creen. Ejecutamos:
......@@ -236,3 +236,228 @@ y listo, tenemos Minio para poder crear buckets y serviría como reemplazo de AW
Referencia: [Instalar Minio Server y Opcionalmente Minio Client](https://www.youtube.com/watch?v=EsJHf5nUYyA&ab_channel=MinIO)
## Desplegar Proceso Airflow en Google Cloud Platform (GCP) - Google Kubernetes Engine (GKE)
Ahora se procede a instalar los componentes de Airflow para despliegue en GKE, para esto es necesario
tener presente los siquientes requisitos:
```text
- Tener instalada en su versión más reciente el gcloud (CLI de GCP) para usar los comandos de gcloud en nuestro terminal.
Referencia: https://cloud.google.com/sdk/docs/install
- Tener un proyecto creado en GCP (Esto desde la consola de GCP)
- Tener instalado "kubectl" para usar los comandos y manipular nuestro clúster de Kubernetes
- Tener conocimientos sobre Kubernetes y los comandos con kubectl
- Tener los permisos necesarios en tu cuenta de GCP para poder realizar los comandos siguientes
(particularmente para los servicios GKE, IAM, Filestore y VMs)
```
1.- Setear nuestro proyecto con gcloud. Por ejemplo de la siguiente manera:
```text
gcloud config set project airflow-gke-338120
Donde "airflow-gke-338120" es el ID del proyecto
```
2.- Crear el clúster en gke por vía de comandos. Por ejemplo:
```text
gcloud container clusters create airflow-cluster \
--machine-type n1-standard-4 \
--num-nodes 1 \
--region "asia-east1-a"
Donde:
- "airflow-cluster" es el nombre del clúster
- "n1-standard-4" es el tipo de instancia que tendrá los nodos del clúster
- "1" será el N° de nodos que tendrá nuestro clúster
- "asia-east1-a" será la región donde crearemos el clúster
```
Hay que tener en cuento lo siguiente:
- Si nos pide autenticación para crear el clúster, lo hacemos, esto mediante nuestro correo electrónico
de gmail o nuestra cuenta en GCP.
- Tener en cuenta los límites o quotas que tenemos para nuestra cuenta y la región donde
estamos desplegando nuestro clúster y demás recursos (Esto si estamos usando GCP con el método de quotas)
3.- Una vez creado el clúster, se procede a configurarlo para que tenga los permisos necesarios y usar
otros recursos de GCP, particularmente el bucket donde se alojan nuestros DAGS.
Este método habilitará "Workload Identity" tanto para el clúster y sus nodos para que el clúster
actúe en nombre de las cuentas de servicios que se generarán y estas cuentas serán las que tengan
los permisos necesarios para utilizar otros recursos GCP. Referencia:
[Habilitar Workload Identity](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity?hl=es-419&_ga=2.68907346.-259342969.1690208432#console_1)
Para esto usamos los siguientes comandos:
```text
# Activamos la configuración de Workload Identity para nuestro clúster creado. Por ejemplo:
gcloud container clusters update airflow-cluster2 \
--region=asia-east1-a \
--workload-pool=airflow-test-394115.svc.id.goog
* Donde "airflow-cluster2" es nombre de nuestro clúster, "asia-east1-a" región donde desplegamos
y "airflow-test-394115" es el ID del proyecto GCP
# Actualizamos la configuración de nuestro grupo de nodos para que tenga la configuración del clúster
gcloud container node-pools update default-pool \
--cluster=airflow-cluster2 \
--region=asia-east1-a \
--workload-metadata=GKE_METADATA
* Donde "default-pool" es el nombre de nuestro grupo de nodos (default-pool es el nombre por defecto),
"airflow-cluster2" es nombre de nuestro clúster y "asia-east1-a" región donde desplegamos
# Obtenemos las credenciales de nuestro clúster creado y poder usarlo con kubectl en nuestro terminal
gcloud container clusters get-credentials airflow-cluster2 \
--region=asia-east1-a
* Donde "airflow-cluster2" es nombre de nuestro clúster y "asia-east1-a" región donde desplegamos
```
4.- Luego de configurar nuestro clúster, vamos a crear un namespace y cuenta de servicio de la
siguiente manera:
```text
# Creamos un namespace, por ejemplo con nombre "bcom-airflow"
kubectl create namespace bcom-airflow
# Creamos un "service account" con nombre "bcom-airflow"
kubectl create serviceaccount bcom-airflow \
--namespace bcom-airflow
```
5.- Ahora vamos a crear una cuenta de servicio en IAM de GCP con el mismo nombre que creamos anteriormente
nuestro "service account" y darle los permisos necesarios:
```text
# Creamos la cuenta de servicio
gcloud iam service-accounts create bcom-airflow \
--project=airflow-test-394115
* Donde "bcom-airflow" es el nombre de la cuenta de servicio IAM y "airflow-test-394115" es el ID del proyecto GCP
# Agregamos a nuestra cuenta creada, los permisos que necesita con el comando:
gcloud projects add-iam-policy-binding airflow-test-394115 \
--member "serviceAccount:bcom-airflow@airflow-test-394115.iam.gserviceaccount.com" \
--role "roles/owner"
* Donde "airflow-test-394115" es el ID del proyecto GCP, "bcom-airflow" es el nombre de la cuenta
de servicio y "roles/owner" es el rol que tiene nuestra cuenta sobre el proyecto.
# Ahora vamos a asociar esta cuenta a nuestro clúster
gcloud iam service-accounts add-iam-policy-binding bcom-airflow@airflow-test-394115.iam.gserviceaccount.com \
--role roles/iam.workloadIdentityUser \
--member "serviceAccount:airflow-test-394115.svc.id.goog[bcom-airflow/bcom-airflow]"
* Donde "bcom-airflow" es el nombre de la cuenta de servicio, "airflow-test-394115" es el ID
de nuestro proyecto, además que los "bcom-airflow" es por [namespace]/[serviceaccount]
```
6.- Actualizamos nuestro "service account" local para que use nuestra cuenta de servicio IAM
```text
kubectl annotate serviceaccount bcom-airflow \
--namespace bcom-airflow \
iam.gke.io/gcp-service-account=bcom-airflow@airflow-test-394115.iam.gserviceaccount.com
* Donde "bcom-airflow" hace referencia al "service account" local, namespace y cuenta de servicio IAM.
Y "airflow-test-394115" es el ID del proyecto GCP
```
Listo! Tenemos nuestro clúster configurado a la espera de las configuraciones de los otros recursos:
Filestore y Buckets.
### Desplegar Servidor NFS con GCP - Filestore
1.- Primero se tiene que crear una instancia NFS en la consola de GCP. Dependiendo de los
requerimientos, se puede configurar el tamaño de disco, tipo de disco (HDD o SSD), entre otros.
Para este caso básico, creamos una instancia básica de tipo HDD, con el mínimo de tamaño que es
de 1Ti, en la región "asia-easat1-a", en la red por default y nombre de archivo compartido "volume1"
Por ejemplo:
![image](readme-images/filestore1.png)
**Tener claro y/o apuntar la "Dirección IP" que se muestra en la imagen**
⚠️ Advertencia: Estos pasos siguientes son para la creación de paths requeridos por el proceso
que esten dentro del servidor NFS.
2.- Ahora vamos a crear una instancia básica (Virtual machine) para poder acceder a nuestro NFS
y crear los paths necesarios que usará nuestro proceso
```text
# Crear nuestra instancia en la región donde esta el NFS:
gcloud compute instances create bastion --zone asia-east1-a
* Donde "bastion" es el nombre de la VM y "asia-east1-a" región donde esta nuestro NFS
# Luego vamos a acceder a la VM con el comando (por SSH):
gcloud compute ssh bastion --zone asia-east1-a
* Donde "bastion" es el nombre de la VM y "asia-east1-a" región donde esta nuestro NFS
```
3.- Ahora que estamos dentro de la VM, ejecutamos los siguientes comandos:
```text
# Actualizamos e instalamos el paquete necesario
- sudo -i
- apt update -y
- apt install nfs-common -y
# Creamos una carpeta donde montaremos nuestro NFS, montamos y nos colocamos ahi
- mkdir /mnt/volume1 (cualquier en vez de volume1)
- mount 10.98.100.98:/volume1 /mnt/volume1 (10.98.100.98 es la Dirección IP) y "volume1"
nombre del archivo compartido
- cd /mnt/volume1
# Una vez que estamos situados dentro de la carpeta compartida, creamos y damos permisos a las siguientes carpetas
- mkdir nfs_share
- mkdir nfs_logs
- mkdir nfs_postgres
- chmod -R 777 nfs_share
- chmod -R 777 nfs_logs
- chmod -R 777 nfs_postgres
```
! Listo, tenemos nuestro NFS con las carpetas listas para que nuestro proceso las tome.
⚠️ Tener en cuenta lo siguiente:
- La dirección IP debe colocarse en el template: "airflow-volumes.yaml" en el parámetro nfs.path
de todos los PersistantVolume - PV (son 3)
### Creación de bucket en GCP - Google Cloud Storage - Buckets
Luego de tener listo lo anterior, se tiene que crear un bucket donde se alojará nuestro
código (los DAGS) para que el proceso pueda actualizarlos en caliente.
1.- Por ejemplo creamos el bucket "prueba-rsync2" y dentro de él una carpeta llamada "carpeta" (Puede
ser cualquier nombre)
2.- Colocamos nuestro código dentro de la carpeta, se verá de la siguiente manera:
![image](readme-images/bucket1.png)
⚠️ Advertencia: Tener en cuenta esta ruta creada, para nuestro ejemplo la ruta creada del bucket
y la carpeta sería: _gs://prueba-rsync2/carpeta_. La cual deberá ser colocada en nuestro
archivo de configuración (configmap) en el parámetro de: **"GCS_DAGS_DIR"**
Listo. Con esto se ha configurado todos los servicios requeridos para levantar nuestro proceso
### Desplegando Airflow con GKE
1.-
app:
schedule: "@once"
inform_dag_schedule: "@once"
reset_dag_schedule: "@once"
database:
sources:
source1:
......@@ -26,16 +28,16 @@ app:
procedure_mask: procedure # S
transformation_mask: transform # S
prefix_order_delimiter: .
cloud_provider: google
cloud_provider: aws
scripts:
s3_params:
bucket: prueba-airflow
bucket: prueba1234568
prefix: bcom_scripts
connection_id: conn_script
control:
s3_params:
connection_id: conn_script
bucket: prueba-airflow
bucket: prueba1234568
prefix: bcom_control
filename: control_example.json
timezone: 'GMT-5'
......@@ -46,7 +48,13 @@ app:
delimiter: '|'
tmp_path: /tmp
s3_params:
bucket: prueba-airflow
bucket: prueba1234568
prefix: bcom_results
connection_id: conn_script
report:
s3_params:
bucket: prueba1234568
prefix: bcom_report
connection_id: conn_script
filename: report_<datetime>.xlsx
datetime_pattern: '%Y-%m-%d %H:%M:%S'
......@@ -22,7 +22,7 @@ import logging
logger = logging.getLogger()
DAG_NAME = "BCOM_DAG_TRANSFORMACIONES4"
DAG_NAME = "BCOM_DAG_EXTRACT_AND_TRANSFORM"
# Change this path if is deployed in prod or dev
MAIN_PATH = "/root/airflow/dags/"
......
FROM apache/airflow:2.5.3
FROM apache/airflow:slim-2.5.3
COPY requirements.txt /
RUN pip install --no-cache-dir "apache-airflow==2.5.3" "apache-airflow[kubernetes]==2.5.3" -r /requirements.txt
\ No newline at end of file
......@@ -77,7 +77,7 @@ data:
AIRFLOW__CORE__DEFAULT_TIMEZONE: America/Lima
AIRFLOW__KUBERNETES__KUBE_CLIENT_REQUEST_ARGS: '{"_request_timeout": [60,60]}'
AIRFLOW__KUBERNETES__WORKER_CONTAINER_REPOSITORY: cristianfernando/airflow_custom
AIRFLOW__KUBERNETES__WORKER_CONTAINER_TAG: "0.0.4"
AIRFLOW__KUBERNETES__WORKER_CONTAINER_TAG: "0.0.5"
AIRFLOW__KUBERNETES__LOGS_VOLUME_CLAIM: airflow-logs-pvc
AIRFLOW__KUBERNETES__ENV_FROM_CONFIGMAP_REF: airflow-envvars-configmap
AIRFLOW__KUBERNETES_EXECUTOR__POD_TEMPLATE_FILE: /opt/airflow/templates/pod_template.yaml
......
apache-airflow[kubernetes]==2.5.3
openpyxl==3.1.2
XlsxWriter==3.1.2
pymysql==1.1.0
oracledb==1.3.2
apache-airflow-providers-google
apache-airflow-providers-amazon
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment