介绍
本文主要介绍如何搭建一个Mysqkl+Java Web留言板项目,JSP页面通过JDBC直接访问Mysql数据库并展示数据。为了演示和简化的目的,只要程序正确连接到了数据库上,它就会自动完成对应Table的创建和初始化数据的准备工作。
此应用需要启动两个容器:Web APP容器和MySQL容器,并且WebApp容器需要访问MySQL容器。
启动MySQL服务器
首先为MySQL服务创建一个RC定义文件:mysql-rc.yaml,下面给出了改文件的完成内容和解释:
apiVersion: v1
kind: ReplicationController # 副本控制器RC
metadata:
name: mysql # RC的名称,全局唯一
spec:
replicas: 1 # Pod副本数量
selector:
app: mysql # 符合目标的Pod拥有此标签
template:
metadata:
labels:
app: mysql # Pod副本用户的标签,对应RC的Selector
spec:
containers: # Pod内容器的定义部分
- name: mysql # 容器名称
image: mysql:5.6 # 容器对应的docker image
ports:
- containerPort: 3306 # 容器暴露的端口号
env:
- name: MYSQL_ROOT_PASSWORD # mysql容器默认密码设置
value: "123456"
执行该文件:
kubectl create -f mysql-rc.yaml
接下来,我们用kubectl命令查看刚刚创建的RC:
[root@bigman-m2 config]# kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 20m
查看Pod的创建情况时,可以运行下面的命令:
[root@bigman-m2 config]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-xxp56 1/1 Running 0 20m
我们通过docker ps|grep mysql指令查看正在运行的容器,发现提供MySQL服务的Pod容器已经创建并正常运行了,除此之外还多创建了一个来自谷歌的pause容器,这就是Pod的根容器:
[root@bigman-s3 ~]# docker ps|grep mysql
3a07bce96aab mysql "docker-entrypoint.s…" 23 minutes ago Up 23 minutes k8s_mysql_mysql-xxp56_default_a03ab81d-0f34-11e9-8c52-1866da8c1dba_0
06f009f3886a k8s.gcr.io/pause:3.1 "/pause" 24 minutes ago Up 24 minutes k8s_POD_mysql-xxp56_default_a03ab81d-0f34-11e9-8c52-1866da8c1dba_0
后面我们创建一个与之关联的Kubernetes Service-Mysql的定义文件mysql-svc.yaml:
apiVersion: v1
kind: Service # 表名是Kubernetes Service
metadata:
name: mysql # Service的全局唯一名称
spec:
ports:
- port: 3306 # Service提供服务的端口号
selector: # Pod副本实例名称
app: mysql
执行该文件:
kubectl create -f mysql-svc.yaml
运行kubectl命令,查看刚刚创建的service
[root@bigman-m2 config]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h
mysql ClusterIP 10.107.100.143 <none> 3306/TCP 9m
注意到Mysql服务被分配了一个值为10.107.100.143的Cluster-ip,这是一个虚拟地址,随后,Kubernetes集群中其他新创建的Pod就可以通过Service的Cluster IP+端口号3306来连接和访问它了。这些信息kubernetes巧妙地利用了Linux环境变量来进行存储。
启动Tomcat应用
上面我们定义和启动了MySQL服务,接下来我们采用同样的步骤,完成Tomcat应用的启动过程。
首先,创建对应的RC文件myweb.yaml,内容如下:
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 5 # 5个副本,负载均衡
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST # 定义环境变量,代码中才能获取到值
value: 'mysql'
- name: MYSQL_SERVICE_PORT # 定义环境变量,代码中才能获取到值
value: '3306'
有人肯定会疑惑,这里只配置了主机名和端口,并没有配置账号密码,tomcat能启动成功吗?原因是在于这个tomcat-app容器代码中默认写死了账号密码(root/123456)。
执行该文件:
kubectl create -f myweb-rc.yaml
查看创建好的Pod:
[root@bigman-m2 config]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-xxp56 1/1 Running 0 38m
myweb-ds8nv 1/1 Running 0 82m
myweb-jdtdw 1/1 Running 0 82m
myweb-rjbm9 1/1 Running 0 82m
myweb-tg6zc 1/1 Running 0 49m
myweb-v7fwf 1/1 Running 0 82m
最后创建对应的service,下面是文件内容和说明,myweb-svc.yaml:
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort # 表示此Service开启了NodePort方式的外网访问模式
ports:
- port: 8080 # Service提供服务的端口号
nodePort: 30002 # 外网访问端口
selector:
app: myweb # Pod副本实例名称
执行该文件:
kubectl create -f myweb-svc.yaml
查看刚才创建的Service:
[root@bigman-m2 config]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h
mysql ClusterIP 10.107.100.143 <none> 3306/TCP 3m
myweb NodePort 10.106.119.48 <none> 8080:30002/TCP 3m
通过浏览器访问页面
访问地址是master节点的30002端口, http://192.168.22.141:30002/demo/index.jsp
[root@cloud01 helloworld.ex]# kubectl get pod myweb-lb9ck -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb-lb9ck 1/1 Running 0 5m40s 10.244.2.3 cloud03 <none> <none>
[root@cloud01 helloworld.ex]# kubectl get svc myweb-lb9ck
Error from server (NotFound): services "myweb-lb9ck" not found
[root@cloud01 helloworld.ex]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11h
mysql ClusterIP 10.103.168.75 <none> 3306/TCP 8m39s
myweb NodePort 10.101.248.174 <none> 8080:30002/TCP 3m21s
访问地址是node节点的30002端口: 因为myweb-lb9ck 1/1 Running 0 5m40s 10.244.2.3 cloud03,所以还可以直接访问节点:如 http://192.168.22.143:30002/demo/index.jsp
dashboard界面查看
相关操作
命令行登录容器
显示Pods:
[root@bigman-m2 config]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-xxp56 1/1 Running 0 46m
myweb-ds8nv 1/1 Running 0 90m
myweb-jdtdw 1/1 Running 0 90m
myweb-rjbm9 1/1 Running 0 90m
myweb-tg6zc 1/1 Running 0 57m
myweb-v7fwf 1/1 Running 0 90m
比如,进入mysql容器:
[root@bigman-m2 config]# kubectl exec -ti mysql-xxp56 -c mysql /bin/bash
root@mysql-xxp56:/# date
Thu Jan 3 09:38:26 UTC 2019