当前位置: 首页 > news >正文

K8S 存储

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数据库的数据。

相关文章:

K8S 存储

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

Kafka Manager支持jdk1.8的部署和使用

一、Kafka Manager简介 Kafka Manager 可能是现在能找到的最好的可视化的Kafka管理工具, 感谢Yahoo的开源; 使用Kafka Manager, 基本上之前需要运行Kafka相应命令行工具的工作现在都可以可视化的完成:创建Topic, 调整消息保存时长, Partition数量等等配置;管理Topic, 包括Reas…...

vmware和virtualbox优缺点

vmware和virtualbox优缺点 ,都可以搭建本地虚拟机,他们有什么优缺点,两个都用过 ,本次打算直接用virtualbox搭建本地虚拟机,比较轻量级 VirtualBox的优点: 免费使用:VirtualBox是一…...

[C++进阶]二叉树进阶的一些面试题(一)

首先我们先回忆我们过去学的二叉树和最近学的二叉搜索树,来完成下面的题目: 606. 根据二叉树创建字符串 这道题属于与基础题,首先我们观察输入输出样例可以得到如果root->left为空,root->right不为空时,我们的空格仍然需要保留,如果当前节点有两个孩子,那我…...

【Python单元测试】学习笔记1

文章目录 01-单元测试基础什么是单元测试常用的文件结构运行单元测试 02. 断言函数03. Test Fixtures什么是Test Fixtures模块级别的Fixtures类级别的Fixtures方法级别的Fixtures 04.Mock python单元测试学习笔记1:https://blog.csdn.net/qq_42761751/article/detai…...

NVDLA专题10:具体模块介绍——Planar Data Processor

概述 平面数据处理器(Planar Data Processor, PDP)沿宽x高的前两个维度平面执行操作,在NVDLA版中,PDPD旨在实现池化层,module定义在NV_NVDLA_pdp.v。支持最大、最小和平均池化方法。平面内的几个相邻输入元素将被发送到非线性函数来计算一个…...

面向财商人群的AI垂直产品 —— AI股票助手

在数字化转型的大潮中,AI技术正在重塑各行各业,尤其是金融市场。对于那些渴望在瞬息万变的股市中保持敏锐洞察力的金融分析师、投资者及股票爱好者来说,一款强大而智能的工具显得尤为重要。今天,我们将向大家介绍一款专为财商人群打造的AI垂直产品——AI股票助手。 一、产…...

玩AI第二步——python 环境安装

python 环境安装 前言 通常,我们会直接去python官网下载一个安装包直接安装即可. 但是这样很不好,总不能把所有版本的python都安装一遍 所以,这里安装minconda,是一个轻量级的Python环境管理工具,仅包括conda、Python及其所需的基本依赖库。因此,它的…...

【图解秒杀系列】秒杀技术点——静态化

【图解秒杀系列】秒杀技术点——静态化 什么是静态化、静态化的作用如何实现静态化FreeMarker、Thymleaf处理流程问题 OpenResty Lualua_shared_dict & lua-resty-template处理流程具体操作 什么是静态化、静态化的作用 静态化就是指通过某种静态化技术,将原本…...

Simple RPC - 05 从零开始设计一个客户端(下)_ 依赖倒置和SPI

文章目录 Pre概述依赖倒置原则与解耦设计与实现1. 定义接口来隔离调用方与实现类2. 实现类DynamicStubFactory3. 调用方与实现类的解耦 依赖注入与SPI的解耦依赖注入SPI(Service Provider Interface) 总结 Pre Simple RPC - 01 框架原理及总体架构初探 …...

2024新型数字政府综合解决方案(三)

新型数字政府综合解决方案通过融合人工智能、大数据和云计算技术,建立了一个智能化、互联互通的政府服务平台,旨在提升政府服务效率与透明度。该方案通过全面数字化政务流程,实现数据的实时共享和自动化处理,使公众能够便捷地访问…...

计算机毕业设计hadoop+spark+hive知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习

流程: 1.Python采集网易云音乐歌手、歌词、音乐、评论等约10-20万海量数据,存入mysql数据库; 2.使用pandasnumpy/MapReduce对mysql中四类数据进行数据清洗,写入.csv文件并上传至hdfs(含评论NLP文本分类/lsm情感分析); 3.使用hive建…...

值类型与引用类型

