先決條件
在開始之前,請確保您的系統上已安裝 Docker 和 Docker Compose,並且將Docker Desktop 開啟 Kubernetes。
啟用指南參考官網:前往
在開始練習之前,我們應該對 Docker 和 Kubernetes 有一定的基本概念,否則會感到困惑。我自己也還有一些細節需要釐清,這就是我們需要深入了解的地方。教學相長,讓我們一同學習!
這次的測試內容為一個最基本的系統架構,包括:
這是最基礎、最簡單、也是最常見的架構之一。先不包含網管部分的架構,因為我認為這不應該是後端工程師必須具備的技能,不過你若對這方面有需求,網路上有很多資源可以參考。
廢話不多說,上扣!
步驟清單
Image push 到 Docker Hub(可選)
步驟一 至 二:建立 MySQL 服務
以下是一個建立 MySQL 服務的範例,主要包含了建立持久儲存空間、對外曝露的 Service Node 以及建立 MySQL 服務的三個步驟。
檔案名稱:CreateMySQLV2.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: mysql
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: mysql
template:
metadata:
labels:
app.kubernetes.io/name: mysql
spec:
containers:
- image: mysql:8
name: mysql
env:
# 在實際使用時使用密鑰
- name: MYSQL_ROOT_PASSWORD
value: 1qaz2wsx
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
---
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: mysql
name: mysql-service
spec:
selector:
app.kubernetes.io/name: mysql
ports:
- protocol: TCP
port: 3309
targetPort: 3306
nodePort: 32700
type: LoadBalancer
部署指令:
kubectl apply -f CreateMySQLV2.yml
在執行專案打包前,我們需要確認 MySQL 的內部 IP,可以使用以下指令:
kubectl get all --output=wide
確認可以連線後,可以手動建立資料或在測試專案的 \resources\db\migration\init.sql
中有 SQL 可以執行。
步驟三 至 五:Build image
將 MySQL 曝露的 IP 與 Port 寫入 YAML 檔案
Package、Build Image,將 Image Push 到 Docker Hub(非必要)
# Build image command
docker build -t casterhsu/normal:v2 -f ./normal.Dockerfile .
步驟六:Deploy
這是一個簡易的部署 Spring Boot 的範例。在將服務部署在 Kubernetes 上,需要做以下事項:
如果有設定 imagePullPolicy: Never
則不需將 Image Push 到 Docker Hub
檔案名稱:CreateNormalV2.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: normal-project
name: normal
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: normal-project
template:
metadata:
labels:
app.kubernetes.io/name: normal-project
spec:
containers:
- image: casterhsu/normal:v2
imagePullPolicy: Never #當前永遠不從 registry 拉取最新的映像。
name: normal-container
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: normal-project
name: normal-project-service
spec:
selector:
app.kubernetes.io/name: normal-project
ports:
- protocol: TCP
port: 9000
targetPort: 8080
nodePort: 32701
type: LoadBalancer
部署指令:
kubectl apply -f CreateNormalV2.yml
步驟七:Testing
進行測試,並查看結果。
參考與附件
結語
這次的實戰範例以 Docker 和 Kubernetes 為基礎,展示了建立一個基本系統架構的步驟。透過實際的操作,我們深入了解了如何建立 MySQL 服務和 Spring Boot 服務,以及在 Kubernetes 上的部署過程。
在這個過程中,我們學到了以下重點:
基本概念的重要性:在開始之前,對 Docker 和 Kubernetes 有一定的基本觀念是至關重要的,否則可能會感到困惑。
系統架構的基礎:範例中使用了最基本且最常見的系統架構,包括 MySQL 和 Spring Boot。這是一個適合初學者入門的例子。
Kubernetes 實戰:通過實際操作,我們學到了如何在 Kubernetes 上建立服務,包括 YAML 檔案的編寫、部署指令的執行等。
最後,這個實戰範例為我們提供了實際的練習機會,強調了基本觀念的重要性,同時也激發了我們對於 Docker 和 Kubernetes 更深入學習的動力。在未來的學習過程中,我們可以進一步挑戰更複雜的系統架構,不斷精進自己的技能。教學相長,讓我們共同進步!