我把SpringBoot應(yīng)用部署到了K8S上,怎么感覺用起來(lái)像Docker景图!

想要把一個(gè)復(fù)雜的微服務(wù)項(xiàng)目部署到K8S上去较雕,首先我們得學(xué)會(huì)把單個(gè)SpringBoot應(yīng)用部署上去。今天我們來(lái)講下如何把SpringBoot應(yīng)用部署到K8S上去挚币,和使用Docker Compose部署非常類似亮蒋,希望對(duì)大家有所幫助!

推送鏡像到Docker Hub

之前我們都是自建的鏡像倉(cāng)庫(kù)妆毕,這次我們換種方式慎玖,把鏡像上傳到Docker Hub中去。

  • 首先我們得注冊(cè)個(gè)Docker Hub的賬號(hào)笛粘,Docker Hub地址:https://hub.docker.com/

    image.png

  • 部署應(yīng)用使用之前的mall-tiny-fabric項(xiàng)目趁怔,先修改pom.xml文件,主要是添加Docker Hub的認(rèn)證信息和修改下鏡像前綴闰蛔,具體內(nèi)容如下痕钢;

<configuration>
    <!-- Docker 遠(yuǎn)程管理地址-->
    <dockerHost>http://192.168.5.94:2375</dockerHost>
    <!-- 添加認(rèn)證信息-->
    <authConfig>
        <push>
            <!--Docker Hub 用戶名-->
            <username>macrodocker</username>
            <!--Docker Hub 密碼-->
            <password>xxx</password>
        </push>
    </authConfig>
    <images>
        <image>
            <!--修改鏡像前綴為Docker Hub 用戶名-->
            <name>macrodocker/${project.name}:${project.version}</name>
        </image>
     </images>
 </configuration>
  • 修改完成后使用package命令先把鏡像打包到Linux服務(wù)器图柏,再使用docker:push命令把鏡像推送到Docker Hub中去:
    image.png
  • 推送成功以后就可以在Docker Hub中看到鏡像了序六。
    image.png

應(yīng)用部署

接下來(lái)我們將把應(yīng)用部署到K8S上去,包含SpringBoot應(yīng)用的部署和MySQL的部署蚤吹。

部署MySQL

  • 首先添加配置文件mysql-deployment.yaml用于創(chuàng)建Deployment例诀,具體說明參考注釋即可;
apiVersion: apps/v1
kind: Deployment
metadata:
  # 指定Deployment的名稱
  name: mysql-deployment
  # 指定Deployment的標(biāo)簽 
  labels:
    app: mysql
spec:
  # 指定創(chuàng)建的Pod副本數(shù)量 
  replicas: 1
  # 定義如何查找要管理的Pod
  selector:
    # 管理標(biāo)簽app為mysql的Pod
    matchLabels:
      app: mysql
  # 指定創(chuàng)建Pod的模板
  template:
    metadata:
      # 給Pod打上app:mysql標(biāo)簽
      labels:
        app: mysql
    # Pod的模板規(guī)約
    spec:
      containers:
        - name: mysql
          # 指定容器鏡像
          image: mysql:5.7
          # 指定開放的端口
          ports:
            - containerPort: 3306
          # 設(shè)置環(huán)境變量
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: root
          # 使用存儲(chǔ)卷
          volumeMounts:
            # 將存儲(chǔ)卷掛載到容器內(nèi)部路徑
            - mountPath: /var/log/mysql
              name: log-volume
            - mountPath: /var/lib/mysql
              name: data-volume
            - mountPath: /etc/mysql
              name: conf-volume
      # 定義存儲(chǔ)卷
      volumes:
        - name: log-volume
          # hostPath類型存儲(chǔ)卷在宿主機(jī)上的路徑
          hostPath:
            path: /home/docker/mydata/mysql/log
            # 當(dāng)目錄不存在時(shí)創(chuàng)建
            type: DirectoryOrCreate
        - name: data-volume
          hostPath:
            path: /home/docker/mydata/mysql/data
            type: DirectoryOrCreate
        - name: conf-volume
          hostPath:
            path: /home/docker/mydata/mysql/conf
            type: DirectoryOrCreate
  • 通過應(yīng)用配置文件來(lái)創(chuàng)建Deployment裁着;通過應(yīng)用配置文件來(lái)創(chuàng)建Deployment繁涂;
kubectl apply -f mysql-deployment.yaml
  • 運(yùn)行成功后查詢Deployment,發(fā)現(xiàn)mysql-deployment已經(jīng)就緒二驰;
