Tengo un kubernetes (v1.18.6) con 1 servicio (loadbalancer), 2 pods en un desarrollo:
apiVersion: v1 kind: Service metadata: name: app-service spec: selector: app: app ports: - protocol: "TCP" port: 6000 targetPort: 5000 type: LoadBalancer
Una política de red para acceder a Intentert (es necesaria para mí):
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: internet-access spec: podSelector: matchLabels: networking/allow-internet-access: "true" policyTypes: - Ingress - Egress ingress: - {}
Archivo de configuración de implementación
apiVersion: apps/v1 kind: Deployment metadata: name: app-deployment spec: progressDeadlineSeconds: 120 selector: matchLabels: app: app replicas: 2 template: metadata: labels: app: app spec: imagePullSecrets: - name: myregistrykey containers: - name: app image: app imagePullPolicy: Always ports: - containerPort: 5000
Está funcionando correctamente. Pero ahora quiero conectar esta imagen a una base de datos externa (en otra red solo acceso por internet). Para esta proposición utilizo este servicio:
apiVersion: v1 kind: Service metadata: name: postgresql spec: clusterIP: None ports: - port: 25060 --- apiVersion: v1 kind: Endpoints metadata: name: postgresql subsets: - addresses: - ip: 206............ ports: - port: 25060 name: postgresql
Es todos los servicios:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE app-service LoadBalancer 10.245.134.137 206........... 6000:31726/TCP 2d4h kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 3d7h postgresql ClusterIP None <none> 25060/TCP 19h
Pero cuando intento conectarme, recibo un error de tiempo de espera de la base de datos, como si no pudiera conectarme a la base de datos.
Tengo conexión a internet en la imagen.
Encontré la solución, el problema eran las reglas de entrada de la base de datos. Debo agregar la IP de Kubernetes.
Gracias.
Esto es lo que funcionó para mí:
Defina un servicio, pero establezca clusterIP: None
, por lo que no se crea un punto final.
Y luego cree un punto final usted mismo con el MISMO NOMBRE que su servicio y configure la IP y el puerto de su db.
En su ejemplo, tiene un tipo en su punto final: el nombre de su punto final es postgresql, no postgresSql.
mi ejemplo:
--- service.yaml kind: Service apiVersion: v1 metadata: name: backend-mobile-db-service spec: clusterIP: None ports: - port: 5984 --- kind: Endpoints apiVersion: v1 metadata: name: backend-mobile-db-service subsets: - addresses: - ip: 192.168.1.50 ports: - port: 5984 name: backend-mobile-db-service
Si entiendo correctamente, tiene su clúster con aplicación en la nube de Digital Ocean
y su PostgreSQL
está fuera de este clúster.
En su servicio de application service
Application Deployment
<>, ha utilizado servicios con selectores , por lo que no necesitaba crear Endpoints
manualmente.
En su external database service
, ha utilizado servicios sin selectores , por lo que tuvo que crear Endpoint
manualmente.
Como la base de datos es external service
, usar clusterIP: None
tiene sentido, ya que intentará hacer coincidir los pods dentro del clúster. Supongo que lo agregó a medida que lee en este documento .
Lo último es que en Endpoint
configuras ip: 206...
que es lo mismo que el servicio de aplicación LoadBalancer
ip?
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE app-service LoadBalancer 10.245.134.137 206........... 6000:31726/TCP 2d4h subsets: - addresses: - ip: 206............
Es solo una parte de la información, así que supongo. Sin embargo, en esta parte debe proporcionar la IP de la base de database
deseada, no la IP del Loadbalancer
de su aplicación.
Ahora, según el escenario, puede conectarse:
Puede encontrar información detallada sobre los escenarios anteriores en las mejores prácticas de Kubernetes: mapeo de servicios externos
Según su configuración actual, supongo que desea usar el scenario 1
.
Si esta base de database
y cluster
están en algún lugar de la nube, podría usar internal Database IP
. De lo contrario, debe proporcionar la IP de la máquina donde se aloja esta base de datos.
También puede leer el artículo Servicios externos de acceso de Kubernetes .
Avíseme si aún tendrá problemas después del cambio de IP
Para una mejor visibilidad, coloco la respuesta OP mencionada en la pregunta:
Encontré la solución, el problema eran las reglas de entrada de la base de datos. Debo agregar la IP de Kubernetes