请不要将此标记为重复。这次我做了一些更改。相信我,我尝试了其他答案,但它们似乎无法解决我的问题。我无法将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
答案 0 :(得分:0)
您的YAML文件正确。我已经重新创建了问题中提到的整个环境,并且我的Tomcat处于正常状态,并且该应用程序处于“运行”状态。
如果有人也想对其进行测试,则Tomcat管理器的用户名/密码为:
username="the-manager" password="needs-a-new-password-here"
在tomcat日志中未发现严重错误,我从应用程序中得到了响应:
{"text":"Data-core"}
看起来像是正确的答案。 我还在Mysql数据库的数据核中得到了空表序列。
我可以猜测您遇到某种连接问题,可能是由于Kubernetes网络插件(Calico / Flannel / etc。)工作不正确造成的。
如何对其进行故障排除:
要测试与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与curl
或wget
一起使用,以检查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。