畢業設計k8s部署


  1. 將web應用及其運行環境(tomcat)制作成鏡像
  2. 部署mysql並掛載數據
  3. 創建configmap
  4. 編寫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的標簽

外面都可以訪問:

external.png

疑問:怎樣才能讓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

view_cm.png

#修改,目前只能通過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文件,其它的文件都被覆蓋了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM