iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
Software Development

數位醫療與雲原生第一次的親密接觸系列 第 17

Day 17 [雲原生(Cloud Native)] Springboot服務上K8s

  • 分享至 

  • xImage
  •  

Kubernetes 提供了多種資源來管理和運行容器化的應用程式,包含了DeploymentStatefulSet,它們在管理應用程式的 Pod 時有不同的側重點和應用場景。下面會簡單介紹Kubernetes和如何將Springboot服務打包成的image部署上K8s。

Kubernetes 主要資源服務介紹

  1. Pod:Kubernetes 中的最小運行單位,包含一個或多個容器。當它們被刪除或崩潰時,Kubernetes 會自動創建新的 Pod。

  2. Deployment:用來管理無狀態(Stateless)應用程式的 Pod,如等等會介紹的將Springboot服務上到K8s就是採用此方式。它確保所需數量的 Pod 持續運行,並允許進行滾動更新、擴展、回滾等操作。

  3. StatefulSet:專門用來管理有狀態(Stateful)的應用程式。它保證每個 Pod 都有固定的身份(如持久的網路標識和存儲),這在數據庫、分布式存儲等應用場景中很重要,如將PostgreSQL服務上到K8s。

  4. DaemonSet:確保每個節點(Node)上都運行一個特定的 Pod。它適合需要在所有節點上運行的應用程式,如日誌收集、監控。

  5. ReplicaSet:用來確保指定數量的 Pod 副本持續運行。Deployment 其實是基於 ReplicaSet 進行管理的,它們之間有緊密的關係,但通常不直接操作 ReplicaSet,而是通過 Deployment,直接在deployment.yml上描述ReplicaSet的數量。

  6. Job / CronJob:Job 負責執行一次性任務,確保任務至少成功運行一次;CronJob 則負責按計劃執行定時任務(就像Linux的crontab)。


Deployment 的特點

Deployment 是 Kubernetes 中最常用的資源之一,專門用來管理 無狀態(Stateless)應用程式。它的主要功能是確保指定數量的 Pod 持續運行,並且支持滾動更新和回滾,適合處理那些不需要記住應用狀態的服務(如 Web 伺服器、API 伺服器等)。

Deployment 的關鍵功能:

  • 滾動更新:Deployment 支持平滑地更新應用程式,而不會中斷服務。它會逐步替換舊版本的 Pod,直到所有 Pod 都使用新版本。
  • 回滾(Rollback):如果應用更新出現問題,Deployment 支持回滾到之前的版本。
  • 擴展與縮減:根據需求擴展或縮減 Pod 的數量,確保應用程式能應對不同的流量負載。
  • 無狀態應用:Deployment 適合無狀態應用,每個 Pod 的身份都是互相替換的,因此它們之間不需要共享任何狀態或資料。

StatefulSet 的特點

StatefulSet 是 Kubernetes 中專門用來管理 有狀態(Stateful)應用程式 的資源。這類應用程式對於每個 Pod 的身份有特別要求,如唯一的網路標識和持久化存儲。常見的有狀態應用包括數據庫(如 MySQL、PostgreSQL)、分布式系統(如 Cassandra、ZooKeeper)等。

StatefulSet 的關鍵功能:

  • 穩定的網路標識:StatefulSet 中的每個 Pod 都有一個固定的網路標識,這是基於 Pod 的順序來分配的(如 myapp-0, myapp-1)。
  • 穩定的存儲:每個 Pod 都有自己的 Persistent Volume(PV),即使 Pod 被刪除或重啟,數據也會保留並與該 Pod 綁定。
  • 順序啟動和終止:StatefulSet 中的 Pod 按照一定的順序啟動和終止,確保系統的狀態不會在更新或重啟時出現混亂。
  • 適合有狀態應用:當應用程式需要記錄狀態、需要固定的身份或需要存儲數據時,StatefulSet 是最佳選擇。

DeploymentStatefulSet 的主要差異

特性 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

上一篇
Day 16 [雲原生( Cloud Native ) ] docker X docker-compose X Kubernetes
下一篇
Day 18 [雲原生 ( Cloud Native ) ] 部署HAPI FHIR Server至K8s環境
系列文
數位醫療與雲原生第一次的親密接觸30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言