[macro@linux-local k8s]$ kubectl get deployments
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
mysql-deployment          1/1     1            1           38s
nginx-volume-deployment   2/2     2            2           6d5h
  • 想要其他Pod可以通過服務(wù)名稱訪問MySQL扔罪,需要?jiǎng)?chuàng)建Service,添加配置文件mysql-service.yaml用于創(chuàng)建Service桶雀;
apiVersion: v1
kind: Service
metadata:
  # 定義服務(wù)名稱矿酵,其他Pod可以通過服務(wù)名稱作為域名進(jìn)行訪問
  name: mysql-service
spec:
  # 指定服務(wù)類型,通過Node上的靜態(tài)端口暴露服務(wù)
  type: NodePort
  # 管理標(biāo)簽app為mysql的Pod
  selector:
    app: mysql
  ports:
    - name: http
      protocol: TCP
      port: 3306
      targetPort: 3306
      # Node上的靜態(tài)端口
      nodePort: 30306
  • 通過應(yīng)用配置文件來(lái)創(chuàng)建Service矗积;
kubectl apply -f mysql-service.yaml 
  • 運(yùn)行成功后查詢Service全肮,發(fā)現(xiàn)mysql-service已經(jīng)暴露在Node的30306端口上了;
[macro@linux-local k8s]$ kubectl get services
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP          7d23h
mysql-service   NodePort    10.107.189.51    <none>        3306:30306/TCP   7s
nginx-service   NodePort    10.101.171.181   <none>        80:30080/TCP     6d2h
  • 部署完成后需要新建mall數(shù)據(jù)庫(kù)棘捣,并導(dǎo)入相關(guān)表辜腺,表地址:https://github.com/macrozheng/mall-learning/blob/master/document/sql/mall.sql
  • 這里有個(gè)比較簡(jiǎn)單的方法來(lái)導(dǎo)入數(shù)據(jù)庫(kù),通過Navicat創(chuàng)建連接,先配置一個(gè)SSH通道评疗;
    image.png
  • 之后我們就可以像在Linux服務(wù)器上訪問數(shù)據(jù)庫(kù)一樣訪問Minikube中的數(shù)據(jù)庫(kù)了测砂,直接添加Minikube中數(shù)據(jù)庫(kù)IP和端口即可。
    image.png

部署SpringBoot應(yīng)用

  • 首先添加配置文件mall-tiny-fabric-deployment.yaml用于創(chuàng)建Deployment百匆,這里我們可以通過環(huán)境變量來(lái)覆蓋SpringBoot中的默認(rèn)配置邑彪;
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mall-tiny-fabric-deployment
  labels:
    app: mall-tiny-fabric
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mall-tiny-fabric
  template:
    metadata:
      labels:
        app: mall-tiny-fabric
    spec:
      containers:
        - name: mall-tiny-fabric
          # 指定Docker Hub中的鏡像地址
          image: macrodocker/mall-tiny-fabric:0.0.1-SNAPSHOT
          ports:
            - containerPort: 8080
          env:
            # 指定數(shù)據(jù)庫(kù)連接地址
            - name: spring.datasource.url
              value: jdbc:mysql://mysql-service:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
            # 指定日志文件路徑
            - name: logging.path
              value: /var/logs
          volumeMounts:
            - mountPath: /var/logs
              name: log-volume
      volumes:
        - name: log-volume
          hostPath:
            path: /home/docker/mydata/app/mall-tiny-fabric/logs
            type: DirectoryOrCreate
  • 通過應(yīng)用配置文件來(lái)創(chuàng)建Deployment
kubectl apply -f mall-tiny-fabric-deployment.yaml
  • 我們可以通過kubectl logs命令來(lái)查看應(yīng)用的啟動(dòng)日志胧华;
[macro@linux-local k8s]$ kubectl get pods
NAME                                           READY   STATUS    RESTARTS   AGE
mall-tiny-fabric-deployment-8684857dff-pnz2t   1/1     Running   0          47s
mysql-deployment-5dccc96ccf-sfxvg              1/1     Running   0          25m
nginx-volume-deployment-6f6c89976d-nv2rn       1/1     Running   4          6d6h
nginx-volume-deployment-6f6c89976d-tmhc5       1/1     Running   4          6d5h
[macro@linux-local k8s]$ kubectl logs -f mall-tiny-fabric-deployment-8684857dff-pnz2t
  • 如果想要從外部訪問SpringBoot應(yīng)用寄症,需要?jiǎng)?chuàng)建Service,添加配置文件mall-tiny-fabric-service.yaml用于創(chuàng)建Service矩动;
