【问题标题】:Mysql Communications link failure in kubernetes sampleKubernetes 示例中的 Mysql Communications 链接失败
【发布时间】:2018-08-18 15:35:37
【问题描述】:

Step1:在 CentOS7 中用 YUM 完成安装 etcd 和 kubernetes 并关闭防火墙

Step2:修改/etc/sysconfig/docker中的相关配置项

OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'

Step3:修改/etc/kubernetes/apiserver中相关配置项

删除

服务帐户

在 KUBE_ADMISSION_CONTROL 配置项中

Step4:启动etcd和kubernetes的所有相关服务

Step5:为 mysql db 启动 ReplicationController

kubectl create -f mysql-rc.yaml

apiVersion: v1
kind: ReplicationController  
metadata:
  name: mysql
spec:
  replicas: 1 
  selector:
    app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: hub.c.163.com/library/mysql
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"

Step6:启动相关的mysql db服务

kubectl create -f mysql-svc.yaml

kind: Service   
metadata: 
  name: mysql 
spec:
  ports:
    - port: 3306
  selector:     
    app: mysql

Step7:为 myweb 启动 ReplicationController

kubectl create -f myweb-rc.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 3  
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: docker.io/kubeguide/tomcat-app:v1
        ports: 
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: "mysql"
        - name: MYSQL_SERVICE_PORT
          value: "3306"

Step8:启动相关的tomcat服务

kubectl create -f myweb-svc.yaml

apiVersion: v1
kind: Service
metadata: 
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30001
  selector:
    app: myweb

当我使用 nodeport(30001) 从浏览器访问时,我得到以下异常:

错误:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信链路故障 最后一个数据包成功发送到 服务器是 0 毫秒前。驱动程序没有收到任何数据包 来自服务器。


kubectl 获取 ep

NAME         ENDPOINTS                                         AGE

kubernetes   192.168.57.129:6443                               1d

mysql        172.17.0.2:3306                                   1d

myweb        172.17.0.3:8080,172.17.0.4:8080,172.17.0.5:8080   1d

kubectl 获取服务

NAME         CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE

kubernetes   10.254.0.1     <none>        443/TCP          1d

mysql        10.254.0.5     <none>        3306/TCP         1d

myweb        10.254.220.2   <nodes>       8080:30001/TCP   1d

从任何tomcat容器的内部我可以看到mysql env和JSP中相关的mysql链接代码如下:

Class.forName("com.mysql.jdbc.Driver");
String ip=System.getenv("MYSQL_SERVICE_HOST");
String port=System.getenv("MYSQL_SERVICE_PORT");
ip=(ip==null)?"localhost":ip;
port=(port==null)?"3306":port;  
System.out.println("Connecting to database...");

conn = java.sql.DriverManager.getConnection("jdbc:mysql://"+ip+":"+port+"?useUnicode=true&characterEncoding=UTF-8", "root","123456");

[root@promote ~]# docker exec -it 1470cfaa1b1c /bin/bash

root@myweb-xswfb:/usr/local/tomcat# env |grep MYSQL_SERVICE

MYSQL_SERVICE_PORT=3306

MYSQL_SERVICE_HOST=mysql

root@myweb-xswfb:/usr/local/tomcat# ping mysql

ping:未知主机

谁能告诉我为什么我无法从内部 tomcat 服务器 ping mysqldb 主机名?或者如何进一步定位问题?

【问题讨论】:

  • 你的mysql容器运行正常吗?看看stackoverflow.com/a/10772407/2718151
  • 我已经检查了数据库状态。它运行良好。 [root@promote ~]# docker exec -it 6985951cfd7f /bin/bash root@mysql-8zzxp:/# mysql -p 输入密码:欢迎使用 MySQL 监视器。命令以 ; 结尾或 \g.
  • Endpoint ip 可以很好到达。但是服务 ip 无法到达。不可能这么奇怪。

标签: mysql docker kubernetes


【解决方案1】:

我知道原因,是 DNS 问题。 Web 服务器找不到 mysql 服务器的 IP 地址。所以它失败了。临时解决方案是将 Web 服务器的 IP 更改为 mysql db 服务器。希望能帮到你。谢谢你。

