diff --git a/README.md b/README.md index e7c335d..811cfda 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,70 @@ -Todas las variables que se repiten y que, en un principio, no tendría sentido cambiarlas para este chart se marcaron con default. +# Uso de `run.sh` -Por ejemplo, busque los default de service.yaml. Verá que `type` es por defecto "ClusterIP" y que `targetPort` es por defecto `$port`. +El script `run.sh` automatiza el proceso de implementación para un entorno de `k8s` utilizando `minikube`. Incluye la construcción de imágenes `Docker`, la personalización de versiones de `Postgres`, la habilitación de `TLS` y la configuración de réplicas para la API. -Esto tiene dos beneficios: +## Requisitos -1) Elimina redundancia en values.yaml -2) Da libertad para que en un futuro se pueda simplemente modificarlo en `values.yaml`. Por ejemplo, supongamos que queremos cambiar el `type` a "NodePort" en el servicio de `api`, basta con hacer el siguiente cambio: +- [Minikube](https://minikube.sigs.k8s.io/docs/start/) +- [Docker](https://docs.docker.com/get-docker/) +- [Helm](https://helm.sh/docs/intro/install/) -```yaml -services: - - api: - name: "api" - tier: "backend" - port: 5000 - type: "NodePort" +## Uso + +```bash +./run.sh -i # Modo interactivo +./run.sh -p -s -r # Modo no interactivo ``` ----------- +## Opciones de línea de comandos -En `ingress` se repite el `host` debido a facilita que la api pueda estar en otro dominio, si así se desea: +- **-i:** Modo interactivo +- **-p :** Especificar la versión de Postgres +- **-s :** Habilitar o deshabilitar SSL (Y para sí, N para no) +- **-r :** Especificar el número de réplicas para la API -```yaml -ingress: - ssl: true - annotations: - nginx.ingress.kubernetes.io/ssl-redirect: "true" - hosts: - - host: kube.slc.ar - paths: - - path: / - name: "client" - port: 8080 - pathType: "Prefix" - - host: api.kube.slc.ar - - path: / - name: "api" - port: 5000 - pathType: "Prefix" - tls: - - secretName: exam-crt - hosts: - - kube.slc.ar - - api.kube.slc.ar +## Funcionalidad del script + +1. **Verificación del estado de Minikube:** + + El script verifica si Minikube ya está en ejecución y lo inicia si no lo está. + +2. **Versión de Postgres y construcción:** + + Solicita al usuario la versión de Postgres, construye imágenes `Docker` y actualiza la versión en el archivo de valores de `Helm`. + +3. **Configuración de TLS:** + + Pregunta al usuario si desea habilitar `TLS` y actualiza el archivo de valores de `Helm` en consecuencia. + +4. **Configuración de réplicas para la API:** + + Solicita al usuario el número de réplicas para la API y actualiza el archivo de valores de `Helm`. + +5. **Configuración de Ingress:** + + Habilita el complemento Ingress si Minikube está en ejecución. + +6. **Implementación de Helm:** + + Verifica la existencia de un release de `Helm` llamado "exam" y lo actualiza o instala según sea necesario. + +## build.sh + +El script `build.sh` es el encargado de construir imágenes de `Docker`. Ofrece diversas opciones para personalizar el proceso de construcción. Aunque es posible ejecutarlo de forma independiente, se recomienda utilizar el script `run.sh`, ya que actúa como `wrapper`. De todos modos se adjunta la documentación pertinente: + +### Uso + +```bash +./build.sh -d -b -v ``` +### Opciones + +- `-b`: Construye las imágenes de `Docker`. +- `-v `: Especifica la versión de `PostgreSQL`. + +### Ejemplo + +```bash +./build.sh -d ejemplo.com -b -v 13.3 +``` \ No newline at end of file diff --git a/build.sh b/build.sh index 24ce490..04d601f 100755 --- a/build.sh +++ b/build.sh @@ -1,21 +1,22 @@ #!/usr/bin/env bash usage() { - printf "$0 usage: \n -x: down\n -d \$DOMAIN: domain\n -t: tests\n -i integration\n" $0 + printf "$0 usage: \n -b: build all\n -v Postgres version\n" $0 exit 0 } -domain= +build=N while getopts ":hd:bv:" arg; do case $arg in - d) domain=${OPTARG} ;; b) build=Y ;; v) version=${OPTARG} ;; h | *) usage ;; esac done +[ "$build" = 'N' ] && exit 0 + export API=data/sample-api-users docker build $API -f $API/Dockerfile.prod -t api:prod export CLIENT=data/sample-client-users diff --git a/helm/README.md b/helm/README.md new file mode 100644 index 0000000..472a461 --- /dev/null +++ b/helm/README.md @@ -0,0 +1,54 @@ + + + +------------------------------------------------------------------------------------------ + + + + +Todas las variables que se repiten y que, en un principio, no tendría sentido cambiarlas para este chart se marcaron con default. + +Por ejemplo, busque los default de service.yaml. Verá que `type` es por defecto "ClusterIP" y que `targetPort` es por defecto `$port`. + +Esto tiene dos beneficios: + +1) Elimina redundancia en values.yaml +2) Da libertad para que en un futuro se pueda simplemente modificarlo en `values.yaml`. Por ejemplo, supongamos que queremos cambiar el `type` a "NodePort" en el servicio de `api`, basta con hacer el siguiente cambio: + +```yaml +services: + - api: + name: "api" + tier: "backend" + port: 5000 + type: "NodePort" +``` + +---------- + +En `ingress` se repite el `host` debido a facilita que la api pueda estar en otro dominio, si así se desea: + +```yaml +ingress: + ssl: true + annotations: + nginx.ingress.kubernetes.io/ssl-redirect: "true" + hosts: + - host: kube.slc.ar + paths: + - path: / + name: "client" + port: 8080 + pathType: "Prefix" + - host: api.kube.slc.ar + - path: / + name: "api" + port: 5000 + pathType: "Prefix" + tls: + - secretName: exam-crt + hosts: + - kube.slc.ar + - api.kube.slc.ar +``` + diff --git a/helm/values.yaml b/helm/values.yaml index 4b7a6d9..282087e 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -98,4 +98,4 @@ deployments: mountPath: /var/lib/postgresql/data storage: pv-storage probe: - command: ['/bin/sh', '-c', 'exec pg_isready -U "$(POSTGRES_USER)" -h localhost -p 5432;'] + command: ['/bin/sh', '-c', 'exec pg_isready -U "$(POSTGRES_USER)" -h 127.0.0.1 -p 5432;'] diff --git a/run.sh b/run.sh index bdd0bc9..b23bc59 100755 --- a/run.sh +++ b/run.sh @@ -1,20 +1,70 @@ #!/usr/bin/env bash +usage() { + printf "$0 usage: \n -i: interactive\n -p : Postgres version\n -s : enable SSL\n -r : API replicas\n" $0 + exit 0 +} + +interactive=false +postgres_version= +enable_ssl= +api_replicas= + +while getopts "ihp:s:r:" arg; do + case $arg in + i) interactive=true ;; + p) postgres_version=${OPTARG} ;; + s) enable_ssl=${OPTARG} ;; + r) api_replicas=${OPTARG} ;; + *) usage ;; + esac +done + +if [ "$#" -gt 1 ] && [ "$1" = "-i" ]; then + interactive=false +fi + minikube status | grep -q "Running" && START_MINIKUBE=false || START_MINIKUBE=true $START_MINIKUBE && minikube start $START_MINIKUBE && eval $(minikube docker-env) -read -p "Do you want to run Postgres with a specific version? [y/N]: " answer +if [ "$interactive" == true ]; then + read -p "Enter the Postgres version (press Enter for default 13.3): " postgres_version + read -p "Do you want to enable SSL? [y/N]: " enable_ssl + read -p "Enter the number of replicas for the API: " api_replicas +fi -if [ "$answer" == "y" ] || [ "$answer" == "Y" ]; then - read -p "Enter the Postgres version: " version - ./build.sh -b -v "${version}" +if [ -n "$postgres_version" ]; then + ./build.sh -b -v "${postgres_version}" sed -ni "/repository: db/ { p; n; /tag:.*/ { - s/tag:.*/tag: ${version}/; + s/tag:.*/tag: ${postgres_version}/; + p; + d; + } + } + p;" helm/values.yaml +else + ./build.sh -b +fi + +if [ -n "$enable_ssl" ]; then + if [ "$enable_ssl" == "y" ] || [ "$enable_ssl" == "Y" ]; then + sed -i "s/ssl: .*/ssl: true/" helm/values.yaml + else + sed -i "s/ssl: .*/ssl: false/" helm/values.yaml + fi +fi + +if [ -n "$api_replicas" ]; then + sed -ni "/port: \*apiPort/ { + p; + n; + /replicas:.*/ { + s/replicas:.*/replicas: ${api_replicas}/; p; d; }