mysql - 如何为 Spring 和 MySql 设置 Kubernetes

标签 mysql docker kubernetes

我按照这个教程https://medium.com/better-programming/kubernetes-a-detailed-example-of-deployment-of-a-stateful-application-de3de33c8632

我创建了 mysql pod 和后端 pod,但是当应用程序出现错误时 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
pod mysql:正在运行
Pod 后端:CrashLoopBackOff

Dockerfile

FROM openjdk:14-ea-8-jdk-alpine3.10
ADD target/credit-0.0.1-SNAPSHOT.jar .
EXPOSE 8200
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-Dspring.profiles.active=container","-jar","/credit-0.0.1-SNAPSHOT.jar"]

信用部署.yml

# Define 'Service' to expose backend application deployment
apiVersion: v1
kind: Service
metadata:
  name: to-do-app-backend  
spec:
  selector:  # backend application pod lables should match these
    app: to-do-app
    tier: backend
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 8080
  type: LoadBalancer   # use NodePort, if you are not running Kubernetes on cloud
---
# Configure 'Deployment' of backend application
apiVersion: apps/v1
kind: Deployment
metadata:
  name: to-do-app-backend
  labels: 
    app: to-do-app
    tier: backend
spec:
  replicas: 2    # Number of replicas of back-end application to be deployed
  selector:
    matchLabels: # backend application pod labels should match these
      app: to-do-app
      tier: backend
  template:
    metadata:
      labels: # Must macth 'Service' and 'Deployment' labels
        app: to-do-app
        tier: backend  
    spec:                 
      containers: 
      - name: to-do-app-backend 
        image: gitim21/credit_repo:1.0  # docker image of backend application
        env:   # Setting Enviornmental Variables
          - name: DB_HOST   # Setting Database host address from configMap
            valueFrom: 
              configMapKeyRef:
                name: db-conf  # name of configMap
                key: host
          - name: DB_NAME  # Setting Database name from configMap
            valueFrom:
              configMapKeyRef:
                name: db-conf 
                key: name
          - name: DB_USERNAME  # Setting Database username from Secret
            valueFrom:
              secretKeyRef:
                name: db-credentials # Secret Name
                key: username
          - name: DB_PASSWORD # Setting Database password from Secret
            valueFrom:
              secretKeyRef:
                name: db-credentials
                key: password     
        ports:
        - containerPort: 8080

应用程序.yml

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      idle-timeout: 10000
    platform: mysql
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
    url: jdbc:mysql://${DB_HOST}/${DB_NAME}
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

我将 application.yml 文件放置在应用程序文件夹“resources”中

编辑

Name:               mysql-64c7df597c-s4gbt
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               minikube/192.168.8.160
Start Time:         Thu, 12 Sep 2019 17:50:18 +0200
Labels:             app=mysql
                    pod-template-hash=64c7df597c
                    tier=database
