2
votes

Step1:finish installing etcd and kubernetes with YUM in CentOS7 and shutdown firewall

Step2:modify related configuration item in /etc/sysconfig/docker

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

Step3:modify related configuration item in /etc/kubernetes/apiserver

remove

ServiceAccount

in KUBE_ADMISSION_CONTROL configuration item

Step4:start all the related services of etcd and kubernetes

Step5:start ReplicationController for mysql db

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:start related mysql db service

kubectl create -f mysql-svc.yaml

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

Step7:start ReplicationController for myweb

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:start related tomcat service

kubectl create -f myweb-svc.yaml

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

When I visit from browser with nodeport(30001),I get the following Exception:

Error:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.


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

From the interior of any tomcat container I can see the mysql env and the related mysql link code in JSP is as below:

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: unknown host

Can someone tell me why I could not ping mysqldb hostname from inner tomcat server?Or how to locate the problem further?

enter image description here

3
Is your mysql container running properly? Take a look at stackoverflow.com/a/10772407/2718151Nicola Ben
I have checked db status.It runs well. [root@promote ~]# docker exec -it 6985951cfd7f /bin/bash root@mysql-8zzxp:/# mysql -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g.Jianxiang Xia
Endpoint ip can be reached well.But service ip can not be reached. It can not be so strange.Jianxiang Xia

3 Answers

1
votes

I know the reason, it's the DNS problems. The web server cannot find the IP address of the mysql server. so it failed. Temp solution is change the web server's IP to the mysql db server. Hope can help you. Thank you.

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

0
votes

Try to use a Headless Service http://kubernetes.io/v1.0/docs/user-guide/services.html#headless-services

by setting in your mysql Service

clusterIP: None

UPDATE

I have tried your yaml file.

Pods are running:

➜  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

Services are:

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

Endpoints are:

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

I exec bash on a tomcat pod and I can ping my service (it is resolved):

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 ---

I can ping the endpoint:

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 ---

Connecting to

http://192.168.99.100:30001/

I can see the tomcat page:

enter image description here

UPDATE 2

Here my screenshot... I see data in your database with no error.

I suggest to check your db configuration.

enter image description here

0
votes

As a beginner, I did the same work with you and got the same problems. This is my solution,maybe you can have a try:

  1. Delete these configurations in myweb-rc.yaml, because it will override the system default values:

    env: - name: MYSQL_SERVICE_HOST value: "mysql" - name: MYSQL_SERVICE_PORT value: "3306"

  2. Change the mysql image tag in mysql-rc.yaml. use the low version mysql:

    image: hub.c.163.com/library/mysql:5.5

  3. Create the service first, then create the pod. refer to the following sequence:

    kubectl create -f myweb-svc.yaml

    kubectl create -f mysql-svc.yaml

    kubectl create -f mysql-rc.yaml

    kubectl create -f myweb-rc.yaml

You can refer to this doc:Discovering services

Good luck!