¿Qué o cómo mejorar? Python, React, Postgresql

wdaoajw

Pero a que estas atacando? Piensa que tienes que acceder a través del ingress controller, y esto significa que tienes que atacar al servicio del ingressController.

Lanza el curl contra la IP publica del LoadBalancer

1 respuesta
Yekale7

#31 Claro, estaba atacando a grafana desde nginx. Los curls no los hago desde mi PC, los hacía desde dentro del POD de nginx. Haciendo curl al NGINX recibo perfectamente el 502.

El nginx en los logs ataca al pod de grafana y no es capaz de alcanzarlo. El tema que eso debería gestionarlo Kubernetes no? Utilizarán su API para hablar entre PODs...

1 respuesta
wdaoajw

#32 Si deberian, lanza un kubectl get endpoints a ver si ese servicio de grafana tiene como endpoint el pod de grafana

Despues lanza un curl al servicio de Grafana a ver si esta funcionando como deberia

1 respuesta
Yekale7

#33

PS C:\Users\X> kubectl get endpoints -n monitoring
NAME                                                        ENDPOINTS                                                        AGE
alertmanager-operated                                       10.244.0.3:9094,10.244.0.3:9094,10.244.0.3:9093                  19h
kube-prometheus-stack-1643-alertmanager                     10.244.0.3:9093                                                  19h
kube-prometheus-stack-1643-operator                         10.244.0.2:10250                                                 19h
kube-prometheus-stack-1643-prometheus                       10.244.0.5:9090                                                  19h
kube-prometheus-stack-1643570798-grafana                    10.244.0.2:3000                                                  19h
kube-prometheus-stack-1643570798-kube-state-metrics         10.244.0.4:8080                                                  19h
kube-prometheus-stack-1643570798-prometheus-node-exporter   10.0.10.133:9100,10.0.10.205:9100,10.0.10.218:9100 + 1 more...   19h
prometheus-operated                                         10.244.0.5:9090                                                  19h

El endpoint es 10.244.0.2:3000 y el curl desde nginx devolvía:

bash-5.1$ curl -k -v http://10.244.0.2:3000
*   Trying 10.244.0.2:3000...
* connect to 10.244.0.2 port 3000 failed: Host is unreachable
* Failed to connect to 10.244.0.2 port 3000 after 3078 ms: Host is unreachable
* Closing connection 0
curl: (7) Failed to connect to 10.244.0.2 port 3000 after 3078 ms: Host is unreachable

No sé... quizás como están en diferentes nodos sea la subnet del load balancer, pero todos estos paquetes deberían ir por la API que está permitido por defecto por Oracle. Es más, he ido permitiendo todo el tráfico en cada subnet por si acaso.

wdaoajw

Y los nodos del cluster esta bien? Pegale un reinicio a los pods de coredns

1 1 respuesta
Yekale7

#35 Creo que has acertado de pleno, no sé como no miré antes ....

Readiness probe failed: Get "http://10.244.1.130:8181/ready": dial tcp 10.244.1.130:8181: i/o timeout (Client.Timeout exceeded while awaiting headers)

Edit: ahora en algún punto, el paquete lo "dropean" porque no recibo respuesta del curl:

bash-5.1$ curl -k -v http://10.86.65.70:80
*   Trying 10.86.65.70:80...
* connect to 10.86.65.70 port 80 failed: Operation timed out
* Failed to connect to 10.86.65.70 port 80 after 130311 ms: Operation timed out
* Closing connection 0
curl: (28) Failed to connect to 10.86.65.70 port 80 after 130311 ms: Operation timed out

Edit: teóricamente kubernetes muy top, pero menudo trabajo...

Edit 2: Nada, me cansé y empecé literalmente de 0 borrando el clúster. Hice el deploy con los cambios que indiqué antes, y ahora todo ha funcionado a la primera....

Gracias por la ayuda #35

1 1 respuesta
wdaoajw

#36 tenías tostado coredns, y probablemente calico también, por tanto el cluster estaba tostado a nivel de networking.

Es un problema raro, pero oye, si ya está solucionado me alegro

1 1 respuesta
Yekale7

#37 Sí, estaba el clúster tocado. Ahora que funciona perfecto es una maravilla.

Yekale7

#2 #3 Ahora que tengo Kubernetes montado y aparentemente estoy entiendo su funcionamiento, aprovecho para preguntar:

Tengo dos opciones:

  1. Crear un volumen en el nodo y simplemente tener la BD en el nodo como lo tengo ahora, pero dentro de un container.
  2. Crear un volumen compartido

En el segundo caso:

  1. La BD actual (Postgresql) si creo un pods, con su servicio necesitaría un volumen persistente en caso que falle un nodo cualquiera tenga acceso a la BD correcto?
  2. Lo mismo con la web, entiendo que necesito otro volumen persistente.

Quizás, sea algo excesivo este nivel de redundancia

1 respuesta
D

Directamente no soy partidario de albergar bases de datos en pods, sobretodo si son base de datos críticas

1 respuesta
Yekale7