apiVersion: v1
kind: Service
metadata:
  name: mall-tiny-fabric-service
spec:
  type: NodePort
  selector:
    app: mall-tiny-fabric
  ports:
    - name: http
      protocol: TCP
      port: 8080
      targetPort: 8080
      # Node上的靜態(tài)端口
      nodePort: 30180
  • 通過應(yīng)用配置文件來(lái)創(chuàng)建Service有巧;
kubectl apply -f mall-tiny-fabric-service.yaml
  • 此時(shí)服務(wù)已經(jīng)暴露到了Node的30180端口上了;
[macro@linux-local k8s]$ kubectl get services
NAME                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes                 ClusterIP   10.96.0.1        <none>        443/TCP          7d23h
mall-tiny-fabric-service   NodePort    10.100.112.84    <none>        8080:30180/TCP   5s
mysql-service              NodePort    10.107.189.51    <none>        3306:30306/TCP   13m
nginx-service              NodePort    10.101.171.181   <none>        80:30080/TCP     6d2h
  • Linux服務(wù)器上悲没,我們可以通過curl命令來(lái)訪問下項(xiàng)目的Swagger頁(yè)面篮迎,不過只能查看到返回的一串HTML代碼。
curl $(minikube ip):30180/swagger-ui.html

外部訪問應(yīng)用

由于使用Minikube安裝的K8S Node處于Linux服務(wù)器的內(nèi)網(wǎng)環(huán)境示姿,無(wú)法直接從外部訪問甜橱,所以我們需要安裝一個(gè)Nginx反向代理下才能訪問。

  • 首先我們需要安裝Nginx栈戳,
  • 安裝完成后添加一個(gè)Nginx的配置文件岂傲,這里我的配置路徑為/mydata/nginx/conf/conf.d/,用于將mall-tiny.macrozheng.com域名的訪問代理到K8S中的SpringBoot應(yīng)用中去子檀,proxy_pass為上面curl使用的路徑镊掖;
server {
    listen       80;
    server_name  mall-tiny.macrozheng.com; #修改域名

    location / {
        proxy_set_header Host $host:$server_port;
        proxy_pass   http://192.168.49.2:30180; #修改為代理服務(wù)地址
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}
  • 重啟Nginx服務(wù),再修改訪問Linux服務(wù)器的本機(jī)host文件褂痰,添加如下記錄亩进;
192.168.5.94 mall-tiny.macrozheng.com

總結(jié)

通過把SpringBoot應(yīng)用部署到K8S上的一頓操作缩歪,我們可以發(fā)現(xiàn)在K8S上部署和在Docker上部署有很多相似之處归薛。K8S上很多部署用的腳本,直接翻譯之前使用Docker Compose的腳本即可匪蝙,非常類似主籍。如果你之前用過Docker,那么你就可以輕松上手K8S骗污!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末崇猫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子需忿,更是在濱河造成了極大的恐慌诅炉,老刑警劉巖蜡歹,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異涕烧,居然都是意外死亡月而,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門议纯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)父款,“玉大人,你說我怎么就攤上這事瞻凤『┰埽” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵阀参,是天一觀的道長(zhǎng)肝集。 經(jīng)常有香客問我,道長(zhǎng)蛛壳,這世上最難降的妖魔是什么杏瞻? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮衙荐,結(jié)果婚禮上捞挥,老公的妹妹穿的比我還像新娘。我一直安慰自己忧吟,他們只是感情好砌函,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瀑罗,像睡著了一般胸嘴。 火紅的嫁衣襯著肌膚如雪雏掠。 梳的紋絲不亂的頭發(fā)上斩祭,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音乡话,去河邊找鬼摧玫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绑青,可吹牛的內(nèi)容都是我干的诬像。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼闸婴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坏挠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起邪乍,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤降狠,失蹤者是張志新(化名)和其女友劉穎对竣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榜配,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡否纬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛋褥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片临燃。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖烙心,靈堂內(nèi)的尸體忽然破棺而出膜廊,到底是詐尸還是另有隱情,我是刑警寧澤淫茵,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布溃论,位于F島的核電站,受9級(jí)特大地震影響痘昌,放射性物質(zhì)發(fā)生泄漏钥勋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一辆苔、第九天 我趴在偏房一處隱蔽的房頂上張望算灸。 院中可真熱鬧,春花似錦驻啤、人聲如沸菲驴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赊瞬。三九已至,卻和暖如春贼涩,著一層夾襖步出監(jiān)牢的瞬間巧涧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工遥倦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谤绳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓袒哥,卻偏偏與公主長(zhǎng)得像缩筛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子堡称,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容