K8S(Kubernetes)的存储是容器化应用程序中非常重要的一部分,它帮助用户在不同场景下管理和存储数据。K8S提供了多种存储方式,以满足不同的存储需求。以下是对K8S存储的详细解析:

一、K8S存储类型

K8S的存储类型主要分为两大类:临时存储和持久存储。

  1. 临时存储
  • EmptyDir:EmptyDir 是一种在 Pod 中创建的空目录,用于在容器之间共享文件。EmptyDir 的数据存在于 Pod 所在节点的本地磁盘上,当 Pod 被删除时,数据也会被删除。这种存储方式适用于需要临时存储数据的场景,如缓存数据。
  • HostPath:HostPath 卷将主机节点上的文件系统路径挂载到容器中。这种存储卷通常用于测试和开发环境,因为它直接将宿主机的文件系统暴露给容器,存在安全风险,因此不建议在生产环境中使用。
  1. 持久存储
  • NFS:NFS 卷将网络文件系统(NFS)挂载到容器中。这种存储卷可以跨多个 Pod 和节点共享数据,适用于需要共享数据的分布式系统。
  • PersistentVolume (PV)PersistentVolumeClaim (PVC):PV 是一种由管理员配置的存储资源,而 PVC 是用户请求的存储资源。PVC 允许用户抽象地请求存储资源,而不需要关心具体的存储后端。PV 和 PVC 的结合使用,可以动态地分配和释放存储资源,提高存储的灵活性和可管理性。
  • ConfigMapSecret:ConfigMap 和 Secret 卷将配置文件和密钥挂载到容器中。这种存储卷可以用于配置 Pod 中的应用程序或存储敏感数据,如数据库密码等。
  • StatefulSet:StatefulSet 卷是一种特殊的 PVC 卷,它可以为有状态应用程序提供稳定的、持久的存储。StatefulSet 卷会为每个 Pod 分配唯一的持久卷,并且可以按照顺序启动和关闭 Pod,适用于需要持久化存储状态的有状态应用程序。

二、K8S存储插件

除了上述基本的存储类型外,K8S还支持动态存储卷和CSI(Container Storage Interface)存储插件。

  • 动态存储卷:是一种自动化管理存储资源的方法,它可以根据需求动态地创建和删除存储卷。这种存储方式提高了存储资源的利用率和灵活性。
  • CSI 存储插件:是一种标准化的存储插件接口,它可以与多种不同类型的存储后端集成。通过 CSI 存储插件,K8S 可以支持更多的存储解决方案,满足用户多样化的存储需求。

三、K8S存储应用场景

K8S的存储可以应用于多种场景,包括但不限于:

  • 持久化数据:如数据库、文件系统等需要持久化存储数据的场景。
  • 分布式存储:如分布式数据库、分布式文件系统等需要跨多个节点共享数据的场景。
  • 日志和监控:将日志和监控数据存储在持久存储卷中,以便在容器被删除或重新启动后继续存在。
  • 静态资源:如Web应用程序中的图像、CSS文件和JavaScript文件等静态资源。
  • 大数据分析:在大数据分析中,需要处理大量的数据,可以使用K8S中的大数据存储来存储和管理数据。

四、总结

K8S提供了丰富的存储方式来满足不同场景下的存储需求。用户可以根据实际需求选择合适的存储类型,并通过动态存储卷和CSI存储插件等高级功能来提高存储的灵活性和可管理性。同时,K8S的存储也可以应用于多种场景,帮助用户更好地管理和存储数据。

存储

EmptyDir

