MySQL сбой соединения между 2 модулями в kubernetes - PullRequest
1 голос
/ 04 марта 2020

Я новичок ie в Kubernetes и пытаюсь сгенерировать 2 модуля, включая интерфейсное приложение и серверную часть mysql. Сначала я создаю файл yaml, который содержит как приложение, так и сервер mysql, как показано ниже,

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

URL-адрес mysql jdb c внешнего приложения равен jdbc:mysql://localhost:3306/test. И поколение стручков успешно. Приложение и mysql подключены без ошибок. И на этот раз я разделяю модуль приложения и mysql модуль на 2 файла 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-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

Но приложение не может подключиться к модулю mysql. Выдает исключения подключения. Я боюсь, что у mysql jdb c url есть некоторые неправильные значения, или значение yaml имеет недопустимые значения. Надеюсь на любые советы.

Ответы [ 3 ]

3 голосов
/ 04 марта 2020

В рабочем случае, поскольку один и тот же модуль имеет два контейнера, они могут общаться с помощью localhost, но во втором случае, поскольку у вас есть два модуля, вы больше не можете использовать localhost. В этом случае вам нужно использовать IP-адрес модуля mysql в приложении веб-интерфейса. Но проблема с использованием POD IP заключается в том, что он может измениться. Лучше представить mysql pod как service и использовать имя службы вместо IP в приложении внешнего интерфейса. Проверьте это руководство

1 голос
/ 04 марта 2020

Для этого вам нужно написать сервис для выставления db pod. Существует 4 вида услуг.

  1. ClusterIP

  2. NodePort

  3. LoadBalancer

  4. ExternalName

Теперь вам нужно только внутри кластера, затем используйте ClusterIP Для справки используйте следующий файл yaml.

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

Теперь у вас будет доступ к этому модулю с помощью mysql-svc:3306 Ссылайтесь в блог-приложение yaml с

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

Для получения дополнительной информации используйте URL: https://kubernetes.io/docs/concepts/services-networking/service/

0 голосов
/ 04 марта 2020

Для созданных модулей будут настроены днс следующим образом:

pod_name.namespace.svc.cluster.local

В вашем случае, если предположить, что эти модули находятся в пространстве имен по умолчанию, ваша строка соединения jdb c будет

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

См .: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pods

Как и Аргья Садху и Сачин Ароте, вы всегда можете создать службу и развертывание. Обслуживание и развертывание помогают вам в тех случаях, когда у вас есть несколько реплик модулей, а служба заботится о балансировке нагрузки.

...