Kubernetes 提供了多種資源來管理和運行容器化的應用程式,包含了Deployment 和 StatefulSet,它們在管理應用程式的 Pod 時有不同的側重點和應用場景。下面會簡單介紹Kubernetes和如何將Springboot服務打包成的image部署上K8s。
Pod:Kubernetes 中的最小運行單位,包含一個或多個容器。當它們被刪除或崩潰時,Kubernetes 會自動創建新的 Pod。
Deployment:用來管理無狀態(Stateless)應用程式的 Pod,如等等會介紹的將Springboot服務上到K8s就是採用此方式。它確保所需數量的 Pod 持續運行,並允許進行滾動更新、擴展、回滾等操作。
StatefulSet:專門用來管理有狀態(Stateful)的應用程式。它保證每個 Pod 都有固定的身份(如持久的網路標識和存儲),這在數據庫、分布式存儲等應用場景中很重要,如將PostgreSQL服務上到K8s。
DaemonSet:確保每個節點(Node)上都運行一個特定的 Pod。它適合需要在所有節點上運行的應用程式,如日誌收集、監控。
ReplicaSet:用來確保指定數量的 Pod 副本持續運行。Deployment 其實是基於 ReplicaSet 進行管理的,它們之間有緊密的關係,但通常不直接操作 ReplicaSet,而是通過 Deployment,直接在deployment.yml上描述ReplicaSet的數量。
Job / CronJob:Job 負責執行一次性任務,確保任務至少成功運行一次;CronJob 則負責按計劃執行定時任務(就像Linux的crontab)。
Deployment 是 Kubernetes 中最常用的資源之一,專門用來管理 無狀態(Stateless)應用程式。它的主要功能是確保指定數量的 Pod 持續運行,並且支持滾動更新和回滾,適合處理那些不需要記住應用狀態的服務(如 Web 伺服器、API 伺服器等)。
StatefulSet 是 Kubernetes 中專門用來管理 有狀態(Stateful)應用程式 的資源。這類應用程式對於每個 Pod 的身份有特別要求,如唯一的網路標識和持久化存儲。常見的有狀態應用包括數據庫(如 MySQL、PostgreSQL)、分布式系統(如 Cassandra、ZooKeeper)等。
myapp-0
, myapp-1
)。特性 | Deployment | StatefulSet |
---|---|---|
應用場景 | 無狀態應用(如 Web 伺服器、API 伺服器) | 有狀態應用(如數據庫、分布式存儲) |
Pod 的身份 | 每個 Pod 沒有固定身份,彼此可互換 | 每個 Pod 有固定的身份,並保持順序 |
網路標識 | Pod 的 IP 是動態分配的,可能會改變 | Pod 的 DNS 名稱是穩定的(如 myapp-0 ) |
存儲管理 | 沒有固定的存儲,每個 Pod 可以重新啟動 | 每個 Pod 擁有獨立且持久的存儲(PVC) |
啟動和終止順序 | 沒有特定的順序,Pod 可同時啟動或終止 | 按順序啟動和終止,確保依賴順序的應用能正常運行 |
滾動更新 | 支持滾動更新和回滾,平滑進行版本升級 | 也支持滾動更新,但會按順序更新每個 Pod |
使用場景 | 適合無狀態應用,無需持久化存儲的服務 | 適合需要持久化存儲和固定身份的有狀態應用 |
以下是以前面介紹的方法將Springboot服務打包成的image部署上K8s的deployment.yaml範本。
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
namespace: default
labels:
app: test
spec:
selector:
matchLabels:
app: test
strategy:
type: Recreate
replicas: 1
template:
metadata:
name: test
labels:
app: test
spec:
nodeName: node1
containers:
- name: test
image: test
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
command: ["java","-jar","demo.jar"]
---
apiVersion: v1
kind: Service
metadata:
name: test
namespace: default
labels:
app: test
spec:
type: NodePort
selector:
app: test
ports:
- name: http
port: 8080
targetPort: 8080
protocol: TCP
nodePort: ${nodeport}
只需要創建上面這個yaml(test.yaml),並執行指令後即可將服務上到K8s。
K8s指令
$ kubectl create -f test.yaml
或是
$ kubectl apply -f test.yaml