首页 > 解决方案 > 无法将tomcat容器连接到kubernetes中的mysql数据库容器?

问题描述

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

使用这个 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 文件是否正确,还是需要进行一些更改?

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

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

206.189.22.155:30000/data-core-0.0.1-SNAPSHOT

标签: mysqldockertomcatkubernetes

解决方案


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

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

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

{"text":"Data-core"}

这看起来像是正确的反应。我还在 Mysql 数据库数据核心中获得了空表序列。

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

如何解决它:

  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/

curl或者使用单独的 podwget来检查 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 服务在所有集群节点上打开相同的端口,然后节点上的 iptables 规则将流量转发到 Pod 的 IP。
如果 pod 位于不同的节点上,Flannel/Calico/etc。网络插件将其传递到正确的节点和 Pod。


推荐阅读