#40 Sí, creo que es algo con lo que tener mucho cuidado. El tema que la BD lo ideal sería que fuera accesible por el clúster, de forma que puedo repartir todos los procesos que ejecuto en diferentes hosts. Podría añadir servidores de diferentes ubicaciones etc...

Y si encima, kubernetes me gestiona los enlaces entre nodos es algo que simplifica bastante una vez montado...


Ahora mismo, todo lo principal está en dos hosts porque tengo dos BD replicadas...

Host A. Base de datos principal donde se hacen todas las escrituras., se ejecutan los scripts de Python, etc...
Host B. Base de datos secundaria donde se replica y está la web etc...

El Host B puede escribir en la DB del Host A.

wdaoajw

#39 ojo que montar bbdds en pods es algo más complicado de lo que parece.

Vamos por partes, lo primero es que si necesitas almacenamiento persistente dentro de un pod, si o si necesitas crear un Persistente Volume Claim (PVC) del tipo que tú necesites (no te recomiendo nunca utilizar espacio del nodo, si no que utilices los tipos de almacenamiento que te da el Cloud provider, algún tipo de block storage tendrá Oracle)

Por tanto, si quieres crear un cluster de Postgres, necesitarías al menos un PVC para la instancia primaria y otra para la standby o read-replica.

Si el pod del frontend necesita también almacenamiento persistente pues lo mismo, un PVC del tipo que necesites.

Por otro lado, si quieres crear cosas más complejas que levantar un simple por de Postgres, échale un ojo a Helm, que hará toda tu vida muchísimo más sencilla en este sentido.

1 respuesta
D

Mi duda es que pasa si un pod pasa del host A al B. Mi experiencia con AWS, es que los PVC son EBS, y si pasa eso, el solito hace attach al nodo donde se levanta el pod y, si es en la misma AZ; aquí no pasa nada.

Pero no sé donde tiene montado el cluster de k8s

1 respuesta
Yekale7

#43 Oracle, sería lo mismo teóricamente. Los hosts que he nombrado NO son los de kubernetes, perdona la confusión.

#42 Sí, he visto el repositorio Helm con el que he creado el stack de prometheus y grafana. Revisaré los volúmenes PVC

1 respuesta
D

#44 En ese caso, solo has de preocuparte de crear un Persistent Volume con su Persistent Volume Claim y attach al pod

1 respuesta
JuAn4k4

Como te han dicho con PVC te vale, eso si yo tiraría de servicios que te diera el cloud provider lo maximo posible (bds, load balancers, certificados, etc)

1 respuesta
Yekale7

#45 #46 Perfecto, lo único que mi estructura ahora mismo es al siguiente:

Actual:
1x VPS (Host A), servidores de 8 cores y hace escrituras constantes a la DB. Servidor que contiene la DB.
1x VPS (Host B), servidor de 6 cores y hace lecturas en la DB de replica (suya) y muy pocas escrituras en la DB primaria (Host A)

Lo nuevo:
4x Nodos de Oracle que los dejaré en 3 nodos ya que así aprovecho su capa gratuita. Estos nodos son muy básicos, poca potencia. Aquí debería mover la web y quizás la Base de datos porque es la única forma que tengo de hacer uso del PVC en Oracle. La contra que tendría que hacer todas las escrituras a través de red externa (Host A hacia al clúster).

Entonces creo que lo simple es meter en un contenedor la DB y dejarlo como está ahora mismo en el Host A... Podría plantear la secundaria en el clúster de Oracle...

Tengo tantos cambios pendientes que ya no sé que es lo más conviene...

Yekale7

Tengo varios pods que actúan como proxies de la siguiente forma:

El fichero que define el servicio y pod:

apiVersion: v1
kind: Service
metadata:
  name: squid-service
  labels:
    app: squid
spec:
  type: NodePort
  ports:
    - port: 3128
      targetPort: 3128
      nodePort: 31280
  selector:
    app: squid
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: squid-deployment
spec:
  selector:
    matchLabels:
      app: squid
  template:
    metadata:
      labels:
        app: squid
    spec:
      containers:
        - name: squid
          image: ubuntu/squid:edge
          ports:
            - containerPort: 3128
              name: squid
              protocol: TCP
          volumeMounts:
            - name: squid-config-volume
              mountPath: /etc/squid/squid.conf
              subPath: squid.conf
            - name: squid-data
              mountPath: /var/spool/squid
      volumes:
        - name: squid-config-volume
          configMap:
            name: squid-config
            items:
              - key: squid
                path: squid.conf

El problema que me conecto a los pods por la IP del nodo y su puerto, esperando que ahora mi IP sea la IP del Nodo (proxy) al que me he conectado, pero me devuelve la IP de un Nodo aleatorio....

Vamos que el servicio está asignandome el pod erróneo...
¿Creo servicios independientes? ¿Hay algo mal en la definición del servicio?

PD: ¿Quizás sea por los labels que no son dinámicos?

Edit: Lo he solucionado creando 4 servicios y 4 deployments independientes. No hay otra alternativa que haya podido encontrar

2 respuestas
wdaoajw