Annotations:        <none>
Status:             Running
IP:                 172.17.0.5
Controlled By:      ReplicaSet/mysql-64c7df597c
Containers:
  mysql:
    Container ID:  docker://514d3f5af76f5e7ac11f6bf6e36b44ee4012819dc1cef581829a6b5b2ce7c09e
    Image:         mysql:5.7
    Image ID:      docker-pullable://mysql@sha256:1a121f2e7590f949b9ede7809395f209dd9910e331e8372e6682ba4bebcc020b
    Port:          3306/TCP
    Host Port:     0/TCP
    Args:
      --ignore-db-dir=lost+found
    State:          Running
      Started:      Thu, 12 Sep 2019 17:50:19 +0200
    Ready:          True
    Restart Count:  0
    Environment:
      MYSQL_ROOT_PASSWORD:  <set to the key 'password' in secret 'db-root-credentials'>  Optional: false
      MYSQL_USER:           <set to the key 'username' in secret 'db-credentials'>       Optional: false
      MYSQL_PASSWORD:       <set to the key 'password' in secret 'db-credentials'>       Optional: false
      MYSQL_DATABASE:       <set to the key 'name' of config map 'db-conf'>              Optional: false
    Mounts:
      /var/lib/mysql from mysql-persistent-storage (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-rgsmp (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  mysql-persistent-storage:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  mysql-pv-claim
    ReadOnly:   false
  default-token-rgsmp:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-rgsmp
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  49m   default-scheduler  Successfully assigned default/mysql-64c7df597c-s4gbt to minikube
  Normal  Pulled     49m   kubelet, minikube  Container image "mysql:5.7" already present on machine
  Normal  Created    49m   kubelet, minikube  Created container mysql
  Normal  Started    49m   kubelet, minikube  Started container mysql
Name:               to-do-app-backend-8669b5467-hrr9q
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               minikube/192.168.8.160
Start Time:         Thu, 12 Sep 2019 18:27:45 +0200
Labels:             app=to-do-app
                    pod-template-hash=8669b5467
                    tier=backend
Annotations:        <none>
Status:             Running
IP:                 172.17.0.7
Controlled By:      ReplicaSet/to-do-app-backend-8669b5467
Containers:
  to-do-app-backend:
    Container ID:   docker://1eb8453939710aed7a93cddbd5046f49be3382858aa17d5943195207eaeb3065
    Image:          gitim21/credit_repo:1.0
    Image ID:       docker-pullable://gitim21/credit_repo@sha256:1fb2991394fc59f37068164c72263749d64cb5c9fe741021f476a65589f40876
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Error
      Exit Code:    1
      Started:      Thu, 12 Sep 2019 18:51:25 +0200
      Finished:     Thu, 12 Sep 2019 18:51:36 +0200
    Ready:          False
    Restart Count:  9
    Environment:
      DB_HOST:      <set to the key 'host' of config map 'db-conf'>         Optional: false
      DB_NAME:      <set to the key 'name' of config map 'db-conf'>         Optional: false
      DB_USERNAME:  <set to the key 'username' in secret 'db-credentials'>  Optional: false
      DB_PASSWORD:  <set to the key 'password' in secret 'db-credentials'>  Optional: false
      DB_PORT:      <set to the key 'port' in secret 'db-credentials'>      Optional: false
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-rgsmp (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  default-token-rgsmp:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-rgsmp
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
  Normal   Scheduled  25m                  default-scheduler  Successfully assigned default/to-do-app-backend-8669b5467-hrr9q to minikube
  Normal   Pulled     23m (x5 over 25m)    kubelet, minikube  Container image "gitim21/credit_repo:1.0" already present on machine
  Normal   Created    23m (x5 over 25m)    kubelet, minikube  Created container to-do-app-backend
  Normal   Started    23m (x5 over 25m)    kubelet, minikube  Started container to-do-app-backend
  Warning  BackOff    50s (x104 over 25m)  kubelet, minikube  Back-off restarting failed container

最佳答案

首先,请确保您满足文章中描述的所有要求。 在创建部署期间,环境变量等对象(例如 pod、services )会从之前创建的 configMap 和 secret 中注入(inject)。此部署使用在第一步中创建的镜像 kubernetesdemo/to-do-app-backend。确保您之前已经创建了configmap和secret,否则删除部署期间创建的对象,创建configMap、secret,然后再次运行部署配置文件。

如果得到另一种可能性:

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

错误意味着数据库根本无法访问。这可能由以下一个或多个原因造成:

  1. JDBC URL 中的 IP 地址或主机名错误。
  2. 本地 DNS 服务器无法识别 JDBC URL 中的主机名。
  3. JDBC URL 中的端口号缺失或错误。 ~~4.数据库服务器宕机了~~
  4. 数据库服务器不接受 TCP/IP 连接。
  5. 数据库服务器已耗尽连接。
  6. Java 和 DB 之间的某些东西正在阻塞连接,例如防火墙或代理。

我假设如果您的 mysql pod 正在运行,您的数据库服务器正在运行并指向 ~~4。数据库服务器宕机了~~是错误的。

要解决其中一个问题,请遵循以下建议:

使用 ping 验证并测试它们。刷新 DNS 或在 JDBC URL 中使用 IP 地址。 检查是否基于MySQL DB的my.cnf。 再次启动数据库。检查 mysqld 是否在没有 --skip-networking 选项的情况下启动。 重新启动数据库并相应地修复您的代码,使其最终关闭连接。 禁用防火墙和/或配置防火墙/代理以允许/转发端口。

您可以在这里找到类似的错误:communication-error .

关于mysql - 如何为 Spring 和 MySql 设置 Kubernetes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57893736/

相关文章:

kubernetes - 如何使用模板生成器生成 kubernetes 部署 yaml 文件

amazon-web-services - AWS Nginx Ingress 创建 Classic Load Balancer 而不是 Application Load Balancer

Kubernetes - 部署初始化 - 如何确保它只发生一次?

javascript - 如何每1秒刷新一次mysql帖子

MySQL 从 n 中随机选择 m

php - MYSQL在where子句中进行多重查询

docker - 在Docker中运行的多进程应用程序(例如Postgres)会发生什么情况?

docker - 如何设置Docker镜像以从存储库动态提取应用程序代码?

mysql - 使用池连接在 Nodejs 中编写 mysql 查询

r - R 的 Dockerfile 配置 - 无法加载某些包