Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
bcom-tp-etl-transformation-pipelines
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
general
bcom-tp-etl-transformation-pipelines
Commits
61bc0b9b
Commit
61bc0b9b
authored
Jul 31, 2023
by
Cristian Aguirre
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update 31-07-23. Update README
parent
3176aa51
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
245 additions
and
11 deletions
+245
-11
README.md
README.md
+227
-2
dag_conf.yml
dags/dag_conf.yml
+13
-5
dag_transformacion_bcom.py
dags/dag_transformacion_bcom.py
+1
-1
Dockerfile_worker
deploy-k8/Dockerfile_worker
+1
-1
airflow-envvars-configmap.yaml
deploy-k8/airflow-envvars-configmap.yaml
+1
-1
requirements.txt
deploy-k8/requirements.txt
+2
-1
acceso-bucket1.png
readme-images/acceso-bucket1.png
+0
-0
bucket1.png
readme-images/bucket1.png
+0
-0
filestore1.png
readme-images/filestore1.png
+0
-0
No files found.
README.md
View file @
61bc0b9b
...
...
@@ -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:

**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:

⚠️ 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.
-
dags/dag_conf.yml
View file @
61bc0b9b
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
:
prueba
1234568
prefix
:
bcom_scripts
connection_id
:
conn_script
control
:
s3_params
:
connection_id
:
conn_script
bucket
:
prueba
-airflow
bucket
:
prueba
1234568
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
:
prueba
1234568
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'
dags/dag_transformacion_bcom.py
View file @
61bc0b9b
...
...
@@ -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/"
...
...
deploy-k8/Dockerfile_worker
View file @
61bc0b9b
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
deploy-k8/airflow-envvars-configmap.yaml
View file @
61bc0b9b
...
...
@@ -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
...
...
deploy-k8/requirements.txt
View file @
61bc0b9b
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
readme-images/acceso-bucket1.png
0 → 100644
View file @
61bc0b9b
117 KB
readme-images/bucket1.png
0 → 100644
View file @
61bc0b9b
107 KB
readme-images/filestore1.png
0 → 100644
View file @
61bc0b9b
48 KB
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment