iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
DevOps

第一次參賽就學 Kubernetes系列 第 16

[Day 16] 範例:部署 Java 程式到 Kubernetes

  • 分享至 

  • xImage
  •  

本文參考此篇學習如何部署程式(在這邊是以 Java 為範例)到 kubernetes 叢集。

該篇主要有三支程式:

  1. shopfront:商品網站 WebUI
  2. productcatalogue:商品 API
  3. stockmanager:庫存 API

流程

  1. 前置準備(假設以下都已安裝)
    • 安裝 minikube、kubectl 與 Docker
    • 安裝 Java 環境
    • 安裝 Maven 環境:主要用來將 Java 程式打包成 jar 檔來部署
  2. 使用 Maven 來建立 jar
  3. 建立程式的 image 並讓 minikube 使用 local images(這邊不照參考將 image 上傳到 Dockerhub)
  4. 將程式部署到 kubernetes

1. 前置準備

假設電腦都已安裝好環境。

先把檔案從 github 拉下來。

2. 使用 Maven 來建立 jar

查看資料夾下的檔案。

ls
README.md        kubernetes       productcatalogue shopfront        stockmanager
cd shopfront/

ls
# 每個檔案中都有一個 Dockerfile
Dockerfile pom.xml    src

Dockerfile 裡已先定義好要將 target/shopfront-0.0.1-SNAPSHOT.jar 檔複製一份出來,但目前在資料夾內沒有這個檔案,故我們要先個別去做 mvn clean install 這個動作來產生。

FROM openjdk:8-jre
ADD target/shopfront-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8010
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

在三個資料夾下個別執行以下動作產生 target/ 中的 jar 檔,使用 -Dmaven.test.skip 略過測試。

mvn clean install -Dmaven.test.skip

3. 建立程式的 image 並讓 minikube 使用 local images

在個別資料夾下建立 image。

cd shopfront
docker build -t shopfront:latest .

cd productcatalogue
docker build -t productcatalogue:latest .

cd stockmanager
docker build -t stockmanager:latest .

查看建立好的 images。

docker images
REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
stockmanager                  latest    c74378106577   3 minutes ago   317MB
productcatalogue              latest    bf5ed57fcf7b   3 minutes ago   291MB
shopfront                     latest    cf4910127682   3 minutes ago   320MB
gcr.io/k8s-minikube/kicbase   v0.0.40   c6cc01e60919   2 months ago    1.19GB

這邊我使用 local 的 images、不將 images 上傳至 DockerHub。

minikube image load shopfront productcatalogue stockmanager

進入 minikube 在查看 images。

minikube ssh

docker@minikube:~$ docker images
REPOSITORY                                           TAG       IMAGE ID       CREATED          SIZE
stockmanager                                         latest    c74378106577   22 minutes ago   317MB
shopfront                                            latest    cf4910127682   22 minutes ago   320MB
productcatalogue                                     latest    bf5ed57fcf7b   22 minutes ago   291MB

4. 將程式部署到 kubernetes

kubernetes 資料夾下有三個 YAML。

cd kubernetes/
productcatalogue-service.yaml shopfront-service.yaml        stockmanager-service.yaml

shopfront-service.yaml 使用 --- 分隔不同資源,上半部為 service、下半部為 deployment。

  • 修改每一個 yaml 裡面的 pod image,分別為 shopfront:latestproductcatalogue:lateststockmanager:latest,以及新增 imagePullPolicy 屬性,下面只貼 shopfront 的 yaml。
---
apiVersion: v1
kind: Service
metadata:
  name: shopfront
  labels:
    app: shopfront
spec:
  type: NodePort
  selector:
    app: shopfront # 這邊 service 要使用在哪些 pod
  ports:
  - protocol: TCP
    port: 8010 # service 與 node port 一樣設定為 8010
    name: http

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: shopfront
spec:
  selector:
    matchLabels:
      app: shopfront
  replicas: 1
  template:
    metadata:
      labels:
        app: shopfront
    spec:
      containers:
      - name: shopfront
        image: shopfront:latest # 要修改 image,這邊等等會使用 local image
        imagePullPolicy: Never # 告訴 k8s 不要從 dockerhub 拉 image
        ports:
        - containerPort: 8010 # 該容器的 port
        livenessProbe:
          httpGet:
            path: /health
            port: 8010
          initialDelaySeconds: 30
          timeoutSeconds: 1

修改好內容後建立,這邊我省略其他兩個指令。

kubectl apply -f shopfront-service.yaml

service/shopfront created
deployment.apps/shopfront created

查看建立的 service、deployment 以及底下一個 pod。

kubectl get svc,po,deploy
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          9d
service/shopfront    NodePort    10.110.187.91   <none>        8010:32299/TCP   70s

NAME                            READY   STATUS         RESTARTS   AGE
pod/shopfront-76d58c669-b9bcx   0/1     ErrImagePull   0          70s

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/shopfront   0/1     1            0           70s 

記得重複執行其他兩個檔案。這邊請注意在 stockmanager-service.yaml 中修改時,裡面第 22 行與第 23 行有重複兩個 spec:,記得刪除其中一個!

透過 minikube service 連到 service,開啟瀏覽器觀看 127.0.0.1:51459

minikube service shopfront
|-----------|-----------|-------------|---------------------------|
| NAMESPACE |   NAME    | TARGET PORT |            URL            |
|-----------|-----------|-------------|---------------------------|
| default   | shopfront | http/8010   | http://192.168.49.2:32299 |
|-----------|-----------|-------------|---------------------------|
🏃  Starting tunnel for service shopfront.
|-----------|-----------|-------------|------------------------|
| NAMESPACE |   NAME    | TARGET PORT |          URL           |
|-----------|-----------|-------------|------------------------|
| default   | shopfront |             | http://127.0.0.1:51459 |
|-----------|-----------|-------------|------------------------|
🎉  Opening service default/shopfront in default browser...
❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.

瀏覽器輸入的 url 後面要接 /products

minikube service productcatalogue

瀏覽器輸入的 url 後面要接 /stocks

minikube service stockmanager

這次主要藉由參考該範例來了解到實際程式的部署過程,實際上目前的流程可以透過 Jenkins pipeline 來幫我們自動做完。相比前面再講很多 k8s 的物件,這類的實際應用會比較有趣XD。


上一篇
[Day 15] Secret
下一篇
[Day 17] 在 AWS 部署 Kubernetes 叢集 (一)
系列文
第一次參賽就學 Kubernetes30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言