EmptyDir是一种在Pod中创建的空目录,用于在容器之间共享文件。它在Pod被调度到节点上时创建,并在Pod从节点上删除时被销毁。

  1. 特性
  • 临时性:EmptyDir卷的生命周期与Pod相同。当Pod被删除时,EmptyDir中的数据也会被清除。
  • 共享性:Pod中的所有容器都可以读写EmptyDir卷,这使得它适合用作共享存储。
  • 性能:由于数据存储在节点的本地存储上,EmptyDir卷通常具有较高的性能。
  • 数据持久性:EmptyDir卷不提供持久化存储,所有数据在Pod终止时都会丢失。
  1. 应用场景
  • 应用程序的临时工作空间:EmptyDir可以作为应用程序运行时的临时文件存储区,如缓存数据或临时文件。
  • 容器间共享数据:在Pod内部,不同的容器可能需要共享某些数据。EmptyDir卷提供了一个方便的方式来实现这一需求。
  • 检查点或恢复点:对于耗时较长的计算任务,EmptyDir可以用作检查点或恢复点,以便在任务中断后能够恢复执行。
  1. 示例
apiVersion: v1  
kind: Pod  
metadata:  
  name: pod-with-emptydir  
spec:  
  containers:  
  - name: container1  
    image: nginx  
    volumeMounts:  
    - name: emptydir-volume  
      mountPath: /var/www/html  
  - name: container2  
    image: busybox  
    command: ["/bin/sh", "-c", "sleep 3600"]  
    volumeMounts:  
    - name: emptydir-volume  
      mountPath: /data  
  volumes:  
  - name: emptydir-volume  
    emptyDir: {}

注意:

  1. 数据丢失风险:由于EmptyDir卷不提供持久化存储,因此当Pod被删除时,存储在其中的数据也会丢失。对于需要持久化的数据,应该使用PersistentVolume(PV)和PersistentVolumeClaim(PVC)等持久化存储解决方案。
  2. 空间限制:EmptyDir卷的大小可能受到节点上可用存储空间的限制。因此,在配置EmptyDir卷时,需要考虑节点的存储容量。
  3. 节点故障:如果节点发生故障,并且Pod需要被重新调度到其他节点上,存储在EmptyDir卷中的数据将不会保留。这是因为EmptyDir卷是绑定到特定节点的。

HostPath

HostPath卷将节点上的文件或目录挂载到Pod中,使得Pod可以直接访问这些文件或目录。这种挂载方式适用于需要将Pod与宿主机上的文件系统紧密集成的场景。

  1. 特性
    1. 直接访问宿主机文件系统:HostPath卷允许Pod直接访问节点上的文件系统,这可以用于特定的应用场景,如日志收集、数据库存储等。
    2. 数据持久性:与EmptyDir不同,HostPath卷中的数据不会随着Pod的删除而丢失(除非节点上的数据也被删除)。因此,它提供了一种数据持久化的方式。
    3. 节点依赖性:由于HostPath卷直接挂载到节点上的文件系统,因此它依赖于特定的节点。如果Pod被重新调度到其他节点,它将无法访问之前节点上的HostPath卷。
  2. 应用场景
    1. 日志收集:将Pod中的日志文件写入到节点上的特定目录中,然后通过日志收集工具(如Fluentd、Logstash等)进行统一收集和处理。
    2. 数据库存储:对于一些轻量级的数据库应用(如Redis、Memcached等),可以使用HostPath卷来存储数据。但需要注意的是,这种方式存在数据丢失的风险(如果节点故障或数据未被备份)。
    3. 应用依赖:如果Pod中的应用需要访问节点上的特定文件或目录(如配置文件、密钥文件等),可以使用HostPath卷来实现。
  3. 示例
apiVersion: v1  
kind: Pod  
metadata:  
  name: pod-with-hostpath  
spec:  
  containers:  
  - name: redis  
    image: redis:7-alpine  
    volumeMounts:  
    - name: redis-data  
      mountPath: /data  
  volumes:  
  - name: redis-data  
    hostPath:  
      path: /data/redis  
      type: DirectoryOrCreate

注意:

  1. 数据丢失风险:由于HostPath卷直接挂载到节点上的文件系统,因此当节点发生故障或数据未被备份时,存储在其中的数据可能会丢失。
  2. 节点依赖性:如前所述,HostPath卷依赖于特定的节点。如果Pod被重新调度到其他节点,它将无法访问之前节点上的HostPath卷。
  3. 安全性问题:由于Pod可以直接访问节点上的文件系统,因此可能会带来安全性问题。需要确保Pod中的容器不会恶意访问或修改节点上的敏感数据。

