在kubernetes中部署tomcat與mysql叢集之前必須要有以下這些基礎:
1. 已安裝、配置kubernetes
2. 叢集中有tomcat與mysql容器鏡像
3. 有docker基礎
具體步驟
部署tomcat
建立tomcat rc對象
我們想要在kubernetes叢集中配置tomcat伺服器,首先要保證叢集中的節點上有tomcat鏡像,鏡像可以從docker hub中拉取,也可以放在自己的私有倉庫中。這在我之前的部落格中講過,這裡就不詳述了。
要部署tomcat服務,我們需要做兩件事,一是建立rc(replication controller),二是建立service。rc是kubernetes中的副本控制器,也就是說,rc負責自動部署容器化應用。service是我們通路tomcat服務的入口位址,我們是通過service來對該服務就行通路的。
建立rc與service對象,我這裡用的是建立yaml檔案的方式。yaml檔案中的内容是聲明式的。這些聲明讓kubernetes做你想要它做的事情。聲明與指令有所不同,聲明是告訴它你的需要是什麼,而不涉及具體的實作的步驟,而指令,如linux中的ls,你是告訴它去做什麼。聲明與指令是不同的,請自己體會。話不多說了,上代碼:
此檔案名為myweb-rc1.yaml
這裡我簡單的說明一下此yaml檔案聲明了什麼:
1 apiversion: v1 //描述rc對象的版本是v1
2 kind: replicationcontroller //我現在在聲明rc對象
3 metadata: //metadata中的是對此rc對象描述資訊
4 name: myweb //此rc對象在default命名空間中名為myweb,同一個命名空間中的命名一定是不同的
5 spec: //spec中是對rc對象的具體描述
6 replicas: 5 //我要建立5個副本,機關當然是pod
7 selector: //選擇器,用來選擇對象的
8 app: myweb //我選擇了标簽為app: myweb的pod
9 template: //模版,以下用來描述建立的pod的模版
10 metadata: //對pod模版描述的中繼資料
11 labels: //給以下的東西打上标簽,以讓selector來選擇
12 app: myweb //給pod模版打上app: myweb這樣的标簽
13 spec: //對pod模版的具體描述
14 containers: //以下就是要放入pod模版中的容器了
15 - image: kubeguide/tomcat-app:v1 //選擇鏡像
16 name: myweb //容器名
17 resources: //給該容器配置設定的資源大小
18 limits:
19 cpu: "2"
20 memory: 4gi
21 ports: //容器端口号
22 - containerport: 8080
23 env: //給該容器設定環境變量,這裡就可以将mysql與我們的tomcat連接配接
24 - name: mysql_service_host
25 value: 'mysql'
26 - name: mysql_service_port
27 value: '3306'
仔細研究就發現其實yaml檔案的規範還是比較嚴謹的。它是通過縮進與對齊的方式來表達了具體的資訊的。比如一個metadata,在我這個yaml檔案中就有兩個。實際上通過縮進與對齊,我們就可以了解到,第一個metadata是對這個rc對象進行描述的中繼資料,而第二個metadata因為縮進了,實際上它是對pod模版進行描述的中繼資料。當然是不一樣的。spec也有兩個,同樣的道理,大家可以自行分析。
建立tomcat rc對象的結果
如下,我截了個屏:
可以看到,我在建立完了tomcat的rc對象之後,它就立馬自動部署了5個pod,這5個pod已經健康的跑起來了。為什麼是建立5個pod?因為我在yaml檔案中聲明了我需要5個副本。
建立tomcat service對象
單單建立了rc對象還不行,雖然rc對象為我們自動部署了5個pod,但是我們還需要一個service對象來作為入口位址來對建立好的tomcat進行通路,是以,接下來我們的任務就是建立service對象。
此檔案名為myweb-svc1.yaml。還是直接上代碼:
1 apiversion: v1
2 kind: service //對象是service了哦
3 metadata:
4 name: myweb
5 spec:
6 ports:
7 - name: myweb-svc //端口名稱,service是必須指定端口名稱的
8 port: 8080 //service的端口号
9 targetport: 8080 //容器暴露的端口号
10 nodeport: 31111 //node的真實端口号
11 selector:
12 app: myweb //service選擇了标簽為app: myweb的pod
13 type: nodeport
重點在于三個端口的差別,容器有端口,service有端口,node也有真實的端口号,這裡我們将這三者關聯起來,在一會通路的時候會看出門道。是以,我們就拿結果說話吧。
建立tomcat service對象的結果
大家可以看到,我已經建立好了名為myweb的service。而且這個service也已經通過selector選擇了剛才建立好的5個pod。是以我可以通過service來通路tomcat的服務了。我這裡使用指令行來示範。
通路服務的方式
我們可以通過兩種方式來通路已經建立好的服務。
1. 叢集内部通路服務
我們可以通過service ip + service端口号的方式來從叢集内部通路已經建立好的服務,是以,我們來看看tomcat service的ip與端口号。
2. 叢集外部通路服務
從叢集的外部我們可以通過node ip + node端口号的方式來對服務進行通路。pod實際上已經分在了不同的node中了,我們隻用找到其中一個pod所在的node就行了。
部署mysql
如果你能将tomcat部署成功了,那麼部署mysql就沒有什麼好講的了。照前面做就行了。
建立mysql rc對象
我将此rc對象命名為mysql-rc1.yaml
直接上代碼:
2 kind: replicationcontroller
4 name: mysql
5 spec:
6 replicas: 1
7 selector:
8 app: mysql
9 template:
10 metadata:
11 labels:
12 app: mysql
13 spec:
14 containers:
15 - image: img.reg.3g:15000/mysql:5.7.13
16 name: mysql
17 resources:
18 limits:
19 cpu: "2"
20 memory: 4gi
21 ports:
22 - containerport: 3306
23 env:
24 - name: mysql_root_password
25 value: "123456"
不同之處在于建立mysql的rc對象yaml檔案時,注入了一個name為mysql_root_password的環境變量,這個是給mysql資料庫設定密碼,這個環境變量的注入是必須的,如果沒有此環境變量,雖然rc可以被建立成功,但是系統是無法啟動mysql容器的。
建立mysql rc對象的結果
建立mysql service對象
同樣道理,mysql也需要一個通路入口位址。建立的service yaml檔案名為mysql-svc1.yaml
還是直接上代碼
2 kind: service
7 - name: mysql-svc
8 port: 3306
9 targetport: 3306
10 nodeport: 31101
12 app: mysql
建立mysql service對象的結果
可以看到,mysql service對象也已經啟動成功了。
然後就可以自己通路mysql的服務看看