kubernetes示例中的Mysql Communications链接失败

时间:2018-03-10 01:10:45

标签: mysql docker kubernetes

步骤1:在CentOS7中完成安装etcd和kubernetes与YUM并关闭防火墙

步骤2:修改/ etc / sysconfig / docker

中的相关配置项
  

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

步骤3:修改/ etc / kubernetes / apiserver

中的相关配置项

删除

  

ServiceAccount

在KUBE_ADMISSION_CONTROL配置项

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

步骤5:启动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数据库服务

  

kubectl create -f mysql-svc.yaml

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

步骤7:启动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 get 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 get svc

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主机名吗?或者如何进一步找到问题?

enter image description here

3 个答案:

答案 0 :(得分:1)

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

enter image description here enter image description here enter image description here

答案 1 :(得分:0)

尝试使用无头服务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页面:

enter image description here

更新2

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

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

enter image description here

答案 2 :(得分:0)

作为一个初学者,我与您进行了相同的工作并遇到了相同的问题。 这是我的解决方案,也许您可​​以尝试一下:

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

    env:     -名称:MYSQL_SERVICE_HOST       值:“ mysql”     -名称:MYSQL_SERVICE_PORT       值:“ 3306”

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

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

  3. 首先创建服务,然后创建窗格。请参考以下顺序:

    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

祝你好运!