NFS

NFS是一种分布式文件系统协议,允许系统通过网络与其他系统共享目录和文件。在K8S中,NFS存储可以用于实现数据的持久化和共享,解决Pod在重建或重新调度到其他节点时无法访问原有数据的问题。

  1. 创建PersistentVolume(PV)
    PV是K8S中用于描述持久化存储资源的对象。要使用NFS存储,需要创建指向NFS共享目录的PV。PV的YAML配置文件示例如下:
apiVersion: v1  
kind: PersistentVolume  
metadata:  
  name: nfs-pv  
spec:  
  capacity:  
    storage: 10Gi  
  accessModes:  
    - ReadWriteMany  
  nfs:  
    path: /path/to/nfs/share  
    server: nfs-server-ip  
  persistentVolumeReclaimPolicy: Retain

在这个示例中,nfs.path指定了NFS共享目录的路径,nfs.server指定了NFS服务器的IP地址。accessModes定义了PV的访问模式,ReadWriteMany表示多个节点可以同时读写。
2. 创建PersistentVolumeClaim(PVC)
PVC是用户对存储资源的请求。创建PVC时,需要指定所需的存储大小和访问模式,以便K8S能够找到匹配的PV进行绑定。PVC的YAML配置文件示例如下:

apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
  name: nfs-pvc  
spec:  
  accessModes:  
    - ReadWriteMany  
  resources:  
    requests:  
      storage: 5Gi  
  storageClassName: "" # 如果使用了StorageClass,则需要指定

在这个示例中,PVC请求了5Gi的存储空间,并指定了访问模式为ReadWriteMany。
3. 在Pod中使用PVC
一旦PVC与PV成功绑定,就可以在Pod的YAML配置文件中通过volumeMounts和volumes字段将PVC挂载到Pod中的容器。示例如下:

apiVersion: v1  
kind: Pod  
metadata:  
  name: my-pod  
spec:  
  containers:  
  - name: my-container  
    image: nginx  
    volumeMounts:  
    - name: nfs-volume  
      mountPath: "/usr/share/nginx/html"  
  volumes:  
  - name: nfs-volume  
    persistentVolumeClaim:  
      claimName: nfs-pvc

在这个示例中,Pod中的容器将/usr/share/nginx/html目录挂载到PVC指定的NFS共享目录上。

PersistentVolume (PV)

PersistentVolume(PV)是一种网络存储资源,它用于在集群中提供持久化存储。PV的生命周期独立于任何使用它的Pod,这使得它成为存储数据的理想选择,特别是当Pod被删除或重新调度时,数据仍然可以保留。

  1. PV
  • 静态PV:管理员手动创建的PV。它们存在于集群中,等待被用户(通过PersistentVolumeClaim,PVC)请求。
  • 动态PV:当PVC被创建时,如果集群中没有匹配的静态PV,集群可以动态地创建一个新的PV来满足PVC的需求。这通常通过StorageClass来实现。
  1. YAML配置
    PV的YAML配置文件包含了关于存储资源的详细信息,如容量、访问模式、存储类型等。以下是一个简单的PV配置示例:
apiVersion: v1  
kind: PersistentVolume  
metadata:  
  name: example-pv  
spec:  
  capacity:  
    storage: 10Gi  
  volumeMode: Filesystem # 或者 Block  
  accessModes:  
    - ReadWriteOnce  
    # - ReadOnlyMany  
    # - ReadWriteMany  
  persistentVolumeReclaimPolicy: Retain  
  storageClassName: slow  
  nfs:  
    path: /exports  
    server: nfs.example.com

