MySQL kubernetes 中 2 pods 之间的连接失败

MySQL connection failed between 2 pods in kubernetes

我是Kubernetes新手,尝试生成2个pods包括前端应用和后端mysql。首先,我制作了一个包含应用程序和 mysql 服务器的 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

前端应用的mysqljdbcurl为jdbc:mysql://localhost:3306/test。并且 pod 生成成功。应用程序和 mysql 已正确连接。这次我将应用程序 pod 和 mysql pod 分成 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 pod。它抛出连接异常。恐怕 mysql jdbc url 有一些不正确的值或 yaml 值有不合适的值。希望大家多多指教

在工作案例中,因为同一个 pod 有两个容器,它们可以使用 localhost 进行通信,但在第二种情况下,因为你有两个 pods,你不能再使用 localhost。在这种情况下,您需要在前端应用程序中使用 mysql pod 的 pod IP。但是使用 POD IP 的问题是它可能会改变。更好的做法是将 mysql pod 公开为 service and use service name instead of IP in the frontend application. Check this guide

为此,您需要编写用于公开数据库 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 访问此播客 使用

在 blog-app yaml 中引用此内容
    env:
      - name: MYSQL_URL
        value: mysql-svc
      - name: MYSQL_PORT
        value: 3306

有关更多信息,请使用 Url:https://kubernetes.io/docs/concepts/services-networking/service/

Pods 创建后将按以下方式配置 dns

pod_name.namespace.svc.cluster.local

在您的情况下,假设这些 pods 在默认命名空间中,您的 jdbc 连接字符串将是

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

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

就像 Arghya Sadhu 和 Sachin Arote 建议的那样,您始终可以创建服务和部署。服务和部署在您拥有多个 pods 副本且服务负责负载平衡的情况下为您提供帮助。