介紹
本文主要介紹如何搭建一個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:
[[email protected] config]# kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 20m
檢視Pod的建立情況時,可以運作下面的指令:
[[email protected] config]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-xxp56 1/1 Running 0 20m
我們通過docker ps|grep mysql指令檢視正在運作的容器,發現提供MySQL服務的Pod容器已經建立并正常運作了,除此之外還多建立了一個來自谷歌的pause容器,這就是Pod的根容器:
[[email protected] ~]# 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
[[email protected] 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:
[[email protected] 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:
[[email protected] 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
[[email protected] 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>
[[email protected] helloworld.ex]# kubectl get svc myweb-lb9ck
Error from server (NotFound): services "myweb-lb9ck" not found
[[email protected] 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:
[[email protected] 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容器:
[[email protected] config]# kubectl exec -ti mysql-xxp56 -c mysql /bin/bash
[email protected]:/# date
Thu Jan 3 09:38:26 UTC 2019