本章是《kubernetes下的Nginx加Tomcat三部曲系列》的終篇,今天咱們一起在kubernetes環境對下圖中tomcat的數量進行調整,再修改tomcat中web工程的源碼,並將現有的tomcat的pod全部替換成新代碼構建的結果:
列舉步驟
- 在線擴容Tomcat;
- 驗證擴容結果;
- 修改web工程源碼;
- 構建web工程的新鏡像;
- 讓kubernetes的機器用上web工程的Docker鏡像
- 在線更新Tomcat的pod的鏡像;
- 驗證更新結果;
- Nginx&Tomcat方式和SpringCloud方式擴容對比;
kubernetes環境基本情況
- 一個master,一個node;
- master的IP地址:192.168.119.148;
- node1的IP地址:192.168.119.153;
在線擴容Tomcat
- 在裝好kubectl工具的機器上執行kubectl get pods,查看當前pod情況:
root@master:~# kubectl get pods NAME READY STATUS RESTARTS AGE ng-59b887b8bc-jzcv5 1/1 Running 3 2d tomcathost-7f68566795-8pl29 1/1 Running 3 2d tomcathost-7f68566795-mvg5f 1/1 Running 3 2d tomcathost-7f68566795-trscg 1/1 Running 3 2d
如上所示,目前是三個tomcat的pod;
- 執行擴容命令kubectl scale deployment tomcathost –replicas=5,將tomcat的pod從3個增加到5個,如下:
root@master:~# kubectl scale deployment tomcathost --replicas=5 deployment "tomcathost" scaled root@master:~# kubectl get pods NAME READY STATUS RESTARTS AGE ng-59b887b8bc-jzcv5 1/1 Running 3 2d tomcathost-7f68566795-8kf76 1/1 Running 0 18s tomcathost-7f68566795-8pl29 1/1 Running 3 2d tomcathost-7f68566795-mvg5f 1/1 Running 3 2d tomcathost-7f68566795-tp5xp 1/1 Running 0 18s tomcathost-7f68566795-trscg 1/1 Running 3 2d
tomcat的pod已經增加到5個了,創建時間都只有18秒;
- 去dashboard頁面看以下tomcathost這個deployment的詳情,可以看到tomcat數量已經上升到5個了,擴容成功:
點擊上圖紅框1,再點擊tomcathost這個服務,可以看到上圖中的詳情;
上圖紅框2中是5個tomcat的pod的容器IP地址;
點擊上圖紅框3中的每個容器名,可以查看容器詳情;
上圖紅框4顯示了剛才的擴容事件;
驗證擴容結果
nginx服務所在的node機器的IP地址是192.168.119.153,所以在瀏覽器上訪問:http://192.168.119.153:30006/getserverinfo,反復刷新此頁面,看到返回的IP地址在不斷的更新,都是tomcat所在pod的IP地址,5個都會出現,如下圖:
擴容實戰就到這里,接下來我們修改web工程的源碼,驗證在線升級的能力;
修改web工程源碼
tomcat上運行的web工程源碼,可以GitHub下載,地址和鏈接信息如下表所示:
名稱 | 鏈接 | 備注 |
---|---|---|
項目主頁 | https://github.com/zq2599/blog_demos | 該項目在GitHub上的主頁 |
git倉庫地址(https) | https://github.com/zq2599/blog_demos.git | 該項目源碼的倉庫地址,https協議 |
git倉庫地址(ssh) | git@github.com:zq2599/blog_demos.git | 該項目源碼的倉庫地址,ssh協議 |
這個git項目中有多個目錄,本次的web工程源碼放在k8stomcatdemo,如下圖紅框所示:
- 打開工程中的ServerInfo.java,web接口的源碼如下:
@RequestMapping(value = "/getserverinfo", method = RequestMethod.GET) public String getUserInfoWithRequestParam(){ return String.format("server : %s, time : %s", getIPAddr(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); }
修改返回的字符串內容,在前面加上”From new version,”:
@RequestMapping(value = "/getserverinfo", method = RequestMethod.GET) public String getUserInfoWithRequestParam(){ return String.format("From new version, server : %s, time : %s", getIPAddr(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); }
- 修改pom.xml中的工程版本,從0.0.1-SNAPSHOT改為0.0.3,如下所示:
<groupId>com.bolingcavalry</groupId> <artifactId>k8stomcatdemo</artifactId> <version>0.0.3</version> <packaging>jar</packaging> <name>k8stomcatdemo</name>
在pom.xml所在目錄執行mvn clean package -DskipTests docker:build,會編譯構建工程,並且在本地制作好鏡像文件,如下:
root@maven:/usr/local/work/k8s/k8stomcatdemo# docker images REPOSITORY TAG IMAGE ID CREATED SIZE bolingcavalry/k8stomcatdemo 0.0.3 5f2d27eafd1b 17 seconds ago 658 MB bolingcavalry/k8stomcatdemo latest 5f2d27eafd1b 17 seconds ago 658 MB
讓kubernetes的機器用上web工程的Docker鏡像
現在的鏡像只存在於開發和構建web工程的電腦上,為了讓kubernetes的node機器能用上這個鏡像,可以用以下幾種方式實現:
1. 用docker push命令將本機鏡像推送到hub.docker.com網站,這樣其他機器都可以通過docker pull命令取得了,我就是用的這種方法,需要在hub.docker.com上注冊,下圖是正在push中:
2. 用docker save命令導出鏡像文件,再用docker load命令導入;
3. kubernetes所在機器安裝java和maven環境,將工程在這里編譯構建;
4. 使用docker私有倉庫,例如搭建局域網私有倉庫或者阿里雲私有倉庫,參考《maven構建docker鏡像三部曲之三:推送到遠程倉庫(內網和阿里雲)》;
在線更新Tomcat的pod的鏡像
- 在kubernetes上執行以下命令,即可升級鏡像,當前的5個tomcat的pod會被銷毀,然后用新的鏡像創建pod:
kubectl set image deployment/tomcathost tomcathost=bolingcavalry/k8stomcatdemo:0.0.3
控制台提示的信息如下:
root@maven:/usr/local/work/k8s/k8stomcatdemo# kubectl set image deployment/tomcathost tomcathost=bolingcavalry/k8stomcatdemo:0.0.3 deployment "tomcathost" image updated
此刻反復執行kubectl get pod,會看到新容器創建,舊容器正在被銷毀,如下:
root@maven:/usr/local/work/k8s/k8stomcatdemo# kubectl get pod NAME READY STATUS RESTARTS AGE ng-59b887b8bc-jzcv5 1/1 Running 3 2d tomcathost-6dfc87dc8b-9bkfv 1/1 Running 0 50s tomcathost-6dfc87dc8b-h6gx4 0/1 ContainerCreating 0 50s tomcathost-6dfc87dc8b-ht2d8 1/1 Running 0 18s tomcathost-6dfc87dc8b-pfb56 1/1 Running 0 10s tomcathost-6dfc87dc8b-x8pnn 1/1 Running 0 14s tomcathost-7f68566795-8pl29 0/1 Terminating 3 2d tomcathost-7f68566795-trscg 0/1 Terminating 3 2d
-
nginx服務所在的node機器的IP地址是192.168.119.153,所以在瀏覽器上訪問:http://192.168.119.153:30006/getserverinfo,可以看到”From new version”這個字符串,如下圖:
-
去dashboard頁面看服務詳情,可以看見一系列的縮容和擴容事件,如下圖:
Nginx&Tomcat方式和SpringCloud方式擴容對比
在之前的文章中,我們實戰了SpringCloud環境下服務提供方的擴容,由於是“注冊&發現”的方式,擴容只需要往SpringCloud環境添加provider機器,不需要做什么設置,請求就會被落到新的provider上,相關實戰的地址如下:
1. 《Docker下的Spring Cloud三部曲之一:極速體驗》;
2. 《Docker下的Spring Cloud三部曲之二:細說Spring Cloud開發》;
3. 《Docker下的Spring Cloud三部曲之三:在線橫向擴容》;
在Nginx加Tomcat環境中,如果不是在kubernetes環境,我們增加Tomcat之后需要修改Nginx配置,否則到達Nginx的請求不會被轉發到新的機器上去,幸運的是kubernete幫我們解決了這個問題,擴容縮容都只需要控制副本數即可,不用修改Nginx配置了;
doceker-compose雖然可以修改副本數,但是Nginx的配置仍然需要修改,否則新創建的Tomcat容器都有自己的IP地址,Nginx還是感知不到;
至此,kubernetes下的Nginx加Tomcat三部曲就全部結束了,希望能在您的kubernetes實戰中有所幫助;