本文參考此篇學習如何部署程式(在這邊是以 Java 為範例)到 kubernetes 叢集。
該篇主要有三支程式:
jar
檔來部署jar
檔假設電腦都已安裝好環境。
先把檔案從 github 拉下來。
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
在個別資料夾下建立 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
在 kubernetes
資料夾下有三個 YAML。
cd kubernetes/
productcatalogue-service.yaml shopfront-service.yaml stockmanager-service.yaml
shopfront-service.yaml
使用 ---
分隔不同資源,上半部為 service、下半部為 deployment。
shopfront:latest
、productcatalogue:latest
、stockmanager: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。