#48 los servicios, sean del tipo que sean hacen balanceo de carga entre sus endpoints. Por tanto, si tienes un servicio para todos los pods del daemonset, cada vez te redirigirá contra el que vea conveniente

1 1 respuesta
pineda

#48 no se si te he entendido. Quieres que un cliente vaya a un nodo, y sus posteriores peticiones siempre vayan a ese mismo nodo? Si es así, lo que buscas es sticky session

1 respuesta
Yekale7

#50 Sí, pero sabiendo lo que ha comentado #49 directamente hice un servicio para cada nodo etc... Así, tengo 4 servicios independientes con sus correspondiente endpoint y deployment + replicaset (1). Al ser un proxy, no tiene sentido que se balancee a otros nodos si falla y me quiero conectar al que yo decida desde el otro extremo.

2 respuestas
pineda

#51 es una solución, pero huele bastante raro que debas crear un nuevo endpoint + service + deployment por cada nodo, no es la mejor forma de escalar :thumbsup:

por ejemplo, y si se cae uno de los 4 nodos? ese endpoint deja de dar servicio

1 respuesta
wdaoajw

#51 Lo que te ocurre es que no lo estas haciendo "The kubernetes way". Me explico:

Tu desde un pod de Kubernetes puedes (asignandole una ServiceAccount con permisos) atacar a la api de kubernetes y obtener todos los endpoints que hay bajo un determinado servicio. Esto es lo ideal porque si mañana metes mas nodos, esto se escala automaticamente al ser un DaemonSet. Obteniendo la info de los endpoints de la API de k8s puedes atacar directamente al clusterIp de los pods, que entiendo que es lo que necesitas hacer.

Lo que no me queda claro es porque quieres acceder a los NODOS.

1 respuesta
Yekale7

#52 Correcto, si se cae un nodo adiós endpoint etc... Al final, no aprovecharía las posibilidades que da Kubernetes. Sufría lo mismo que teniendo un simple contenedor de docker o un servicio en linux.

#53 Claro, efectivamente eso sería lo ideal pero sin balanceo a menos que hubiera una perdida de un Nodo. En mi caso concreto, tengo varios proxies por lo que me interesa que cada Pod esté en un nodo para tener una IP pública diferente, y salir por ese Nodo. En caso que fallase uno de los Nodos, podría plantearse que se migrase el Pod y salir por en Load Balancer (IP extra) en vez del Nodo en que resida el Pod migrado.

Quizás, no me explique correctamente con el 'acceder'. Necesito salir por el nodo que yo prefiera, a menos que haya una caída de uno de los nodos -> Load Balancer. Un servidor A se comunica con 3 nodos y necesita 3 IPs diferentes, lo que significa que debo conectarme a 3 pods que estén ubicados en nodos diferentes.

1 respuesta
wdaoajw

#54 no entiendo porque necesitas salir por una IP u otra. Es decir, entiendo que necesitas un egress, pero te estás montando un egress por nodo, lo cual es absurdo ya que si sales directamente desde el pod de la app ya sales con la IP del nodo.

Si lo que necesitas es salir siempre con la misma IP, pues levanta el proxy con condiciones de Affinity para que levante siempre en un mismo nodo(o grupo de nodos) y gestiona las reglas de acceso en base a esos nodos

1 respuesta
pineda

no se en que plataforma estas trabajando, pero quizás podrías estudiar tener varias gateway NAT, y que cada pod pille la NAT que deba

1 respuesta
Yekale7

#55

#55wdaoajw:

directamente desde el pod de la app ya sales con la IP del nodo

Y esto es lo que está pasando ahora mismo. Necesito 1 pod en cada Nodo, de ahí que ahora tenga 1 servicio 1 pod 1 endpoint por Nodo.

Antes tenía el DaemonSet, pero el servicio me daba el pod que le diese la gana. Necesito saber que estoy atacando a un proxy/pod concreto.

Partimos del principio y explico mi situación. Tengo 2 scripts cada uno se conecta a un proxy (pod) porque necesito 2 IPs diferentes. Ahora tengo montado 2 pods, 2 servicios y 2 endpoints. Ahora mismo está perfecto, pero si falla un Nodo pues pierdo el pod y no tengo replica ni nada.

La mejora sería que se crease un nuevo pod y me diera la IP del Load Balancer o la del otro Nodo (no es ideal, pero me serviría), claro que mi script estaría llamando a la IP del Nodo caído, por lo que independientemente de lo que haga en el clúster, el script seguiría preguntando a la IP del nodo caído (esto lo puedo solucionar desde el lado del script, obviamente).

No sé si me he explicado.

#56 No creo que pueda hacer eso

1 respuesta
wdaoajw

#57 Pero las dos IPs por las que sales necesitas que sean fijas? Es indiferente el salir por una o por otra?

1 respuesta
Yekale7

#58 No es indiferente. Necesito salir siempre por la misma que haya elegido, siempre deben ser fijas.

1 respuesta
wdaoajw

#59 En ese caso lo ideal seria que te hicieras con un par de IPs publicas fijas del cloud provider, se las asignaras a 2 instancias y salieras a través de ellas.