在这个示例中:

  • capacity 指定了PV的存储容量。
  • volumeMode 定义了卷的类型,可以是文件系统(Filesystem)或块设备(Block)。
  • accessModes 定义了PV的访问模式。常见的访问模式包括:
    • ReadWriteOnce:单个节点以读写模式挂载。
    • ReadOnlyMany:多个节点以只读模式挂载。
    • ReadWriteMany:多个节点以读写模式挂载(注意:并非所有类型的存储都支持此模式)。
  • persistentVolumeReclaimPolicy 定义了当PV不再被任何PVC绑定时,其回收策略。常见的策略包括:
    • Retain:保留数据,需要手动清理。
    • Recycle(已弃用):清除数据,但并非所有类型的存储都支持此操作。
    • Delete:删除存储资源,这通常用于动态PV。
  • storageClassName 指定了PV所属的StorageClass(可选)。
  • nfs 是一个特定的存储类型配置,表示这是一个NFS卷,并指定了NFS服务器的地址和共享路径。

注意:

  • 在使用PV时,需要确保集群中的节点能够访问指定的存储资源(例如,NFS服务器必须可从所有节点访问)。
  • 不同的存储类型(如NFS、GlusterFS、AWS EBS等)可能有不同的配置要求和限制。
  • 管理员需要仔细规划PV的容量和回收策略,以避免资源浪费和数据丢失。
  • 动态PV的创建依赖于StorageClass和相应的存储提供者(如云提供商的存储服务)。

PersistentVolumeClaim (PVC)

PersistentVolumeClaim (PVC) 是一种存储请求机制,允许用户声明对存储资源的需求,而无需关心具体的存储后端实现细节。

  1. PVC
  • 定义:PersistentVolumeClaim(PVC)是用户对存储资源的请求。它与Pod类似,Pod消耗节点资源,而PVC消耗PersistentVolume(PV)资源。PVC能够请求特定大小和访问模式的存储资源。
  • 作用:PVC提供了一种抽象层,使得用户能够专注于其应用程序的需求,而无需关心存储系统的具体配置和管理。
  1. PVC与PV的关系
  • 绑定机制:PVC通过标签选择器(label selector)或存储类(StorageClass)与PV进行绑定。当PVC被创建时,Kubernetes会尝试找到一个与PVC请求相匹配的PV,并将其绑定到PVC上。
  • 一对一映射:PVC与PV之间的绑定是一对一的,即一个PVC只能绑定到一个PV上,反之亦然。
  • 访问模式:PVC可以指定所需的访问模式,如ReadWriteOnce(RWO)、ReadWriteMany(RWM)或ReadOnlyMany(ROM)。这些访问模式决定了PV如何被挂载和使用。
  1. 创建与使用
  • 创建PVC:用户通过YAML文件或Kubernetes API创建一个PVC对象,指定所需的存储大小、访问模式和其他相关参数。
  • 自动绑定:当PVC被创建后,Kubernetes会自动查找可用的PV,并根据PVC的请求参数进行匹配和绑定。
  • Pod中使用PVC:一旦PVC与PV绑定成功,用户就可以在Pod的volume配置中引用PVC,从而使用PVC所代表的存储资源。
  1. 回收策略
  • 回收策略:当PVC被删除时,其绑定的PV会根据PVC的回收策略进行处理。常见的回收策略包括Retain(保留)、Recycle(回收)和Delete(删除)。
    • Retain:保留PV和底层存储资源,但PVC的数据仍然保留在PV中,需要手动清理。
    • Recycle:删除PV中的数据,但不删除底层存储资源。需要注意的是,Recycle策略在Kubernetes的后续版本中可能被移除。
    • Delete:删除PV和底层存储资源,同时删除PV中的数据。
  1. 优势
  • 提高存储资源的利用率:通过PVC,用户可以根据实际需求动态申请存储资源,避免了存储资源的浪费。
  • 简化存储管理:PVC提供了一种抽象层,使得用户无需关心存储系统的具体配置和管理,从而简化了存储管理的复杂性。
  • 增强应用程序的可移植性:PVC允许用户在不修改应用程序代码的情况下,将应用程序部署到不同的Kubernetes集群中,并自动适应不同的存储环境。
  1. 样例
apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
  name: my-pvc  
  namespace: default  # 命名空间,这里使用默认命名空间  
spec:  
  accessModes:  
    - ReadWriteOnce  # 访问模式,这里指定为ReadWriteOnce,即卷可以被一个节点以读写方式挂载  
  resources:  
    requests:  
      storage: 1Gi  # 请求的存储大小为1GiB  
  storageClassName: manual  # 存储类名称,这里假设使用名为'manual'的存储类,或者如果不指定storageClassName,则使用默认存储类  
  volumeMode: Filesystem  # 卷模式,这里指定为文件系统模式

说明:

  1. apiVersion: 指定Kubernetes API的版本,这里为v1。
  2. kind: 指定资源类型为PersistentVolumeClaim。
  3. metadata: 包含PVC的元数据,如名称和命名空间。
    • name: PVC的名称,这里为my-pvc。
    • namespace: PVC所属的命名空间,这里使用默认命名空间default。
  4. spec: 包含PVC的规格说明。
    • accessModes: 指定PV的访问模式,这里为ReadWriteOnce,表示卷可以被一个节点以读写方式挂载。其他访问模式包括ReadOnlyMany(多个节点只读)和ReadWriteMany(多个节点读写)。
    • resources: 指定PVC所需的资源,这里仅指定了存储资源。
    • requests: 指定PVC请求的存储大小,这里为1Gi。
    • storageClassName: 指定PVC使用的存储类名称。存储类用于动态创建PV。如果不指定,将使用默认存储类(如果存在)。
    • volumeMode: 指定卷的模式,这里为Filesystem,表示文件系统卷。其他模式可能包括Block(块设备卷)。

注意:

  • PVC的创建依赖于PV或存储类的存在。如果指定了storageClassName,Kubernetes将尝试使用相应的存储类动态创建PV。如果没有指定或存储类无法创建PV,PVC将处于Pending状态,直到找到匹配的PV。
  • PVC与PV之间的绑定是自动完成的,但前提是PVC的请求参数(如存储大小、访问模式)与某个PV的规格相匹配。
  • PVC的生命周期与Pod不同步。即使Pod被删除,PVC和绑定的PV仍然存在,除非显式删除PVC。

ConfigMap

ConfigMap是一种用于存储配置数据的API对象,它属于Kubernetes中的核心对象之一。ConfigMap的主要作用是将应用程序的配置信息与容器镜像分离,以便在不重新构建镜像的情况下进行配置的修改和更新。

  1. 定义与特点
  • 定义:ConfigMap用于存储键值对、文本文件或以特定格式组织的配置文件,如环境变量、命令行参数等。
  • 特点
    • 解耦:将配置数据与应用程序分离,提高应用的可移植性和可维护性。
    • 灵活性:支持多种数据格式,包括键值对、文本文件等。
    • 集中管理:提供一个集中管理和传递配置信息的机制,便于统一管理配置数据。
  1. 用途
  • 环境变量:ConfigMap可以作为环境变量注入到Pod中的容器中,供应用程序使用。
  • 配置文件:ConfigMap还可以将文件直接挂载到Pod的容器内部,使应用程序可以直接读取这些配置文件。
  1. 示例
  • 创建ConfigMap
    假设有一个名为my-config的ConfigMap,里面包含了一些键值对数据,YAML文件定义如下:
apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: my-config  
data:  
  config.properties: |  
    key1=value1  
    key2=value2
  • 将ConfigMap挂载为文件
    在Pod的YAML文件中,可以将上面创建的ConfigMap挂载为文件。示例如下:
apiVersion: v1  
kind: Pod  
metadata:  
  name: my-pod  
spec:  
  containers:  
  - name: my-container  
    image: nginx  
    volumeMounts:  
    - name: config-volume  
      mountPath: /etc/config  
  volumes:  
  - name: config-volume  
    configMap:  
      name: my-config
  • 将ConfigMap作为环境变量
    同样,也可以在Pod的YAML文件中将ConfigMap中的数据作为环境变量注入到容器中。示例如下:
