首页 后端开发 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 file name] 替换为名称您的 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

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 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教程
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1249
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 通过编译器优化和标准库,提供接近硬件的高性能,适合需要极致优化的应用。

Golang的影响:速度,效率和简单性 Golang的影响:速度,效率和简单性 Apr 14, 2025 am 12:11 AM

GoimpactsdevelopmentPositationalityThroughSpeed,效率和模拟性。1)速度:gocompilesquicklyandrunseff,ifealforlargeprojects.2)效率:效率:ITScomprehenSevestAndArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增强开发的简单性:3)SimpleflovelmentIcties:3)简单性。

开始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 的手动内存管理和编译器优化在递归计算中表现更为高效。

C和Golang:表演至关重要时 C和Golang:表演至关重要时 Apr 13, 2025 am 12:11 AM

C 更适合需要直接控制硬件资源和高性能优化的场景,而Golang更适合需要快速开发和高并发处理的场景。1.C 的优势在于其接近硬件的特性和高度的优化能力,适合游戏开发等高性能需求。2.Golang的优势在于其简洁的语法和天然的并发支持,适合高并发服务开发。

See all articles