how to check if kubernetes services like mysql, rabbitmq are reachable by the deployed app

8/28/2018

I am new to Kubernetes. I am trying to deploy a microservices architecture based springboot web application in Kubernetes. I have setup Kubernetes on OpenStack. All Kubernetes services are running fine.

I followed https://github.com/fabric8io/gitcontroller/tree/master/vendor/k8s.io/kubernetes/examples/javaweb-tomcat-sidecar

to deploy a sample springboot application at

https://www.mkyong.com/spring-boot/spring-boot-hello-world-example-jsp/

and I could see the web app at localhost:8080 and <'node-ip'>:8080.

But the application which I am trying to deploy needs MySQL and rabbitmq, so I created MySQL and rabbitmq services using the yaml file(javaweb.yaml):

javaweb.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  type: NodePort
  ports:
  - protocol: TCP
    port: 3306
    targetPort: 3306
  selector:
    app: mysql
---
apiVersion: v1
kind: Service
metadata:
  # Expose the management HTTP port on each node
  name: rabbitmq-management
  labels:
    app: rabbitmq
spec:
  type: NodePort # Or LoadBalancer in production w/ proper security
  ports:
  - port: 15672
    name: http
  selector:
    app: rabbitmq
---
apiVersion: v1
kind: Service
metadata:
  # The required headless service for StatefulSets
  name: rabbitmq
  labels:
    app: rabbitmq
spec:
  ports:
  - port: 5672
    name: amqp
  - port: 4369
    name: epmd
  - port: 25672
    name: rabbitmq-dist
  clusterIP: None
  selector:
    app: rabbitmq
---
apiVersion: v1
kind: Pod
metadata:
  name: javaweb
spec:
  containers:
  - image: chakravarthych/sample:v1
    name: war
    volumeMounts:
    - mountPath: /app
      name: app-volume
  - image: mysql:5.7
    name: mysql
    ports:
    - protocol: TCP
      containerPort: 3306
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: root123
    command: ["sh","-c","service mysql start; tail -f /dev/null"]
  - image: rabbitmq:3.7-management
    name: rabbitmq
    ports:
    - name: http
      protocol: TCP
      containerPort: 15672
    - name: amqp
      protocol: TCP
      containerPort: 5672
    command: ["sh","-c","service rabbitmq-server start; tail -f /dev/null"]
  - image: tomcat:8.5.33
    name: tomcat
    volumeMounts:
    - mountPath: /usr/local/tomcat/webapps
      name: app-volume
    ports:
    - containerPort: 8080
      hostPort: 8080
    command: ["sh","-c","/usr/local/tomcat/bin/startup.sh; tail -f /dev/null"]
  volumes:
  - name: app-volume
    emptyDir: {}

When I try to access my application at localhost:8080 or <'node-ip'>:8080 I see a blank page.

command kubectl get all -o wide gave me below output:

NAME          READY     STATUS    RESTARTS   AGE       IP              NODE         NOMINATED NODE
pod/javaweb   4/4       Running   0          1h        192.168.9.123   kube-node1   <none>

NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                       AGE       SELECTOR
service/kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP                       3d        <none>
service/mysql                 NodePort    10.101.253.11   <none>        3306:30527/TCP                1h        app=mysql
service/rabbitmq              ClusterIP   None            <none>        5672/TCP,4369/TCP,25672/TCP   1h        app=rabbitmq
service/rabbitmq-management   NodePort    10.108.7.162    <none>        15672:30525/TCP               1h        app=rabbitmq

which shows that MySQL and rabbitmq are running.

My question is how to check if my application has access to MySQL and rabbitmq services running in Kubernetes.

Note:

I could access rabbitmq at 192.168.9.123:15672 only.

I could also log in to MySQL inside of Docker container.

-- Chakri
kubernetes
mysql
rabbitmq

1 Answer

8/28/2018

Did you try a "kubectl log" on the springboot pod? You may have some indication of what is going wrong.

-- night-gold
Source: StackOverflow