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.
3 Réponses :
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
Pour cela, vous devez écrire un service pour exposer le pod db. Il existe 4 types de services.
ClusterIP
NodePort
LoadBalancer
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/
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.