值类型 在Swift中,如果一个对象是用struct实现的,则该对象为值类型,在被赋值给常量或者变量时或者作为参数传递给函数时,值类型总是被复制,复制后的对象与之前的对象指向不同的内存。 Swift的基本类型(Array、Dictio…...

C++STL初阶(12):stack和queue的初阶实现

1. stack的选型 对于栈的实现是我们非常熟悉的过程: C语言基础数据结构——栈和队列_栈和队列 插入取出数据-CSDN博客 _top表示下标,_capacity表示空间大小: 那么按照我们原来的思路,利用_top和_capacity T*来给stack构形。 temp…...

汽车IVI中控OS Linux driver开发实操(二十三):驱动的设备probe及匹配

第一个函数:probe linux驱动模型是分成三个部分的,设备(结构体device),驱动(结构体device_driver),总线(结构体bus_type)。在Linux内核中,设备驱动通常会实现一个probe函数,它是...

华为od(D卷)二叉树计算

文章目录 题目描述输入描述输出描述示例1思路代码 题目描述 给出一个二叉树如下图所示: 6/ \7 9\ / -2 6 请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 20 (7-296)/ \-2 6\ / 0 0 左子树…...

技术爱好者完全用台式机部件定制游戏笔记本电脑

高端笔记本电脑的功能强大到令人难以置信的地步,但大多数笔记本电脑在至少几个关键性能方面仍然落后于台式机。一位 YouTuber 对这种情况感到厌倦,为了抹除这种差距,他开始了为期 14 个月的旅程,使用真正的台式机硬件打造自己的笔…...

100个练习学习Rust!if・Panic・演练

之前的文章 【0】准备 【1】构文・整数・变量 ← 上回 【2】 if・Panic・演练 ← 本次 这是“100 Exercise To Learn Rust”的第2次练习!本次的主题包括 if 表达式、panic 机制,以及对前面内容的总结练习。 本次相关的页面如下: 2.3. Bran…...

MODELSIM仿真报错解决记录

目录 问题:Modelsim报错:Error (10228): Verilog HDL error at Line_Shift_RAM_1Bit.v(39): module “Line_Shift_RAM_1 原因:创建的IP核放到了别的位置 解决方法:删掉IP核以及QIP等文件,将IP核创建到工程目录下 问…...

day33-负载均衡实战

01.问题总结 1.rsync同步注意目录加/和不加/的区别 2.安装wordpress过程中禁止使用IP安装,解析成域名安装 比如安装过程 10.0.0.7--->填写数据库信息--->写入数据库中 如果安装完成后再使用www.wp.com访问,不能访问页面乱码的问题。 3.挂载wordpress挂载uplo…...

网络接口 eno1 未连接或未托管

网络接口 eno1 未连接或未托管,通常意味着该接口没有被识别或没有被配置为自动连接到网络。以下是一些可能的解决方案: 检查物理连接: 确保您的以太网电缆正确连接到 eno1 接口和调制解调器/路由器。 启用网络接口: 使用以下命令…...

Linux I/O 多路复用机制详解

文章目录 1 文件描述符(File Descriptor)1.1 什么是文件描述符?1.2 文件描述符与文件的关系 2 文件描述符集合(File Descriptor Set)2.1 什么是文件描述符集合?2.2 fd_set 结构体 3 select() 函数的工作原理…...

第43课 Scratch入门篇:雪花随风飘

雪花随风飘 故事背景: 雪花轻轻地从灰蒙蒙的天空中飘落下来,它们像是天空中飘洒下来的羽毛,又像是冬日的精灵在翩翩起舞。每一片雪花都独一无二,它们在空中旋转、飘荡,最终缓缓降落在屋顶、树枝、街道和行人的肩头。 程序原理: 众多的雪花肯定是克隆功能,降落过程是通过…...

VueUse 基于 Vue 3 Composition API 的高质量 Hooks 库

VueUse 是什么? VueUse 是基于 Vue 3 Composition API 的高质量 Hooks 库。例如获取滚动的距离 VueUse 官网:VueUse | VueUse VueUse 什么使用? 1、通过npm安装 VueUse npm i @vueuse/core 2、搜索需要使用的函数,例如搜索 useScroll 滚动 3、使用useScroll 滚动函数 …...

ARM CoreLink 系列 5.1.1 -- CI-700 System Address Map 】

文章目录 System Address MapRN SAMRN SAM memory regions and target typesSAM memory region size configurationRN SAM target ID selectionSystem Address Map 所有的CHI 命令都包含一个 Source ID 和 Target ID, 其中 Source ID 可以来自于 RN Node, Target ID 可以来自…...

【数据结构】二叉树(一)

目录 1. 树型结构 概念 树的表示形式 ​编辑 2. 二叉树(重点) 2.1 概念 2.2 二叉树的性质 2.3 二叉树的存储 2.4 二叉树的遍历 前中后序遍历 层序遍历: 2.5二叉树的基本操作 本篇主要理解树和二叉树相关概念,二叉树遍…...

使用duplicate搭建备库或者级联备库

使用duplicate搭建备库或者级联备库: 主库或者源端: 1. 创建pfile,更改&添加部分参数、传输到备库; 2. 主库(或者源端)的tnsnames.ora文件添加 备库的连接信息 备库: 1. 备库添加静态监听 2…...

【存储学习笔记】4:快照(Snapshot)技术的实现方式

1 快照 1.1 动机 在上一篇《备份》里提到,热备份就是在执行操作时,服务器需要正常处理来自用户或应用对数据的更新,这样能够保证数据7*24小时可用(在很多服务里这是必要的)。 而热备份的困难就是如何保证数据的一致…...

数根(字符串数根公式)

公式&#xff1a;a的数根(a-1)%91&#xff1b; #include <bits/stdc.h> using namespace std; string s; long long sum; int main(){cin>>s;for(int i0;i<s.size();i){sums[i]-0;}cout<<(sum-1)%91; }...

C语言之文件操作上卷(二十一)(逆行人生-2024)

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; ✏️作者主页&#xff1a;枫霜剑客 &#x1f4cb; 系列专栏&#xff1a;C语言知识学习归纳总结&#xff08;逐梦篇专栏合集&#xff09; &#x1f332;上一篇: C语…...

【微服务架构实战】结合实际案例进行微服务架构的设计与实现

微服务架构实战 结合实际案例进行微服务架构的设计与实现 引言 微服务架构&#xff08;Microservices Architecture&#xff09;是一种将大型应用程序拆分成一组小型、独立的服务的方法&#xff0c;每个服务都专注于特定的业务功能&#xff0c;并能够独立开发、部署和扩展。这…...

为什么要有二级指针

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 之前一直疑问为什么要有二级指针&#xff0c;一直没有写这个帖子&#xff0c;今天整理了一下&#xff0c;收获颇丰 二、 2.1 // 增加对二级指针…...

如何保证数据不丢失?(死信队列)

死信队列 1、什么是死信 死信通常是消息在特定的场景下表现&#xff1a; 消息被拒绝访问消费者发生异常&#xff0c;超过重试次数消息的Expiration过期时长或者队列TTL过期时间消息队列到达最大容量 maxLength 2、什么是死信队列 只由死信构成的消息队列是死信队列 死信队…...

树莓派开发笔记01-树莓派的系统烧录以及初次开机配置

github主页&#xff1a;https://github.com/snqx-lqh gitee主页&#xff1a;https://gitee.com/snqx-lqh 本项目github地址&#xff1a;https://github.com/snqx-lqh/RaspberryPiLearningNotes 本项目gitee地址&#xff1a;https://gitee.com/snqx-lqh/RaspberryPiLearningNote…...

微信答题小程序产品研发-后端开发

在开发答题小程序的后端服务和数据库设计时&#xff0c;需要考虑API的设计、数据库模型的构建以及数据的安全性和一致性。 这里我采用了云开发&#xff0c;后端语言是Node&#xff0c;数据库是NoSql&#xff0c;然后我简单整理了各个功能模块的后端开发概要和数据库设计。 1. …...

回溯算法——LeetCode37 解数独

题目 力扣题目链接 思路 卡哥的思路&#xff0c;注意看他解释为什么是“二维回溯”。我的思路&#xff0c;类似y总解决 N 皇后问题时的第二种方法&#xff0c;即从左上到右下枚举棋盘的每个位置。 至于为什么与 N 皇后问题不一样&#xff0c;我认为是因为它每一行不止放一个…...

【CPP】继承语法详解与菱形继承

关于我&#xff1a; 睡觉待开机&#xff1a;个人主页 个人专栏: 《优选算法》《C语言》《CPP》 生活的理想&#xff0c;就是为了理想的生活! 作者留言 PDF版免费提供&#xff1a;倘若有需要&#xff0c;想拿我写的博客进行学习和交流&#xff0c;可以私信我将免费提供PDF版。…...

数据结构(6.2_1)——领接矩阵法

图的存储——邻接矩阵法 邻接矩阵&#xff08;Adjacency Matrix&#xff09;是一种使用二维数组来表示图的方法。在这种表示法中&#xff0c;矩阵的行和列都对应图的顶点。 特点 对于无向图&#xff0c;如果顶点i与顶点j之间有边&#xff0c;则矩阵的第i行第j列&#xff08;…...

诈骗未成功是否构成犯罪?

诈骗未成功不一定构成犯罪。在刑法上&#xff0c;构成诈骗罪需要满足特定的构成要件&#xff0c;包括有非法占有的目的、实施了虚构事实或隐瞒真相的行为、对方因此陷入错误认识并处分财产、行为人或第三方取得财产、被害人遭受财产损失。如果诈骗行为未能成功&#xff0c;即被…...

网络协议栈应用层的意义(内含思维导图和解析图通俗易懂超易理解)

绪论​&#xff1a; “节省时间的方法就是全力以赴的将所要做的事情完美快速的做完&#xff0c;不留返工重新学习的时间&#xff0c;才能省下时间给其他你认为重要的东西。” 本章主要讲到OSI网络协议栈中的应用层的作用和再次在应用层的角度理解协议的具体意义&#xff0c;以及…...

【NXP-MCXA153】i2c驱动移植

介绍 ‌I2C总线由飞利浦公司开发&#xff0c;是一种串行单工通信总线&#xff0c;它主要用于连接微控制器和其他外围设备并在总线上的器件之间传送信息&#xff08;需要指定设备地址&#xff09;&#xff1b;常见的i2c设备有EEPROM、触摸屏、各种IoT传感器、时钟模块等&#x…...

C++(11)类语法分析(2)

C(10)之类语法分析(2) Author: Once Day Date: 2024年8月17日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …...

数字验证每日十问--(3)

深拷贝和浅拷贝的区别&#xff1f; 当只拷贝对象中的成员变量和声明的句柄时&#xff0c;称为浅拷贝。浅拷贝只把对象中的句柄复制了&#xff0c;却没有复制句柄b所指向的对象。这会导致复制后&#xff0c;a2中的句柄b 和 a1 中的句柄b指向同一个对象&#xff0c;如果a2中的句…...

22.给定 n 对括号,实现一个算法生成所有可能的正确匹配的括号组合

22. Generate Parentheses 题目 给定 n 对括号,编写一个函数生成所有可能的正确匹配的括号组合。 例如,当 n = 3 时,可能的组合集合为: ["((()))","(()())","(())()","()(())","()()()" ]题目大意 给出 n 代表生成…...

检测到目标URL存在http host头攻击漏洞

漏洞描述 修复措施 方法一&#xff1a; nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求&#xff0c;如果没有显式定义&#xff0c;则会选取第一个定义的 server 作为 default_server。 server { …...

C++奇迹之旅:手写vector模拟实现与你探索vector 容器的核心机制与使用技巧

文章目录 &#x1f4dd;基本框架&#x1f320; 构造和销毁&#x1f309;vector()&#x1f309;vector(const vector& v)&#x1f309;vector(size_t n, const T& value T())&#x1f309;赋值拷贝构造&#xff1a;vector<T>& operator(vector<T> v)&a…...

018、钩子函数 mounted和beforeDestroy、父组件向子组件传递参数 props 的使用

文章目录 1、mounted 和 beforeDestroy1.1、mounted1.2、beforeDestroy 2、父组件向子组件传递参数 props2.1、子组件定义2.2、父组件调用子组件并传参 3、完整例子3.1、父组件 Tags.vue3.2、子组件 TagsMenu.vue3.3、效果图 1、mounted 和 beforeDestroy 1.1、mounted mount…...

xlnt在Windows中的dll,lib生成

前言 花了半天时间想要把xlnt 集成到VS2022 Cmake项目中,以我目前掌握的能力,Cmake语法对于我来说难懂,对于只是使用过Cmake编译MySQL,或是其他lib,dll库的小白来说,不应该为了显示自己能力多么出众,强行去配置一些程序内容。 生活中没有绝对的事情,有舍有得. https://github…...

【网络】私有IP和公网IP的转换——NAT技术

目录 引言 NAT工作机制​编辑 NAT技术的优缺点 优点 缺点 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 引言 公网被子网掩码划分为层状结构&#xff0c;一个公网IP的机器又可以用很多私有IP搭建内网。在日常生活场景中用的都是私有IP&#xff0c;例如手机&#xff0c;…...

java 面试 PDF 资料整理

“尊贵的求知者&#xff0c;作者特此献上精心编纂的Java面试宝典PDF&#xff0c;这份资料凝聚了无数面试精华与实战经验&#xff0c;是通往Java技术殿堂的钥匙。若您渴望在Java编程的求职之路上稳健前行&#xff0c;只需轻轻一点&#xff0c;完成这象征支持与认可的一键三联&am…...