mysql - 无法将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
解决方案
您的 YAML 文件是正确的。我已经重新创建了问题中提到的整个环境,并且我的 Tomcat 运行良好,应用程序处于运行状态。
如果有人也想测试它,Tomcat 管理器的用户名/密码是:
username="the-manager" password="needs-a-new-password-here"
在 tomcat 日志中没有发现严重错误,我得到了应用程序的响应:
{"text":"Data-core"}
这看起来像是正确的反应。我还在 Mysql 数据库数据核心中获得了空表序列。
我猜你遇到了某种连接问题,可能是由于 Kubernetes 网络插件(Calico/Flannel/等)工作不正确造成的。
如何解决它:
- 要检查设置,可以通过为两个部署创建 PV 将所有 pod 放置在同一个节点上。
要测试与 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。
推荐阅读
- wordpress - LearnDash:如何验证 api 调用?
- reactjs - graphQL 使用订阅和赛普拉斯测试
- javascript - 使自定义表单控件字段成为必需
- android - 平面图无法投射到右侧
- java - Jackson XML - 无法反序列化布尔值
- javascript - 如何在 JavaScript 中解决这个特定的算法?
- java - 输入验证不显示验证错误 Java Spring
- wordpress - 菜单中的不同背景图像 - Wordpress
- c# - Linq 查询 - .Net MVC Core 3.1,实体框架中一张表的条件依赖列
- firebase - Firebase 自定义身份验证 - lastSignInTime = Null