介紹
本文主要介紹如何搭建一個Mysqkl+Java Web留言板項目,JSP頁面通過JDBC直接訪問Mysql數據庫並展示數據。為了演示和簡化的目的,只要程序正確連接到了數據庫上,它就會自動完成對應Table的創建和初始化數據的準備工作。
此應用需要啟動兩個容器:Web APP容器和MySQL容器,並且WebApp容器需要訪問MySQL容器。
啟動MySQL服務器
首先為MySQL服務創建一個RC定義文件:,下面給出了改文件的完成內容和解釋:
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 23h
mysql ClusterIP 10.107.100.143 <none> 3306/TCP 29m
注意到Mysql服務被分配了一個值為10.107.100.143的Cluster-ip,這是一個虛擬地址,隨後,Kubernetes集群中其他新創建的Pod就可以通過Service的Cluster IP+端口號3306來連接和訪問它了。這些信息kubernetes巧妙地利用了Linux環境變量來進行存儲。
啟動Tomcat應用
上面我們定義和啟動了MySQL服務,接下來我們採用同樣的步驟,完成Tomcat應用的啟動過程。首先,創建對應的RC文件myweb-rc.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 23h
mysql ClusterIP 10.107.100.143 <none> 3306/TCP 43m
myweb NodePort 10.106.119.48 <none> 8080:30002/TCP 83m
通過瀏覽器訪問頁面
訪問地址是master節點的30002端口,如http://10.242.10.22: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
閱讀更多 IT維京 的文章