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