首頁 後端開發 Golang Kubernetes Statefulsets 初學者指南

Kubernetes Statefulsets 初學者指南

Dec 06, 2024 pm 12:02 PM

StatefulSets 是 Kubernetes 中用於管理有狀態應用程式的 API 物件。 Kubernetes中有兩種類型的應用程序,有狀態應用程式和無狀態應用程式。有兩種方法可以部署這些應用程式:

  • 部署(對於無狀態應用程式)
  • StatefulSets(用於有狀態應用程式)

什麼是有狀態應用程式?

那些維護某種形式的持久狀態或資料的應用程式稱為有狀態應用程式。它們與無狀態應用程式的關鍵特徵是這些應用程式不依賴本地儲存數據,並且它們不將每個請求視為獨立的。他們管理互動之間的數據。有時無狀態應用程式會連接到有狀態應用程式以將請求轉發到資料庫。

什麼是無狀態應用程式?

那些不在本地維護任何形式的持久狀態或資料的應用程式稱為無狀態應用程式。在無狀態應用程式中,每個請求或互動都是獨立處理的。這些應用程式被設計為高度可擴展、易於管理和容錯,因為與有狀態應用程式不同,它們不必追蹤過去的互動或請求。

無狀態應用程式使用部署元件進行部署。部署是 pod 的抽象,允許您複製應用程序,這意味著它允許您運行相同無狀態應用程式的 1、5、10 或 n 個相同的 pod。

什麼是 StatefulSet?

簡單地說,StatefulSets 是專門用於有狀態應用程式的 Kubernetes 元件。這些是用於管理有狀態應用程式的工作負載 API 物件。它們管理一組 Pod 的部署和擴充(建立更多副本或刪除它們),StatefulSet 也負責這些 Pod 的排序和唯一性。 StatefulSet 在 Kubernetes 1.9 版本中發布。

StatefulSets 將代表具有不同(唯一)、持久身分和彈性主機名稱(穩定)的 Pod 集合。它使您可以確定擴展和部署的順序。在了解 StatefulSet 之前,您必須了解 Kubernetes Deployment。

這是一個名為 web 的 StatefulSet 範例:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
登入後複製
登入後複製
登入後複製

何時使用 StatefulSet

Kubernetes 中的 StatefulSet 非常適合部署需要穩定、唯一的網路識別碼、持久性儲存以及有序、優雅的部署和擴展的有狀態應用程式。它們適用於需要一致身份和儲存的資料庫、鍵值儲存和訊息佇列等應用程式。

有狀態和無狀態應用程式的範例

考慮一個連接到 MongoDB 資料庫的 Node.js 應用程式。當請求到達 Node.js 應用程式時,它會獨立處理該請求,並且不依賴先前的資料來執行此操作。它根據請求本身的有效負載處理請求。此 Node.js 應用程式是無狀態應用程式的範例。現在請求要么更新資料庫中的一些數據,要么從資料庫中查詢一些數據。當node.js將該請求轉送到MongoDB時,MongoDB會根據資料的先前狀態更新資料或從其儲存體中查詢資料。對於每個請求,它都需要處理數據,並且它取決於可用的最新數據或狀態,而 Node.js 只是數據更新或查詢的傳遞,它只處理程式碼。因此,node.js 應用程式應該是無狀態應用程序,而 MongoDB 應用程式必須是有狀態應用程式。

有時無狀態應用程式連接到有狀態應用程式以將請求轉發到資料庫。這是無狀態應用程式將請求轉發到有狀態應用程式的一個很好的範例。

如何在 Kubernetes 中建立 StatefulSet

這裡是如何使用 StatefulSet 以及 StatefulSet 的一些基本操作的逐步教學。

建立 Nginx StatefulSet 應用程式

第 1 步. 建立 StatefulSet 檔。您可以輸入以下命令來做到這一點:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
登入後複製
登入後複製
登入後複製

步驟 2. 在程式碼編輯器中開啟此檔案並將以下程式碼寫入其中:

touch example-statefulset.yaml
登入後複製
登入後複製

第 3 步。 現在我們必須建立一個服務檔案和一個 PersistentVolumeClaim 檔案。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: gfg-example-statefulset
  annotations:
    description: "This is an example statefulset"
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "gfg-example-service"
  replicas: 3 # remember this, we will have 3 identical pods running
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: myclaim
登入後複製
登入後複製

為 StatefulSet 應用程式建立服務

步驟 4. 在服務文件中輸入以下程式碼:

touch example-service.yaml
touch example-persistentVolumeChain.yaml
登入後複製
登入後複製

為應用程式建立 PersistentVolumeClaim

第 5 步. 將以下程式碼輸入到 PersistentVolumeClaim 檔案中:

apiVersion: v1
kind: Service
metadata:
  name: gfg-example-service
  annotations:
    description: "this is an example service"
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
登入後複製
登入後複製

現在讓我們來套用這些變更。

