com.mysql.cj.jdbc.exceptions.CommunicationsException:kubernetes MySQL 和 Spring 引导上的通信 link 失败
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure on kubernetes MySQL and Spring Boot
我认为我的 .yaml 文件存在一些问题。
Docker-compose 工作正常,容器 运行 符合预期。
但是在对文件进行 kompose 转换后,在 k8s 上没有产生预期的结果,我得到 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure.
docker 个容器中没有现有的容器,docker-compose down 在 kompose convert 之前使用。
mysql pod 工作正常,可以访问。
spring 但是无法连接到它....
在docker-compose.yaml
version: '3'
services:
mysql-docker-container:
image: mysql:latest
environment:
- MYSQL_ROOT_PASSWORD=1
- MYSQL_DATABASE=db_fromSpring
- MYSQL_USER=springuser
- MYSQL_PASSWORD=ThePassword
networks:
- backend
ports:
- 3307:3306
volumes:
- /data/mysql
spring-boot-jpa-app:
command: mvn clean install -DskipTests
image: bnsbns/spring-boot-jpa-image
depends_on:
- mysql-docker-container
environment:
- spring.datasource.url=jdbc:mysql://mysql-docker-container:3306/db_fromSpring
- spring.datasource.username=springuser
- spring.datasource.password=ThePassword
networks:
- backend
ports:
- "8087:8080"
volumes:
- /data/spring-boot-app
networks:
backend:
错误:
2021-09-15 04:37:47.542 ERROR 1 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization.
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
后端-network.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: backend
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/backend: "true"
podSelector:
matchLabels:
io.kompose.network/backend: "true"
mysql-docker-container-claim0-persistentvolumeclaim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
labels:
io.kompose.service: mysql-docker-container-claim0
name: mysql-docker-container-claim0
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
status: {}
mysql-docker-容器-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.service: mysql-docker-container
name: mysql-docker-container
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: mysql-docker-container
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.network/backend: "true"
io.kompose.service: mysql-docker-container
spec:
containers:
- env:
- name: MYSQL_DATABASE
value: db_fromSpring
- name: MYSQL_PASSWORD
value: ThePassword
- name: MYSQL_ROOT_PASSWORD
value: "1"
- name: MYSQL_USER
value: springuser
image: mysql:latest
imagePullPolicy: ""
name: mysql-docker-container
ports:
- containerPort: 3306
resources: {}
volumeMounts:
- mountPath: /data/mysql
name: mysql-docker-container-claim0
restartPolicy: Always
serviceAccountName: ""
volumes:
- name: mysql-docker-container-claim0
persistentVolumeClaim:
claimName: mysql-docker-container-claim0
status: {}
mysql-docker-容器-service.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.service: mysql-docker-container
name: mysql-docker-container
spec:
ports:
- name: "3307"
port: 3307
targetPort: 3306
selector:
io.kompose.service: mysql-docker-container
status:
loadBalancer: {}
springboot-app-jpa-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.service: spring-boot-jpa-app
name: spring-boot-jpa-app
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: spring-boot-jpa-app
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.network/backend: "true"
io.kompose.service: spring-boot-jpa-app
spec:
containers:
- args:
- mvn
- clean
- install
- -DskipTests
env:
- name: spring.datasource.password
value: ThePassword
- name: spring.datasource.url
value: jdbc:mysql://mysql-docker-container:3306/db_fromSpring
- name: spring.datasource.username
value: springuser
image: bnsbns/spring-boot-jpa-image
imagePullPolicy: ""
name: spring-boot-jpa-app
ports:
- containerPort: 8080
resources: {}
volumeMounts:
- mountPath: /data/spring-boot-app
name: spring-boot-jpa-app-claim0
restartPolicy: Always
serviceAccountName: ""
volumes:
- name: spring-boot-jpa-app-claim0
persistentVolumeClaim:
claimName: spring-boot-jpa-app-claim0
status: {}
springboot-jpa-app-persistence-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
labels:
io.kompose.service: spring-boot-jpa-app-claim0
name: spring-boot-jpa-app-claim0
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
status: {}
springboot-app-service.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.service: spring-boot-jpa-app
name: spring-boot-jpa-app
spec:
ports:
- name: "8087"
port: 8087
targetPort: 8080
selector:
io.kompose.service: spring-boot-jpa-app
status:
loadBalancer: {}
gohm'c 发布的解决方案是我的端口不正确。
接下来遇到这个问题,需要具体说明吗cluster/load?
$ kubectl 公开部署 spring-boot-jpa-app --type=NodePort
服务器错误(AlreadyExists):服务“spring-boot-jpa-app”已经存在
minikube service spring-boot-jpa-app
|-----------|---------------------|-------------|--------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|---------------------|-------------|--------------|
| default | spring-boot-jpa-app | | No node port |
|-----------|---------------------|-------------|--------------|
service default/spring-boot-jpa-app has no node port
mysql-docker-container
服务端口是3307,可以试试:
env:
...
- name: spring.datasource.url
value: jdbc:mysql://mysql-docker-container:3307/db_fromSpring
我认为我的 .yaml 文件存在一些问题。 Docker-compose 工作正常,容器 运行 符合预期。 但是在对文件进行 kompose 转换后,在 k8s 上没有产生预期的结果,我得到 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure.
docker 个容器中没有现有的容器,docker-compose down 在 kompose convert 之前使用。
mysql pod 工作正常,可以访问。 spring 但是无法连接到它....
在docker-compose.yaml
version: '3'
services:
mysql-docker-container:
image: mysql:latest
environment:
- MYSQL_ROOT_PASSWORD=1
- MYSQL_DATABASE=db_fromSpring
- MYSQL_USER=springuser
- MYSQL_PASSWORD=ThePassword
networks:
- backend
ports:
- 3307:3306
volumes:
- /data/mysql
spring-boot-jpa-app:
command: mvn clean install -DskipTests
image: bnsbns/spring-boot-jpa-image
depends_on:
- mysql-docker-container
environment:
- spring.datasource.url=jdbc:mysql://mysql-docker-container:3306/db_fromSpring
- spring.datasource.username=springuser
- spring.datasource.password=ThePassword
networks:
- backend
ports:
- "8087:8080"
volumes:
- /data/spring-boot-app
networks:
backend:
错误:
2021-09-15 04:37:47.542 ERROR 1 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization.
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
后端-network.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: backend
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/backend: "true"
podSelector:
matchLabels:
io.kompose.network/backend: "true"
mysql-docker-container-claim0-persistentvolumeclaim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
labels:
io.kompose.service: mysql-docker-container-claim0
name: mysql-docker-container-claim0
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
status: {}
mysql-docker-容器-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.service: mysql-docker-container
name: mysql-docker-container
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: mysql-docker-container
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.network/backend: "true"
io.kompose.service: mysql-docker-container
spec:
containers:
- env:
- name: MYSQL_DATABASE
value: db_fromSpring
- name: MYSQL_PASSWORD
value: ThePassword
- name: MYSQL_ROOT_PASSWORD
value: "1"
- name: MYSQL_USER
value: springuser
image: mysql:latest
imagePullPolicy: ""
name: mysql-docker-container
ports:
- containerPort: 3306
resources: {}
volumeMounts:
- mountPath: /data/mysql
name: mysql-docker-container-claim0
restartPolicy: Always
serviceAccountName: ""
volumes:
- name: mysql-docker-container-claim0
persistentVolumeClaim:
claimName: mysql-docker-container-claim0
status: {}
mysql-docker-容器-service.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.service: mysql-docker-container
name: mysql-docker-container
spec:
ports:
- name: "3307"
port: 3307
targetPort: 3306
selector:
io.kompose.service: mysql-docker-container
status:
loadBalancer: {}
springboot-app-jpa-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.service: spring-boot-jpa-app
name: spring-boot-jpa-app
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: spring-boot-jpa-app
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.network/backend: "true"
io.kompose.service: spring-boot-jpa-app
spec:
containers:
- args:
- mvn
- clean
- install
- -DskipTests
env:
- name: spring.datasource.password
value: ThePassword
- name: spring.datasource.url
value: jdbc:mysql://mysql-docker-container:3306/db_fromSpring
- name: spring.datasource.username
value: springuser
image: bnsbns/spring-boot-jpa-image
imagePullPolicy: ""
name: spring-boot-jpa-app
ports:
- containerPort: 8080
resources: {}
volumeMounts:
- mountPath: /data/spring-boot-app
name: spring-boot-jpa-app-claim0
restartPolicy: Always
serviceAccountName: ""
volumes:
- name: spring-boot-jpa-app-claim0
persistentVolumeClaim:
claimName: spring-boot-jpa-app-claim0
status: {}
springboot-jpa-app-persistence-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
labels:
io.kompose.service: spring-boot-jpa-app-claim0
name: spring-boot-jpa-app-claim0
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
status: {}
springboot-app-service.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.service: spring-boot-jpa-app
name: spring-boot-jpa-app
spec:
ports:
- name: "8087"
port: 8087
targetPort: 8080
selector:
io.kompose.service: spring-boot-jpa-app
status:
loadBalancer: {}
gohm'c 发布的解决方案是我的端口不正确。
接下来遇到这个问题,需要具体说明吗cluster/load?
$ kubectl 公开部署 spring-boot-jpa-app --type=NodePort 服务器错误(AlreadyExists):服务“spring-boot-jpa-app”已经存在
minikube service spring-boot-jpa-app
|-----------|---------------------|-------------|--------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|---------------------|-------------|--------------|
| default | spring-boot-jpa-app | | No node port |
|-----------|---------------------|-------------|--------------|
service default/spring-boot-jpa-app has no node port
mysql-docker-container
服务端口是3307,可以试试:
env:
...
- name: spring.datasource.url
value: jdbc:mysql://mysql-docker-container:3307/db_fromSpring