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 种服务。
ClusterIP
NodePort
LoadBalancer
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 副本且服务负责负载平衡的情况下为您提供帮助。
我是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 种服务。
ClusterIP
NodePort
LoadBalancer
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
访问此播客
使用
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 副本且服务负责负载平衡的情况下为您提供帮助。