apiVersion: v1  
kind: Pod  
metadata:  
  name: my-pod-with-env  
spec:  
  containers:  
  - name: my-container  
    image: nginx  
    env:  
    - name: SOME_KEY  
      valueFrom:  
        configMapKeyRef:  
          name: my-config  
          key: key1

Secret

Secret是一种用于存储敏感信息的对象,如密码、OAuth令牌、ssh密钥等。这些敏感信息通常以Base64编码的形式存储在Secret对象中,以避免在Kubernetes中明文传输,从而提高安全性。

  1. 定义与特点
  • **定义:**Secret用于存储和管理敏感数据,如密码、OAuth令牌和ssh密钥等。
  • 特点:
    • 所有数据都要经过Base64编码。
    • 默认情况下,Kubernetes Secret未加密地存储在API服务器的底层数据存储(etcd)中。
    • 拥有API访问权限的人可以检索或修改Secret,因此需要通过其他方式(如静态加密、RBAC规则等)来增强安全性。
  1. 类型
    Kubernetes提供了多种类型的Secret,每种类型都适用于不同的场景:
  • Opaque:用于存储任意类型的数据,最常见的是用于存储密码、密钥等。它不对数据内容进行解释或编码,只要求value是Base64编码的字符串。
  • kubernetes.io/service-account-token:由Kubernetes自动创建,用于向Pod中的Service Account提供API访问令牌。
  • kubernetes.io/dockerconfigjson:用于存储私有Docker Registry的认证信息。
  • TLS:用于存储TLS证书和私钥,用于加密Pod之间的通信
  1. 使用方式
    Pod可以通过以下方式使用Secret:
  2. 作为挂载到一个或多个容器中的存储卷中的文件:
  • 将Secret挂载为Pod中的Volume,容器可以通过文件路径访问Secret中的数据。
  1. 作为容器的环境变量:
  • 将Secret中的数据设置为Pod中容器的环境变量,容器可以通过环境变量读取Secret中的数据。
  1. 由kubelet在拉取容器镜像时使用:
  • 对于存储在私有Docker Registry中的镜像,kubelet在拉取时需要认证信息。可以通过创建kubernetes.io/dockerconfigjson类型的Secret,并在Pod的imagePullSecrets字段中引用该Secret,以实现镜像的拉取。
  1. 安全性
    由于Secret默认未加密地存储在etcd中,因此需要通过以下方式来提高其安全性:
  • 启用静态加密:通过加密插件对etcd中的Secret进行加密存储。
  • 以最小特权访问Secret:通过RBAC(基于角色的访问控制)规则限制对Secret的访问权限。
  • 限制Secret对特定容器的访问:确保只有需要访问Secret的容器才能访问到它。
  • 考虑使用外部Secret存储驱动:将Secret存储在外部安全存储中,以增强安全性。
  1. 样例
  • 创建Secret
    • Base64编码
echo -n 'admin' | base64  # 输出: YWRtaW4=  
echo -n 'password123' | base64  # 输出: cGFzc3dvcmQxMjM=
- YAML文件来定义
apiVersion: v1  
kind: Secret  
metadata:  
  name: my-secret  
type: Opaque  
data:  
  username: YWRtaW4=  
  password: cGFzc3dvcmQxMjM=
- 执行
kubectl apply -f my-secret.yaml
  • 使用Secret
    1. 作为挂载的Volume
      可以将Secret挂载为Pod中的一个Volume,容器可以通过文件路径访问Secret中的数据。以下是一个Pod的YAML文件示例,展示了如何将my-secret挂载为Volume:
apiVersion: v1  
kind: Pod  
metadata:  
  name: my-pod  
spec:  
  containers:  
  - name: my-container  
    image: nginx  
    volumeMounts:  
    - name: secret-volume  
      mountPath: "/etc/secret-data"  
      readOnly: true  
  volumes:  
  - name: secret-volume  
    secret:  
      secretName: my-secret

