Despliegue del Proyecto en la nube de AWS (EKS)
Clase 20 de 24 • Curso de Kubernetes
Contenido del curso
Clase 20 de 24 • Curso de Kubernetes
Contenido del curso
Alex Henrry Naupay Ferrer
Brayan Jimenez
Alex Henrry Naupay Ferrer
Jose David Marulanda Orozco
Jose David Marulanda Orozco
Juan Pablo Lambertucci
La URL que se pone en requests.js lo puse como variable de entorno y se setea al iniciar el contendor.
Hola, pasa que no cuando intento conectarme a la bd me tira un error de conexion, que debo tener en cuenta al momento de crear la bd en rds?
Puede ser que RDS y el cluster estén en subnets diferentes o las SG no tienen las reglas de entrada.
Hola, revisando el proyecto encontré que al crearse el cluster con eksctl, se crea un stack en CloudFormation que en la definición de la VPC, crea diferentes security groups, entre ellos está el default que tiene:
Fue solo al agregar maualmente, que pude establecer la conexión:
Nota:
Error en README:
En el readme de esta clase 20-aws-eks-deploy hay un error al definir el secreto en el namespace backend.
Al ejecutar este comanto en la CLI de AWS
aws rds create-db-cluster ... --master-username admink8s \ --master-user-password Aggregate4200 \ ...
La contraseña es Aggregate4200, pero al crear el secret:
kubectl -n backend create secret generic mysql --from-literal=DB_PASSWORD=admink8s --from-literal=DB_USER=admink8s ...
Se está usando el mismo valor para DB_USER y DB_PASSWORD, esto puede generar un:
Enter password: ERROR 1045 (28000): Access denied for user 'admink8s'@'192.168.11.26' (using password: YES)
Comparto codigo con arquitectura loadbalancer nginx -> Ingress Rules -> Service cluster IP -> Pods
Realice los mismos pasos de creacion del cluster. Al crear la base en rds, seleccionar opciones configuracion completa donde deja elegir la vps y elegir como security group el que diga ClusterSharedNodeSecurityGroup.
Luego de crear la bd en rds configure:
external name:
apiVersion: v1 kind: Service metadata: name: mysql-external-name spec: type: ExternalName externalName: my-sql-database.ci1qaiy621yn.us-east-1.rds.amazonaws.com
config
apiVersion: v1 kind: ConfigMap metadata: name: mysql-config data: db_name: userdb db_user: admin
secret
apiVersion: v1 kind: Secret metadata: name: mysql-secret type: Opaque data: password: YWRtaW5wYXNzazhz # "adminspassk8s" in base64
En el init-job corregi y adapte los nombres de los secrets y configs keys y del host
piVersion: batch/v1 kind: Job metadata: name: mysql-init-job spec: template: spec: containers: - name: mysql-init image: mysql:8.0 command: - /bin/bash - -c - | mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_ROOT_PASSWORD < /docker-entrypoint-initdb.d/init.sql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: password - name: MYSQL_USER valueFrom: configMapKeyRef: name: mysql-config key: db_user - name: MYSQL_HOST value: mysql-external-name.app.svc.cluster.local volumeMounts: # Aca se monta el volumen en el contenedor, y se le da una ruta, # lo que sucede es que toma cada clave del configmap y la monta como un archivo dentro de esa ruta, # el nombre del archivo es el mismo que la clave del configmap, y el contenido del archivo es el valor de esa clave. - name: init-script mountPath: /docker-entrypoint-initdb.d volumes: # Aca se monta un volumen de tipo configmap, tomando lo que hay en el. - name: init-script configMap: name: mysql-init-script restartPolicy: Never backoffLimit: 4
Una vez corrio el init-job pase a lo siguiente.
Instalacion y creacion del service loadbalancer con nginx-controller
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace
Luego al listar los pods del namespace creado vemos
ingress-nginx-controller LoadBalancer 10.100.179.41 url
La url tambien puede observarse en la consola aws en EC2/load balancers.
Una vez tuve la URL:
EN el backend modifique
@app.route('/api/getMyInfo') app.run(host='0.0.0.0', port=5001)
EN el front la url del loadbalancer creado recien.
Los service los puse tipo cluster IP.
Cree el ingress. yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: aws-ingress spec: ingressClassName: nginx rules: - http: # aca va sin host por que no tengo un dominio el cual hacer cname al dns name del ingress. paths: - path: / pathType: Prefix backend: service: name: frontend-service port: number: 80 - path: /api pathType: Prefix backend: service: name: backend-service port: number: 5001