- 將web應用及其運行環境(tomcat)制作成鏡像
- 部署mysql並掛載數據
- 創建configmap
- 編寫web應用的deployment,並使用configmap
一、將web應用及其運行環境(tomcat)制作成鏡像
在制作鏡像時,為什么要將web應用的war包解壓,而不是直接使用CPOY命令將這個war包拷貝到webapps下?
答:由於
War包一般是在進行Web開發時,通常是一個網站Project下的所有源碼的集合,里面包含前台HTML/CSS/JS的代碼,也包含Java的代碼。
當開發人員在自己的開發機器上調試所有代碼並通過后,為了交給測試人員測試和未來進行產品發布,都需要將開發人員的源碼打包成War進行發布。
War包可以放在Tomcat下的webapps或者word目錄下,隨着tomcat服務器的啟動,它可以自動被解壓。
step 1. 編寫dockerfile文件
# Dockerfile
FROM docker.io/tomcat
MAINTAINER dongjia
RUN cd webapps && rm -rf ROOT/*
COPY ROOT.war /usr/local/tomcat/webapps/ROOT/
RUN cd webapps/ROOT/ && unzip -oq /usr/local/tomcat/webapps/ROOT/ROOT.war && rm -rf ROOT.war
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
注:為什么上面unzip之后要刪除ROOT.war文件? CMD后面是什么意思? 這個地方暴露端口和在yaml暴露端口的區別,再去熟悉Dockerfile的寫法
step 2. 執行Dockerfile並將鏡像打tag,同時推向私有倉庫
docker buile -t myweb:v1.0 -f . #要保證Dockerfile這個文件在當前目錄下
#docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/nginx_wy/nginx_wy:[鏡像版本號]
#registry.cn-hangzhou.aliyuncs.com/nginx_wy/nginx_wy:遠程倉庫域名及名稱
docker tag e0b6717ddddf 192.168.132.155:5000/myweb:v1.0
#docker push registry.cn-hangzhou.aliyuncs.com/nginx_wy/nginx_wy:[鏡像版本號]
docker push 192.168.132.155:5000/myweb:v1.0
二、部署mysql並掛載數據
step 1. 編寫mysql的deployment (mysql-dep.yaml)
apiVersion: extensions/v1beta1 #apiserver的版本
kind: Deployment #副本控制器deployment,管理pod和RS
metadata:
name: mysql #deployment的名稱,全局唯一
spec:
replicas: 1 #Pod副本期待數量
selector:
matchLabels: #定義RS的標簽
app: mysql #符合目標的Pod擁有此標簽
strategy: #定義升級的策略
type: RollingUpdate #滾動升級,逐步替換的策略
template: #根據此模板創建Pod的副本(實例)
metadata:
labels:
app: mysql #Pod副本的標簽,對應RS的Selector
spec:
containers: #Pod里容器的定義部分
- name: mysql #容器的名稱
image: mysql:5.7 #容器對應的docker鏡像
volumeMounts: #容器內掛載點的定義部分
- name: mysql-data
mountPath: /var/lib/mysql #容器內mysql的數據目錄
readOnly: false
ports:
- containerPort: 3306 #容器暴露的端口號
env: #寫入到容器內的環境容量
- name: MYSQL_ROOT_PASSWORD #定義了一個mysql的root密碼的變量
value: "1234"
volumes: #本地需要掛載到容器里的數據卷定義部分
- name: mysql-data
nfs:
server: 192.168.132.155
path: /data #by dong 這個目錄下要求沒有任何數據,如果有容器將啟動失敗,掛載成功后,此目錄下的內容與/var/lib/mysql目錄下的內容一模一樣,外面變化里面也跟着改變
注:特別注意mountPath的路徑和nfs的 /data目錄
在做的過程中遇到的問題:當時將windows主機上存放mysql數據的目錄(通過sql語句SELECT @@datadir
找到) 下如下圖:
直接將上面的那個文件拷貝到 /data目錄下(/data 是nfs掛載的目錄,拷貝完成后此目錄下目前只有db_library_seats目錄),然后通過上面定義的 mysql-dep.yaml 文件啟動mysql,發現pod始終起不來,describe看,說是 同步數據失敗(Err sync)最后將/data目錄中的db_library_seats刪除,然后再pod就可以正常起來了,等pod起來之后,查看 /data目錄,發現此目錄中已將mysql的data目錄同步過來了(其中有很多文件,包括系統庫文件mysql, sys等)如下圖:
再將db_library_seats拷貝進 /data目錄下,做個svc讓外部的navicat可連接,登錄,進入,發現數據庫中已經有db_library_seats這個庫了,但這僅僅是個空庫(沒有表),查詢資料才發現,在拷貝時要將數據目錄下的一個叫 ibdata1一同拷貝進 /data目錄,於是將windows中data目錄中的ibdata1文件拷入進去,發現db_library_seats庫中就有表和數據了(疑問:存儲結構、觸發器、表關聯圖、視圖還在嗎?不同版本的mysql能相互拷嗎? 問了一個運維,他們平時都是怎樣做數據庫的遷移的,他們是先將 mysql的配置文件考入目標庫,修改一下配置,然后再將要轉移的庫的數據目錄,和ibdata1拷入,最后再啟動數據庫)。
總結:通過直接拷貝mysql的data目錄中的 以庫名命名的目錄和ibdata1文件,可以實現將數據庫的快速遷移,特別是數據量巨大的數據庫,另外一個方式就是通過sql遷移數據庫,這種方式當數據量太大時,效率會非常低!
待擴展:mysql集群和主從怎樣弄?
step 2. 創建mysql的svc
apiVersion: v1
kind: Service #表示Kubernetes Service
metadata:
name: djmysql #Service的名稱
spec:
type: NodePort
ports:
- port: 3306 #Service提供服務的端口號
targetPort: 3306
selector:
app: mysql #Service對應的Pod的標簽
外面都可以訪問:
疑問:怎樣才能讓mysql只能在集群內被訪問?不想讓外部訪問
三、創建並修改configmap
#創建,這個以文件的形式創建的cm,共有4共方式創建,注意, --from-file 文件路徑
kubectl create configmap cumulx-test --from-file=config.properties
#查看
kubectl get cm
kubectl get cm tom-mysql -o yaml
#修改,目前只能通過edit的形式來修改,但這種方式是危險的,很可能產生亂碼
kubectl edit cm tom-mysql
四、編寫web應用的deployment,並使用configmap
myweb.yaml
apiVersion: extensions/v1beta1 #接口版本
kind: Deployment #接口類型
metadata: #基礎標簽名稱信息
name: library #創建的pod名稱
namespace: default #創建的pod屬於mt-math命名空間
spec: #詳細參數設置
replicas: 1 #副本數量
selector: #標簽選擇器
matchLabels:
app: dj-library #正對標簽為wyl-nginx的pod進行副本的創建
strategy:
rollingUpdate: #由於replicas為3,則整個升級,pod個數在2-4個之間
maxSurge: 1 #滾動升級時會先啟動1個pod
maxUnavailable: 1 #滾動升級時允許的最大Unavailable的pod個數
template: #模板
metadata:
labels:
app: dj-library #模板pod名稱必填
spec: #定義容器模板信息,該模板可以包含多個容器
containers:
- name: dj-library
image: 192.168.132.155:5000/myweb:v1.0 #by dong 最好寫上前面的私有倉庫地址,不然就會去公庫拉(除非設置了鏡像加速)
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8080 #by dong 制作鏡像時EXPOSE的8080,這里就必須使用8080
volumeMounts:
- name: tomcat-nfs
mountPath: /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/config.properties
subPath: config.properties
volumes: #設置掛載
- name: tomcat-nfs #掛載的數據節點名稱
configMap:
name: tom-mysql
注:特別注意subPath,cm和Volume掛載有什么區別?
踩坑記錄:之前沒有寫subPath, mountPath只寫到/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/ 當pod起來進入pod查看到classes目錄中只有一個文件了,即config.properties文件,其它的文件都被覆蓋了。