在这个例子中,my-secret被挂载到Pod的/etc/secret-data目录下,容器中的进程可以通过读取该目录下的文件来访问Secret中的数据。
2. 作为环境变量
将Secret中的数据设置为Pod中容器的环境变量。以下是一个Pod的YAML文件示例,展示了如何设置环境变量:

apiVersion: v1  
kind: Pod  
metadata:  
  name: my-pod-with-env  
spec:  
  containers:  
  - name: my-container  
    image: nginx  
    env:  
    - name: MY_USERNAME  
      valueFrom:  
        secretKeyRef:  
          name: my-secret  
          key: username  
    - name: MY_PASSWORD  
      valueFrom:  
        secretKeyRef:  
          name: my-secret  
          key: password

在这个例子中,my-secret中的username和password分别被设置为Pod中容器的环境变量MY_USERNAME和MY_PASSWORD。容器中的进程可以通过读取这些环境变量来访问Secret中的数据。

StatefulSet

StatefulSet是一种用于管理有状态应用的资源对象。与Deployment和ReplicaSet等无状态服务的管理方式不同,StatefulSet提供了对Pod集合的有序部署、扩缩、更新和删除,以及持久化存储的支持。
一. 概念
StatefulSet是Kubernetes中的一个核心概念,用于管理有状态应用的Pod部署和伸缩。它主要用于部署需要持久化存储和唯一标识的应用,如数据库、消息队列等。StatefulSet为每个Pod实例分配一个唯一的标识符,并根据这个标识符进行有序的创建、更新和删除操作。
二. 特点

  • 稳定的网络标识符:StatefulSet中的每个Pod都有一个稳定的网络标识符(如DNS名称),这使得它们可以方便地被其他应用或服务引用。
  • 有序部署和扩展:StatefulSet保证Pod的部署和扩展是按照确定的顺序进行的,这对于需要按顺序启动和停止的应用程序非常重要。
  • 持久化存储:StatefulSet支持使用持久化卷(PersistentVolume)来存储Pod的状态数据,确保即使Pod被重新调度到其他节点,其状态数据也不会丢失。
  • 自主管理的标识符:StatefulSet可以为每个Pod分配一个自主管理的标识符,这些标识符在Pod重新启动或重新调度后保持不变。
    三. 组成
    三个部分组成:
  1. Headless Service:无头服务,用于为StatefulSet中的Pod提供DNS解析。Headless Service没有Cluster IP,它通过DNS记录为每个Pod提供一个可解析的域名。
  2. StatefulSet Controller:StatefulSet控制器,负责根据StatefulSet的定义来管理Pod的创建、更新、删除等操作。
  3. VolumeClaimTemplate:卷申请模板,用于为StatefulSet中的每个Pod生成独立的持久化存储卷(PersistentVolumeClaim)。
    四、示例
    以下是一个使用StatefulSet来部署MySQL数据库的示例,包括存储的配置:
apiVersion: apps/v1  
kind: StatefulSet  
metadata:  
  name: mysql-statefulset  
spec:  
  serviceName: mysql  
  replicas: 3  
  selector:  
    matchLabels:  
      app: mysql  
  template:  
    metadata:  
      labels:  
        app: mysql  
    spec:  
      containers:  
      - name: mysql-container  
        image: mysql:latest  
        ports:  
        - containerPort: 3306  
        env:  
        - name: MYSQL_ROOT_PASSWORD  
          value: "password"  
        volumeMounts:  
        - name: mysql-storage  
          mountPath: /var/lib/mysql  
  volumeClaimTemplates:  
  - metadata:  
      name: mysql-storage  
    spec:  
      accessModes: ["ReadWriteOnce"]  
      storageClassName: "standard"  
      resources:  
        requests:  
          storage: 1Gi

在这个示例中,volumeClaimTemplates部分定义了每个Pod的持久化存储卷。当StatefulSet创建Pod时,它会为每个Pod生成一个独立的PersistentVolumeClaim(PVC),并请求绑定到一个PersistentVolume(PV)。这样,每个Pod都有自己的专用存储卷,用于存储MySQL数据库的数据。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