步驟 6. 在終端機中輸入以下命令來建立 gfg-example-statefulset:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi # This means we are requesting for 8 GB of storage
登入後複製
登入後複製

這將創建我們的 gfg-example-statefulset,您將得到類似的結果:

Beginners guide to Kubernetes Statefulsets

現在,如果我們透過指令在終端機中搜尋 StatefulSets

kubectl create -f example-statefulset.yaml
登入後複製
登入後複製

我們將在清單中找到我們的 gfg-example-statefulset。

Beginners guide to Kubernetes Statefulsets

步驟 7. 在終端機中輸入以下命令以建立 gfg-example-service。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
登入後複製
登入後複製
登入後複製

這將建立一個名為「gfg-example-service」的服務

第 8 步。 讓我們檢查我們的 pod 和服務,要取得 pod 列表,請在終端機中輸入以下命令:

touch example-statefulset.yaml
登入後複製
登入後複製

您將獲得我們透過在 example-stateful-set.yaml 檔案中定義三個副本所建立的三個 gfg-pod 的清單。您將得到類似的輸出:

Beginners guide to Kubernetes Statefulsets

要檢查服務列表,請在終端機中輸入以下命令:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: gfg-example-statefulset
  annotations:
    description: "This is an example statefulset"
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "gfg-example-service"
  replicas: 3 # remember this, we will have 3 identical pods running
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: myclaim
登入後複製
登入後複製

這將為您提供類似的輸出:

Beginners guide to Kubernetes Statefulsets

StatefulSet 上的一些操作

新增StatefulSet: 若要將StatefulSet 新增至Kubernetes 叢集,請使用指令kubectl create -f [StatefulSet file name],將[StatefulSet filename] 替換為名稱您的名稱StatefulSet 清單檔案。

touch example-service.yaml
touch example-persistentVolumeChain.yaml
登入後複製
登入後複製

刪除 StatefulSet: 要在 Kubernetes 中刪除 StatefulSet,可以使用 kubectl delete statefulset [name] 命令,其中 [name] 是您想要的 StatefulSet 的名稱刪除。

apiVersion: v1
kind: Service
metadata:
  name: gfg-example-service
  annotations:
    description: "this is an example service"
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
登入後複製
登入後複製

編輯 StatefulSet: 命令 kubectl edit statefulset [name] 允許您透過開啟編輯器直接從命令列修改 StatefulSet 的配置。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi # This means we are requesting for 8 GB of storage
登入後複製
登入後複製

副本擴充: kubectl scale 指令將名為 [StatefulSet name] 的 StatefulSet 中的副本數量縮放為指定的 [副本數量]。

kubectl create -f example-statefulset.yaml
登入後複製
登入後複製

第 9 步。 現在讓我們擴大我們的 pod 並檢查它是否有效!若要將 Pod 擴展到 6 個 Pod,請輸入以下指令:

kubectl get statefulsets
登入後複製

這將建立另外 3 個 pod,而 pod 數量現在為 6,要取得 pod 列表,請輸入以下命令:

kubectl apply -f example-service.yaml
登入後複製

您將會得到類似的輸出:

Beginners guide to Kubernetes Statefulsets

第 10 步。 現在讓我們將 Pod 縮小到 3 個,為此輸入相同的命令,只需將副本數更改回 3:

kubectl get pods
登入後複製

現在如果我們檢查 pod 清單

kubectl get services
登入後複製

您將看到只有 3 個 pod 正在運行:

Beginners guide to Kubernetes Statefulsets

透過這種方式,我們可以建立 StatefulSet,放大它們,然後縮小它們。確保在關閉終端之前刪除 StatefulSet 和服務。若要了解 kubectl 的更多命令,請參閱 Kubectl Command Cheat Sheet。

有狀態應用程式如何運作?

在MySQL等有狀態應用中,多個Pod不能同時讀寫數據,以避免數據不一致。
其中一個 pod 被指定為 master pod,負責寫入和更改數據,而其他 pod 被指定為 Slave pod,只允許讀取數據。
每個 Pod 都有自己的資料儲存副本,確保資料隔離和獨立。
採用同步機制來確保所有 pod 具有相同的資料狀態,當 master pod 變更資料時,從屬 pod 會更新其資料儲存。
持續同步對於維持有狀態應用程式中所有 pod 之間的資料一致性是必要的。

範例:
假設我們有一個 MySQL 主 pod 和兩個從 pod。現在,當新的 Pod 副本加入現有設定時會發生什麼?因為現在新的 Pod 也需要創建自己的儲存並負責同步,它首先克隆前一個 Pod 中的數據,然後開始持續同步以偵聽主 Pod 的任何更新。因為每個 Pod 都有自己的資料儲存(持久性磁碟區),而該資料儲存由自己的實體儲存備份,其中包括同步資料和 Pod 的狀態。每個 Pod 都有自己的狀態,其中包含有關它是主 Pod 還是從屬 Pod 的資訊以及其他單獨的特徵。所有這些都儲存在 Pod 自己的儲存中。因此,當 pod 死亡並被持久 pod 替換時。識別碼可確保儲存磁碟區重新連接到替換 Pod。這樣即使集群崩潰,也能保證資料不會遺失。

