【问题标题】:Unable to connect tomcat container to mysql database container in kubernetes?无法将tomcat容器连接到kubernetes中的mysql数据库容器?
【发布时间】:2019-09-27 06:26:59
【问题描述】:

请不要将此标记为重复。我这次做了一些更改。相信我,我已经尝试了其他答案,但它们似乎没有解决我的问题。我无法将 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 文件是否正确,还是需要进行一些更改??

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

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

206.189.22.155:30000/data-core-0.0.1-SNAPSHOT

【问题讨论】:

  • 你好,查看tomcat容器的日志kubectl logs -f $TOMCAT_POD
  • 它说严重:部署 Web 应用程序存档时出错 /usr/local/tomcat/webapps/data-core-0.0.1-SNAPSHOT.war java.lang.IllegalStateException: ContainerBase.addChild: start: org .apache.catalina.LifecycleException: 无法启动组件 [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/data-core-0.0.1-SNAPSHOT]]
  • 这是由于通信链路故障
  • 是否尝试连接本地主机?
  • 你能发布完整的日志吗?你的容器镜像在本地运行吗?

标签: mysql docker tomcat kubernetes


【解决方案1】:

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

 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/

或使用curlwget 的单独 pod 来检查 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2021-11-23
    • 2020-03-12
    • 2022-11-30
    • 2016-04-17
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多