【讨论】:

  • 您的临时解决方案运行良好。但是为什么 dnsdefault 策略不起作用?您能帮忙深入解释一下吗?
【解决方案2】:

尝试使用无头服务http://kubernetes.io/v1.0/docs/user-guide/services.html#headless-services

通过在你的 mysql 服务中设置

clusterIP: None

更新

我已经试过你的 yaml 文件了。

Pod 正在运行:

➜  kb get po                      
NAME          READY     STATUS    RESTARTS   AGE
mysql-ndtxn   1/1       Running   0          7m
myweb-j8xgh   1/1       Running   0          8m
myweb-qc7ws   1/1       Running   0          8m
myweb-zhzll   1/1       Running   0          8m

服务是:

kb get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          1h
mysql        ClusterIP   10.102.178.190   <none>        3306/TCP         20m
myweb        NodePort    10.98.74.113     <none>        8080:30001/TCP   19m

端点是:

kb get ep 
NAME         ENDPOINTS                                         AGE
kubernetes   10.0.2.15:8443                                    1h
mysql        172.17.0.7:3306                                   20m
myweb        172.17.0.2:8080,172.17.0.4:8080,172.17.0.6:8080   19m

我在 tomcat pod 上执行 bash,我可以 ping 我的服务(已解决):

kb exec -ti myweb-zhzll -- bash
root@myweb-zhzll:/usr/local/tomcat# ping mysql
PING mysql.default.svc.cluster.local (10.102.178.190): 56 data bytes
^C--- mysql.default.svc.cluster.local ping statistics ---

我可以ping通端点:

ping 172.17.0.7
PING 172.17.0.7 (172.17.0.7): 56 data bytes
64 bytes from 172.17.0.7: icmp_seq=0 ttl=64 time=0.181 ms
64 bytes from 172.17.0.7: icmp_seq=1 ttl=64 time=0.105 ms
64 bytes from 172.17.0.7: icmp_seq=2 ttl=64 time=0.119 ms
^C--- 172.17.0.7 ping statistics ---

连接到

http://192.168.99.100:30001/

可以看到tomcat页面:

更新 2

这是我的屏幕截图...我看到您的数据库中的数据没有错误。

我建议检查您的数据库配置。

【讨论】:

  • 我已听从您的建议,并根据您的配置更改了 mysql-svc.yaml。问题仍然存在。 myweb env 中 MYSQL_SERVICE_HOST 的值仍然是 mysql 。并且从内部的任何 tomcat 服务器我无法 nslookup 或 ping MYSQL_SERVICE_HOST。
  • 请尝试 192.168.99.100:30001/demo ,我也可以得到tomcat web console 192.168.99.100:30001/ .Tomcat Managerment app do not use mysql driver.
  • 因为我们在演示应用程序中使用 MYSQL_SERVICE_HOST 组装 mysql 链接字符串。您可以 ping 主机名。我知道可以访问 ip。感谢您的帮助。
  • 我用我看到的数据粘贴了截图(正确且没有错误)
  • 感谢您耐心的解决方案。请告诉我您是否安装了 dns(skydns、kubedns 等)。或者您可以在容器中 cat /etc/resolv.conf 发送给我因为如果我们强制使用默认的 dns 策略,我们将继承节点中的 dns。在这种情况下,毫无疑问我无法在 myweb 容器中获取 mysql。
【解决方案3】:

作为初学者,我和你做了同样的工作,遇到了同样的问题。 这是我的解决方案,也许你可以试试:

  1. 删除myweb-rc.yaml中的这些配置,因为它会覆盖系统默认值:

    环境: - 名称:MYSQL_SERVICE_HOST 值:“mysql” - 名称:MYSQL_SERVICE_PORT 值:“3306”

  2. 更改mysql-rc.yaml中的mysql镜像标签。使用低版本的mysql:

    图片:hub.c.163.com/library/mysql:5.5

  3. 先创建服务,再创建 pod。参考以下顺序:

    kubectl create -f myweb-svc.yaml

    kubectl create -f mysql-svc.yaml

    kubectl create -f mysql-rc.yaml

    kubectl create -f myweb-rc.yaml

你可以参考这个文档:Discovering services

祝你好运!

【讨论】:

    猜你喜欢
    • 2021-02-20
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多