結論

在本文中我們討論如何使用 Kubernetes StatefulSets。 StatefulSet 是用於部署有狀態應用程式的 Kubenetes 元件。有狀態應用程式是那些維護某種形式的持久狀態或資料的應用程式。一個很好的例子是任何帶有資料庫的應用程式。我們討論瞭如何使用 StatefulSet 部署有狀態應用程式。之後我們討論了有狀態應用程式如何運作?最後我們討論了 StatefulSet 和部署之間的區別,它基本上圍繞著部署用於部署無狀態應用程式和 StatefulSet 用於部署有狀態應用程式這一點。我們將透過解決一些常見問題解答來結束本文。

Kubernetes StatefulSets - 常見問題解答

如何增加 Kubernetes 中的磁碟區大小?

要增加 Kubernetes 中的磁碟區大小,您需要透過變更儲存大小來修改 PersistentVolumeClaim (PVC) 規格。然後,Kubernetes 會自動配置額外的儲存空間來滿足新的大小需求,前提是底層儲存類別支援動態配置。

何時在 Kubernetes 中使用 hostPath?

Kubernetes 中的 hostPath 磁碟區類型適用於需要直接在 pod 內存取節點檔案系統上的檔案或目錄的場景。它通常用於存取特定於節點的資源或在同一節點上的容器之間共用資料。

PVC StatefulSet 和部署有什麼不同?

StatefulSet 中的 PersistentVolumeClaims (PVC) 用於為各個 Pod 提供穩定、持久的存儲,確保 Pod 重新啟動時資料的持久性和身份。相較之下,部署通常使用臨時磁碟區,適用於不需要資料持久性的無狀態應用程式。

我們可以使用 StatefulSet 部署無狀態應用程式嗎?

雖然技術上可行,但不建議使用 StatefulSet 部署無狀態應用程式。 StatefulSet 專為需要穩定、唯一識別碼和持久性儲存的有狀態應用程式而設計。使用 StatefulSet 部署無狀態應用程式可能會帶來不必要的複雜性和資源開銷。

無狀態比有狀態好嗎?

這取決於應用程式的特定要求。無狀態應用程式更易於管理和水平擴展,而有狀態應用程式可維護資料完整性,並且更適合某些工作負載,例如資料庫或訊息傳遞系統。

以上是Kubernetes Statefulsets 初學者指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1673
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
Golang vs. Python:性能和可伸縮性 Golang vs. Python:性能和可伸縮性 Apr 19, 2025 am 12:18 AM

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

Golang和C:並發與原始速度 Golang和C:並發與原始速度 Apr 21, 2025 am 12:16 AM

Golang在並發性上優於C ,而C 在原始速度上優於Golang。 1)Golang通過goroutine和channel實現高效並發,適合處理大量並發任務。 2)C 通過編譯器優化和標準庫,提供接近硬件的高性能,適合需要極致優化的應用。

開始GO:初學者指南 開始GO:初學者指南 Apr 26, 2025 am 12:21 AM

goisidealforbeginnersandsubableforforcloudnetworkservicesduetoitssimplicity,效率和concurrencyFeatures.1)installgromtheofficialwebsitealwebsiteandverifywith'.2)

Golang vs.C:性能和速度比較 Golang vs.C:性能和速度比較 Apr 21, 2025 am 12:13 AM

Golang適合快速開發和並發場景,C 適用於需要極致性能和低級控制的場景。 1)Golang通過垃圾回收和並發機制提升性能,適合高並發Web服務開發。 2)C 通過手動內存管理和編譯器優化達到極致性能,適用於嵌入式系統開發。

Golang vs. Python:主要差異和相似之處 Golang vs. Python:主要差異和相似之處 Apr 17, 2025 am 12:15 AM

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。Golang以其并发模型和高效性能著称,Python则以简洁语法和丰富库生态系统著称。

Golang和C:性能的權衡 Golang和C:性能的權衡 Apr 17, 2025 am 12:18 AM

Golang和C 在性能上的差異主要體現在內存管理、編譯優化和運行時效率等方面。 1)Golang的垃圾回收機制方便但可能影響性能,2)C 的手動內存管理和編譯器優化在遞歸計算中表現更為高效。

表演競賽:Golang vs.C 表演競賽:Golang vs.C Apr 16, 2025 am 12:07 AM

Golang和C 在性能競賽中的表現各有優勢:1)Golang適合高並發和快速開發,2)C 提供更高性能和細粒度控制。選擇應基於項目需求和團隊技術棧。

Golang vs. Python:利弊 Golang vs. Python:利弊 Apr 21, 2025 am 12:17 AM

Golangisidealforbuildingscalablesystemsduetoitsefficiencyandconcurrency,whilePythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.Golang'sdesignencouragesclean,readablecodeanditsgoroutinesenableefficientconcurrentoperations,t

See all articles