无法将tomcat容器连接到kubernetes中的mysql数据库容器?

时间:2019-05-09 12:05:28

标签: mysql docker tomcat kubernetes

请不要将此标记为重复。这次我做了一些更改。相信我,我尝试了其他答案,但它们似乎无法解决我的问题。我无法将tomcat容器与我的MySQL数据库链接Kubernetes中的容器。

使用此dockerfile构建我的tomcat图像

FROM picoded/tomcat7
COPY data-core-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps/data-core-0.0.1-SNAPSHOT.war

mysql-service.yaml

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

mysql-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        imagePullPolicy: "IfNotPresent"
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: root
        - name: MYSQL_DATABASE
          value: data-core  
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /docker-entrypoint-initdb.d   //my sql init script will 
                                                     get copied from hostpath 
                                                     of persistant volume. 
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-initdb-pv-claim

Tomcat-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: tomcat
  labels:
    app: tomcat
spec:
  type: NodePort     
  ports:
  - name: myport
    port: 8080
    targetPort: 8080
    nodePort: 30000
  selector:
    app: tomcat
    tier: frontend 

Tomcat-Deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat
  labels:
    app: tomcat
spec:
  selector:
    matchLabels:
      app: tomcat
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: tomcat
        tier: frontend
    spec:
      containers:
      - image: suji165475/vignesh:tomcatserver  //this is the tomcat image 
                                                  built using dockerfile with 
                                                  war file(spring boot app) 
                                                  copied to webapps folder
        name: tomcat
        env:
        - name: DB_PORT_3306_TCP_ADDR
          value: mysql                  #service name of mysql
        - name: DB_ENV_MYSQL_DATABASE
          value: data-core
        - name: DB_ENV_MYSQL_ROOT_PASSWORD
          value: root
        ports:
        - containerPort: 8080
          name: myport
        volumeMounts:
        - name: tomcat-persistent-storage
          mountPath: /var/data
      volumes:
      - name: tomcat-persistent-storage
        persistentVolumeClaim:
          claimName: tomcat-pv-claim

我已经在连接它们的Tomcat部署中指定了所有环境变量,包括MySQL服务名称,还确保为两个容器都创建了持久卷和声明,但是我的war文件仍然无法在tomcat的管理器应用程序中启动。

我的yaml文件是否正确,还是需要进行一些更改?

  

注意:我正在使用腻子终端的服务器上运行。

用于在浏览器中访问我的应用的URL-

  

206.189.22.155:30000/data-core-0.0.1-SNAPSHOT

1 个答案:

答案 0 :(得分:0)

您的YAML文件正确。我已经重新创建了问题中提到的整个环境,并且我的Tomcat处于正常状态,并且该应用程序处于“运行”状态。
如果有人也想对其进行测试,则Tomcat管理器的用户名/密码为:

 username="the-manager" password="needs-a-new-password-here"

在tomcat日志中未发现严重错误,我从应用程序中得到了响应:

{"text":"Data-core"}

看起来像是正确的答案。 我还在Mysql数据库的数据核中得到了空表序列。

我可以猜测您遇到某种连接问题,可能是由于Kubernetes网络插件(Calico / Flannel / etc。)工作不正确造成的。

如何对其进行故障排除:

  1. 要检查设置,可以通过在两个节点上创建PV来将所有Pod放置在同一节点上。
  2. 要测试与Mysql或Tomcat资源的连接性,我们可以执行它们的pod并使用简单的命令运行测试:

    $ kubectl exec mysql-pod-name -it -- mysql -hlocalhost -uroot -proot data-core --execute="show tables;"
    

    或仅运行其他pod来检查服务是否正确指向mysql pod:

    $ kubectl run mysql-client --rm -it --image mysql --restart=Never --command -- mysql -hmysql -uroot -proot data-core --execute="show tables;"
    

对于tomcat pod,我们可以使用以下命令来检查用户密码和应用程​​序响应:

   $ kubectl exec -ti tomcat-pod-name -- cat /usr/local/tomcat/conf/tomcat-users.xml

   $ kubectl exec -ti tomcat-pod-name -- curl http://localhost:8080/data-core-0.0.1-SNAPSHOT/

或将单独的Pod与curlwget一起使用,以检查Tomcat Service和NodePort是否工作良好:

   $ kubectl run curl -it --rm --image=appropriate/curl --restart=Never  -- curl http://tomcat:8080/data-core-0.0.1-SNAPSHOT/

   $ curl http://Cluster.Node.IP:30000/data-core-0.0.1-SNAPSHOT/

通过使用不同节点的IP,您还可以检查群集连接性,因为NodePort Service在所有群集节点上打开相同的端口,然后节点上的iptables规则将流量转发到Pod的IP。 如果pod位于其他节点上,则为Flannel / Calico / etc。网络插件会将其传递到正确的节点和Pod。