k8s集群的Java Web应用的容器化发布(tomcat+MySQL)
考虑到Kubernetes提供的PHP+Redis留言板的Hello World例子对于绝大多数刚接触Kubernetes的人来说比较复杂,难以顺利上手和实践,所以在此将其替换成一个简单得多的Java Web应用例子,可以让新手快速上手和实践。此Java Web应用的结构比较简单,是一个运行在Tomcat里的Web App,如图1.1所示,JSP页面通过JDBC直接访问MySQL数据库并展示数据.
Java Web应用的容器化发布
本小节中将模拟实际生产环境中的应用关系,通过使用Kubernetes发布容器化的应用。本次示例中通过前端应用Tomcat提供的页面向后端的数据库中添加并展示数据,具体的操作流程如图12.1所示。
分别启动两个容器Tomcat容器和MySQL容器,通过Tomcat提供的页面向后端的MySQL数据库写入数据。此示例在一台主机上启动两个容器,需要把MySQL容器的IP地址通过环境变量的方式注入到Tomcat容器中。同时,需要将Tomcat容器的8080端口映射到宿主机的8080端口,以便在外部访问。
1. 环境准备
使用二进制方式或者kubeadm方式部署的Kubernetes集群。
2. 启动MySQL服务
首先,创建RC定义文件mysql-dp.yaml,用来启动MySQL服务。该文件的完整内容和解释如下所示。
# vim mysql-rc.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
上方定义的YAML文件中的spec.template.metadata.labels指定了该Pod的标签,需要特别注意,这里的labels必须与之前的spec.selector匹配,否则此RC每当创建一个无法匹配Label的Pod,就会不停地尝试创建新的Pod,陷入恶性循环中。创建好mysql-rc.yaml文件后,执行如下命令将它发布到Kubernetes集群中。
# kubectl create -f mysql-dp.yaml
deployment.apps/mysql created
# kubectl get pods
最后,创建关联的Service定义文件mysql-svc.yaml,完整的内容和解释如下所示。
# vim mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
targetPort: 3306
selector:
app: mysql
运行Kubectl命令,创建Service,示例代码如下所示。
# kubectl create -f mysql-svc.yaml
service/mysql created
3. 启动Tomcat应用
上面已经成功定义和启动的MySQL服务,接下来使用同样的步骤和方式创建Tomcat服务。
首先创建Tomcat对应的RC文件tomcat-rc.yaml,示例代码和内容解释如下所示。
# vim tomcat-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: tomcat-rc
spec:
replicas: 1
selector:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: docker.io/kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: 'mysql'
- name: MYSQL_SERVICE_PORT
value: '3306'
使用kubectl命令创建Tomcat。
# kubectl create -f tomcat-rc.yaml
replicationcontroller/tomcat created
在Tomcat容器内,应用将使用环境变量MYSQL_SERVICE_HOST的值连接MySQL服务。
最后,创建Tomcat对应的Service。完整的YAML定义文件tomcat-svc.yaml如下所示。
# vim tomcat-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: tomcat
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 30000
selector:
app: tomcat
运行kubectl create命令进行创建,并查看创建的Service示例代码如下。
# kubectl create -f tomcat-svc.yaml
service/tomcat created
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql ClusterIP 10.107.33.3 <none> 3306/TCP 3m22s
tomcat NodePort 10.97.83.74 <none> 8080:30088/TCP 2m1s
# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-94f6bbcfd-9tmdq 1/1 Running 0 23m
tomcat-8qnj8 1/1 Running 0 22m
容器已经创建完成,下面将介绍如何进行验证。
4. 通过浏览器访问网页
在浏览器中输入http://虚拟机IP:30000/demo/。比如虚拟机IP为192.168.26.10,在浏览器里输入地址http://192.168.26.10:30000/demo/后
更多推荐
所有评论(0)