K8S 存储
K8S(Kubernetes)的存储是容器化应用程序中非常重要的一部分,它帮助用户在不同场景下管理和存储数据。K8S提供了多种存储方式,以满足不同的存储需求。以下是对K8S存储的详细解析:
一、K8S存储类型
K8S的存储类型主要分为两大类:临时存储和持久存储。
- 临时存储
- EmptyDir:EmptyDir 是一种在 Pod 中创建的空目录,用于在容器之间共享文件。EmptyDir 的数据存在于 Pod 所在节点的本地磁盘上,当 Pod 被删除时,数据也会被删除。这种存储方式适用于需要临时存储数据的场景,如缓存数据。
- HostPath:HostPath 卷将主机节点上的文件系统路径挂载到容器中。这种存储卷通常用于测试和开发环境,因为它直接将宿主机的文件系统暴露给容器,存在安全风险,因此不建议在生产环境中使用。
- 持久存储
- NFS:NFS 卷将网络文件系统(NFS)挂载到容器中。这种存储卷可以跨多个 Pod 和节点共享数据,适用于需要共享数据的分布式系统。
- PersistentVolume (PV) 和 PersistentVolumeClaim (PVC):PV 是一种由管理员配置的存储资源,而 PVC 是用户请求的存储资源。PVC 允许用户抽象地请求存储资源,而不需要关心具体的存储后端。PV 和 PVC 的结合使用,可以动态地分配和释放存储资源,提高存储的灵活性和可管理性。
- ConfigMap 和 Secret: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从节点上删除时被销毁。
- 特性
- 临时性:EmptyDir卷的生命周期与Pod相同。当Pod被删除时,EmptyDir中的数据也会被清除。
- 共享性:Pod中的所有容器都可以读写EmptyDir卷,这使得它适合用作共享存储。
- 性能:由于数据存储在节点的本地存储上,EmptyDir卷通常具有较高的性能。
- 数据持久性:EmptyDir卷不提供持久化存储,所有数据在Pod终止时都会丢失。
- 应用场景
- 应用程序的临时工作空间:EmptyDir可以作为应用程序运行时的临时文件存储区,如缓存数据或临时文件。
- 容器间共享数据:在Pod内部,不同的容器可能需要共享某些数据。EmptyDir卷提供了一个方便的方式来实现这一需求。
- 检查点或恢复点:对于耗时较长的计算任务,EmptyDir可以用作检查点或恢复点,以便在任务中断后能够恢复执行。
- 示例
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: {}
注意:
- 数据丢失风险:由于EmptyDir卷不提供持久化存储,因此当Pod被删除时,存储在其中的数据也会丢失。对于需要持久化的数据,应该使用PersistentVolume(PV)和PersistentVolumeClaim(PVC)等持久化存储解决方案。
- 空间限制:EmptyDir卷的大小可能受到节点上可用存储空间的限制。因此,在配置EmptyDir卷时,需要考虑节点的存储容量。
- 节点故障:如果节点发生故障,并且Pod需要被重新调度到其他节点上,存储在EmptyDir卷中的数据将不会保留。这是因为EmptyDir卷是绑定到特定节点的。
HostPath
HostPath卷将节点上的文件或目录挂载到Pod中,使得Pod可以直接访问这些文件或目录。这种挂载方式适用于需要将Pod与宿主机上的文件系统紧密集成的场景。
- 特性
- 直接访问宿主机文件系统:HostPath卷允许Pod直接访问节点上的文件系统,这可以用于特定的应用场景,如日志收集、数据库存储等。
- 数据持久性:与EmptyDir不同,HostPath卷中的数据不会随着Pod的删除而丢失(除非节点上的数据也被删除)。因此,它提供了一种数据持久化的方式。
- 节点依赖性:由于HostPath卷直接挂载到节点上的文件系统,因此它依赖于特定的节点。如果Pod被重新调度到其他节点,它将无法访问之前节点上的HostPath卷。
- 应用场景
- 日志收集:将Pod中的日志文件写入到节点上的特定目录中,然后通过日志收集工具(如Fluentd、Logstash等)进行统一收集和处理。
- 数据库存储:对于一些轻量级的数据库应用(如Redis、Memcached等),可以使用HostPath卷来存储数据。但需要注意的是,这种方式存在数据丢失的风险(如果节点故障或数据未被备份)。
- 应用依赖:如果Pod中的应用需要访问节点上的特定文件或目录(如配置文件、密钥文件等),可以使用HostPath卷来实现。
- 示例
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
注意:
- 数据丢失风险:由于HostPath卷直接挂载到节点上的文件系统,因此当节点发生故障或数据未被备份时,存储在其中的数据可能会丢失。
- 节点依赖性:如前所述,HostPath卷依赖于特定的节点。如果Pod被重新调度到其他节点,它将无法访问之前节点上的HostPath卷。
- 安全性问题:由于Pod可以直接访问节点上的文件系统,因此可能会带来安全性问题。需要确保Pod中的容器不会恶意访问或修改节点上的敏感数据。
NFS
NFS是一种分布式文件系统协议,允许系统通过网络与其他系统共享目录和文件。在K8S中,NFS存储可以用于实现数据的持久化和共享,解决Pod在重建或重新调度到其他节点时无法访问原有数据的问题。
- 创建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被删除或重新调度时,数据仍然可以保留。
- PV
- 静态PV:管理员手动创建的PV。它们存在于集群中,等待被用户(通过PersistentVolumeClaim,PVC)请求。
- 动态PV:当PVC被创建时,如果集群中没有匹配的静态PV,集群可以动态地创建一个新的PV来满足PVC的需求。这通常通过StorageClass来实现。
- 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) 是一种存储请求机制,允许用户声明对存储资源的需求,而无需关心具体的存储后端实现细节。
- PVC
- 定义:PersistentVolumeClaim(PVC)是用户对存储资源的请求。它与Pod类似,Pod消耗节点资源,而PVC消耗PersistentVolume(PV)资源。PVC能够请求特定大小和访问模式的存储资源。
- 作用:PVC提供了一种抽象层,使得用户能够专注于其应用程序的需求,而无需关心存储系统的具体配置和管理。
- PVC与PV的关系
- 绑定机制:PVC通过标签选择器(label selector)或存储类(StorageClass)与PV进行绑定。当PVC被创建时,Kubernetes会尝试找到一个与PVC请求相匹配的PV,并将其绑定到PVC上。
- 一对一映射:PVC与PV之间的绑定是一对一的,即一个PVC只能绑定到一个PV上,反之亦然。
- 访问模式:PVC可以指定所需的访问模式,如ReadWriteOnce(RWO)、ReadWriteMany(RWM)或ReadOnlyMany(ROM)。这些访问模式决定了PV如何被挂载和使用。
- 创建与使用
- 创建PVC:用户通过YAML文件或Kubernetes API创建一个PVC对象,指定所需的存储大小、访问模式和其他相关参数。
- 自动绑定:当PVC被创建后,Kubernetes会自动查找可用的PV,并根据PVC的请求参数进行匹配和绑定。
- Pod中使用PVC:一旦PVC与PV绑定成功,用户就可以在Pod的volume配置中引用PVC,从而使用PVC所代表的存储资源。
- 回收策略
- 回收策略:当PVC被删除时,其绑定的PV会根据PVC的回收策略进行处理。常见的回收策略包括Retain(保留)、Recycle(回收)和Delete(删除)。
- Retain:保留PV和底层存储资源,但PVC的数据仍然保留在PV中,需要手动清理。
- Recycle:删除PV中的数据,但不删除底层存储资源。需要注意的是,Recycle策略在Kubernetes的后续版本中可能被移除。
- Delete:删除PV和底层存储资源,同时删除PV中的数据。
- 优势
- 提高存储资源的利用率:通过PVC,用户可以根据实际需求动态申请存储资源,避免了存储资源的浪费。
- 简化存储管理:PVC提供了一种抽象层,使得用户无需关心存储系统的具体配置和管理,从而简化了存储管理的复杂性。
- 增强应用程序的可移植性:PVC允许用户在不修改应用程序代码的情况下,将应用程序部署到不同的Kubernetes集群中,并自动适应不同的存储环境。
- 样例
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 # 卷模式,这里指定为文件系统模式
说明:
- apiVersion: 指定Kubernetes API的版本,这里为v1。
- kind: 指定资源类型为PersistentVolumeClaim。
- metadata: 包含PVC的元数据,如名称和命名空间。
- name: PVC的名称,这里为my-pvc。
- namespace: PVC所属的命名空间,这里使用默认命名空间default。
- 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的主要作用是将应用程序的配置信息与容器镜像分离,以便在不重新构建镜像的情况下进行配置的修改和更新。
- 定义与特点
- 定义:ConfigMap用于存储键值对、文本文件或以特定格式组织的配置文件,如环境变量、命令行参数等。
- 特点:
- 解耦:将配置数据与应用程序分离,提高应用的可移植性和可维护性。
- 灵活性:支持多种数据格式,包括键值对、文本文件等。
- 集中管理:提供一个集中管理和传递配置信息的机制,便于统一管理配置数据。
- 用途
- 环境变量:ConfigMap可以作为环境变量注入到Pod中的容器中,供应用程序使用。
- 配置文件:ConfigMap还可以将文件直接挂载到Pod的容器内部,使应用程序可以直接读取这些配置文件。
- 示例
- 创建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中明文传输,从而提高安全性。
- 定义与特点
- **定义:**Secret用于存储和管理敏感数据,如密码、OAuth令牌和ssh密钥等。
- 特点:
- 所有数据都要经过Base64编码。
- 默认情况下,Kubernetes Secret未加密地存储在API服务器的底层数据存储(etcd)中。
- 拥有API访问权限的人可以检索或修改Secret,因此需要通过其他方式(如静态加密、RBAC规则等)来增强安全性。
- 类型
Kubernetes提供了多种类型的Secret,每种类型都适用于不同的场景:
- Opaque:用于存储任意类型的数据,最常见的是用于存储密码、密钥等。它不对数据内容进行解释或编码,只要求value是Base64编码的字符串。
- kubernetes.io/service-account-token:由Kubernetes自动创建,用于向Pod中的Service Account提供API访问令牌。
- kubernetes.io/dockerconfigjson:用于存储私有Docker Registry的认证信息。
- TLS:用于存储TLS证书和私钥,用于加密Pod之间的通信
- 使用方式
Pod可以通过以下方式使用Secret: - 作为挂载到一个或多个容器中的存储卷中的文件:
- 将Secret挂载为Pod中的Volume,容器可以通过文件路径访问Secret中的数据。
- 作为容器的环境变量:
- 将Secret中的数据设置为Pod中容器的环境变量,容器可以通过环境变量读取Secret中的数据。
- 由kubelet在拉取容器镜像时使用:
- 对于存储在私有Docker Registry中的镜像,kubelet在拉取时需要认证信息。可以通过创建kubernetes.io/dockerconfigjson类型的Secret,并在Pod的imagePullSecrets字段中引用该Secret,以实现镜像的拉取。
- 安全性
由于Secret默认未加密地存储在etcd中,因此需要通过以下方式来提高其安全性:
- 启用静态加密:通过加密插件对etcd中的Secret进行加密存储。
- 以最小特权访问Secret:通过RBAC(基于角色的访问控制)规则限制对Secret的访问权限。
- 限制Secret对特定容器的访问:确保只有需要访问Secret的容器才能访问到它。
- 考虑使用外部Secret存储驱动:将Secret存储在外部安全存储中,以增强安全性。
- 样例
- 创建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
- 作为挂载的Volume
可以将Secret挂载为Pod中的一个Volume,容器可以通过文件路径访问Secret中的数据。以下是一个Pod的YAML文件示例,展示了如何将my-secret挂载为Volume:
- 作为挂载的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重新启动或重新调度后保持不变。
三. 组成
三个部分组成:
- Headless Service:无头服务,用于为StatefulSet中的Pod提供DNS解析。Headless Service没有Cluster IP,它通过DNS记录为每个Pod提供一个可解析的域名。
- StatefulSet Controller:StatefulSet控制器,负责根据StatefulSet的定义来管理Pod的创建、更新、删除等操作。
- 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…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
