1
votes

La connexion MySQL a échoué entre 2 pods dans Kubernetes

Je suis un débutant sur Kubernetes et j'essaye de générer 2 pods comprenant une application frontale et un mysql back-end. Tout d'abord, je crée un fichier yaml qui contient à la fois l'application et le serveur mysql comme ci-dessous,

apiVersion: v1
kind: Pod
metadata:
  name: blog-mysql
  labels: 
    app: blog-mysql
spec:
  containers:
  - name: blog-mysql
    image: mysql:latest
    env:
      - name: MYSQL_ROOT_PASSWORD
        value: password
      - name: MYSQL_PASSWORD
        value: password
      - name: MYSQL_DATABASE
        value: test
    ports:
      - containerPort: 3306

L'url mysql jdbc de l'application frontale est jdbc: mysql: // localhost: 3306 / test . Et la génération de pod est réussie. L'application et mysql sont connectés sans erreur. Et cette fois, je sépare le pod d'application et le pod mysql en 2 fichiers yaml.

== pod-app.yaml

apiVersion: v1
kind: Pod
metadata:
  name: blog-app
spec:
  selector:
    app: blog-mysql
  containers:
  - name: blog-app
    image: app:latest
    imagePullPolicy: Never
    ports:
      - containerPort: 8080
    args: ["-t", "-i"]
    link: blog-mysql

== pod-db. yaml

apiVersion: v1
kind: Pod
metadata:
  name: blog-system
spec:
  containers:
  - name: blog-app
    image: blog-app:latest
    imagePullPolicy: Never 
    ports:
      - containerPort: 8080
    args: ["-t", "-i"]
    link: blog-mysql
  - name: blog-mysql
    image: mysql:latest
    env:
      - name: MYSQL_ROOT_PASSWORD
        value: password
      - name: MYSQL_PASSWORD
        value: password
      - name: MYSQL_DATABASE
        value: test
    ports:
      - containerPort: 3306

Mais l'application frontale ne peut pas se connecter au pod mysql. Il lève les exceptions de connexion. J'ai peur que l'url mysql jdbc ait des valeurs incorrectes ou que la valeur yaml ait des valeurs inappropriées. J'espère des conseils.


0 commentaires

3 Réponses :


3
votes

Dans le cas de travail, puisque le même pod a deux conteneurs, ils peuvent parler en utilisant localhost mais dans le second cas, puisque vous avez deux pods, vous ne pouvez plus utiliser localhost. Dans ce cas, vous devez utiliser l'IP du pod du pod mysql dans l'application frontend. Mais le problème avec l'utilisation de POD IP est que cela peut changer. Mieux vaut exposer le pod mysql en tant que service et utiliser un nom de service au lieu d'IP dans l'application frontend. Consultez ce guide


0 commentaires

1
votes

Pour cela, vous devez écrire un service pour exposer le pod db. Il existe 4 types de services.

  1. ClusterIP

  2. NodePort

  3. LoadBalancer

  4. ExternalName

Maintenant, vous n'avez besoin que de l'intérieur du cluster, puis utilisez ClusterIP Pour référence, utilisez le fichier yaml suivant.

    env:
      - name: MYSQL_URL
        value: mysql-svc
      - name: MYSQL_PORT
        value: 3306

Vous allez maintenant accéder à ce pod en utilisant mysql-svc: 3306 Reportez-vous ceci dans blog-app yaml avec

kind: Service
apiVersion: v1
metadata:
 name: mysql-svc
spec:
  type: ClusterIP
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    app: blog-mysql

Pour plus d'informations, utilisez Url: https://kubernetes.io/docs/concepts/services-networking/service/


0 commentaires

0
votes

Les pods créés auront des DNS configurés de la manière suivante

pod_name.namespace.svc.cluster.local

Dans votre cas, en supposant que ces pods sont dans l'espace de noms par défaut, votre chaîne de connexion jdbc sera

jdbc:mysql://blog-mysql.default.svc.cluster.local:3306/test

Reportez-vous à: https://kubernetes.io/ docs / concepts / services-networking / dns-pod-service / # pods

Comme Arghya Sadhu et Sachin Arote l'ont suggéré, vous pouvez toujours créer un service et un déploiement. Le service et le déploiement vous aident dans les cas où vous avez plus d'un réplicas de pods et le service s'occupe de l'équilibrage de charge.


0 commentaires