繁体   English   中英

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

[英]Unable to connect tomcat container to mysql database container in kubernetes?

请不要将其标记为重复。这次我做了一些更改。相信我,我尝试了其他答案,它们似乎无法解决我的问题。我无法将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服务.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的manager应用中启动。

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

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

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

206.189.22.155:30000/data-core-0.0.1-SNAPSHOT

您的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/

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM