(八)K8S数据持久化存储
EmptyDir是Kubernetes中一种简单的数据卷类型,它提供了一个临时的空目录,可以用于在Pod内部共享文件。EmptyDir卷在Pod被调度到节点上时创建,并且只在Pod的生命周期内存在,当Pod被删除或重新调度时,其中的数据也会被清除。hostPath是Kubernetes中一种常见的卷类型,它允许将主机上的文件或目录直接挂载到Pod中的容器中。这样,容器可以直接访问主机上的文件系统,
1.Volume讲解
概述:
Volume是用于存储容器数据的抽象概念,它可以被挂载到一个或多个Pod中的一个或多个容器中。Volume提供了一种持久性的存储方式,使得容器中的数据可以在容器重启、重新调度或迁移时得以保留。
Kubernetes提供了多种类型的Volume,可以根据不同的需求选择适合的存储方式。以下是一些常见的Volume类型:
- EmptyDir: 在Pod的生命周期内创建一个临时的空目录,可用于容器之间共享临时数据。
- HostPath: 使用Node上的文件系统路径作为存储,可以在多个Pod之间共享数据。
- PersistentVolumeClaim (PVC): 与持久卷 (PersistentVolume) 配合使用,提供持久性的存储,可以在Pod之间共享数据,并支持数据的持久化和动态分配。
- ConfigMap: 用于将配置文件作为Volume挂载到容器中,使得容器可以读取配置信息。
- Secret: 用于将敏感数据(如密码、密钥)作为Volume挂载到容器中,以安全地传递机密信息。
2.EmptyDir使用
概述:
EmptyDir是Kubernetes中一种简单的数据卷类型,它提供了一个临时的空目录,可以用于在Pod内部共享文件。EmptyDir卷在Pod被调度到节点上时创建,并且只在Pod的生命周期内存在,当Pod被删除或重新调度时,其中的数据也会被清除。
创建和使用方式:
以下是使用EmptyDir的示例配置文件,其中将EmptyDir卷挂载到Pod的容器中:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:latest
volumeMounts: # 定义Volume挂载配置
- name: data-volume # 指定Volume的名称
mountPath: /usr/share/nginx/html # 将Volume挂载到容器中的路径
volumes: # 定义Volume配置
- name: data-volume # 指定Volume的名称
emptyDir: {} # 使用EmptyDir类型的Volume
在上面的示例中,我们创建了一个Pod,其中包含一个容器my-container,使用了nginx:latest镜像。在volumeMounts字段中,我们将名为data-volume的Volume挂载到容器中的/usr/share/nginx/html路径上。而在volumes字段中,我们定义了data-volume,使用的是EmptyDir类型的Volume。
这样配置后,Pod启动时会为该容器创建一个临时的空目录作为Volume,并将其挂载到容器中的指定路径上。容器中的应用程序可以使用该路径访问和操作Volume中的数据。
3.hostPath使用
概述:
hostPath是Kubernetes中一种常见的卷类型,它允许将主机上的文件或目录直接挂载到Pod中的容器中。这样,容器可以直接访问主机上的文件系统,并与主机共享数据。
特点:
- 直接访问主机文件系统:hostPath卷类型允许容器直接访问主机上的文件或目录,而无需通过网络或其他中间件。
- 主机依赖性:使用hostPath卷类型的Pod在不同主机之间可能不可移植,因为每个主机上的文件系统结构和内容可能会有所不同。因此,需要确保Pod在部署时选择正确的主机。
- 安全性考虑:由于容器可以访问主机上的文件系统,使用hostPath卷类型需要谨慎处理敏感数据,以防止未经授权的访问。
类型:
- Directory 给定的目录路径必须存在
- DirectoryOrCreate 如果给定路径不存在,将根据需要在那里创建一个空目录
- File 给定路径上必须存在对应文件
- FileOrCreate 如果给定路径不存在,将根据需要在那里创建一个空文件
创建和使用方式:
下面是一个使用hostPath卷的示例:
apiVersion: v1
kind: Pod
metadata:
name: hostpath-example
spec:
containers:
- name: nginx
image: nginx:1.19.10
volumeMounts:
- name: hostpath-volume
mountPath: /data # 将主机上的目录挂载到容器的/data路径下
volumes:
- name: hostpath-volume
hostPath:
path: /var/data # 指定主机上的路径,该路径可以是已存在的目录或将在挂载时创建的目录
type: DirectoryOrCreate # hostPath卷的类型为DirectoryOrCreate,如果路径不存在,则会创建它
在上述示例中,我们创建了一个Pod,其中包含一个nginx容器和一个hostPath卷。hostPath卷被挂载到/data路径下,指定了主机上的/var/data路径作为数据源。hostPath卷的类型为DirectoryOrCreate,这意味着如果主机上的路径不存在,Kubernetes将会自动创建该目录。
请注意,使用hostPath卷需要谨慎操作,因为它直接访问主机的文件系统,并且在多节点集群中可能会导致文件访问不一致的问题。确保在使用hostPath卷时考虑到安全性和数据一致性的问题,并仅在必要的情况下使用它。
对比总结:
emptyDir和hostPath对比:
- 都是本地存储卷方式
- emptyDir是临时存储空间,完全不提供持久化支持;
- hostPath的卷数据是持久化在node节点的文件系统中的,即便pod已经被删除了,volume卷中的数据还留存在node节点上
4.ConfigMap使用(缩写cm)
概述:
ConfigMap 是一个用于存储键值对形式配置数据的 Kubernetes 对象。它可以存储普通的字符串数据,也可以存储以文件形式存储的配置数据。ConfigMap 提供了一种将配置数据与应用程序解耦的方式,使得应用程序可以在不修改代码的情况下引用和使用这些配置数据。
用途:
ConfigMap 可以用于存储各种类型的配置数据,例如环境变量、命令行参数、配置文件、密码等。它可以被容器中的应用程序引用,并在容器启动时注入到应用程序中,从而实现动态配置和灵活性。
创建和使用方式:
-
使用 kubectl create configmap 命令创建 ConfigMap 时,可以通过命令行参数或 YAML 文件指定配置数据。以下是使用命令行参数的示例:
kubectl create configmap my-configmap --from-literal=key1=value1 --from-literal=key2=value2
在这个示例中,我们创建了一个名为 my-configmap 的 ConfigMap,并添加了两个键值对的配置数据。
-
编写包含 ConfigMap 定义的 YAML 文件来创建 ConfigMap。下面是一个创建 ConfigMap 的 YAML 示例:
apiVersion: v1 kind: ConfigMap metadata: name: my-configmap data: key1: value1 key2: value2
在这个示例中,我们创建了一个名为 my-configmap 的 ConfigMap,并定义了两个键值对的配置数据。
-
在 Pod 中使用 ConfigMap:
环境变量注入:可以在 Pod 的容器定义中使用 env 字段来引用 ConfigMap 的键值对作为环境变量。示例如下:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image env: - name: KEY1 valueFrom: configMapKeyRef: name: my-configmap key: key1
在这个示例中,我们在 Pod 的容器定义中引用了 ConfigMap 中的 key1 键,并将其作为环境变量 KEY1 注入到容器中。
-
卷挂载:可以使用 volumes 和 volumeMounts 字段来将 ConfigMap 的配置数据以文件形式挂载到容器中。示例如下:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: my-configmap
在这个示例中,我们创建了一个名为 config-volume 的卷,并将 ConfigMap my-configmap 的配置数据挂载到容器的 /etc/config 目录下。
-
更新 ConfigMap:
命令行方式:使用kubectl edit configmap <configmap-name>
命令来编辑 ConfigMap,并更新其中的键值对配置数据。
YAML 文件方式:编辑 ConfigMap 的 YAML 文件,并使用kubectl apply -f <configmap-file.yaml>
命令来更新 ConfigMap。
更新后的配置数据将自动反映到使用该 ConfigMap 的 Pod 中。
5.Secre使用
概述:
Secret(密钥)是 Kubernetes 中用于存储和管理敏感数据的机制,如数据库密码、API 密钥、TLS 证书等。Secret 对象可以在 Pod、Service 或其他资源中使用,并且以加密方式存储在 Kubernetes 集群中。
用途:
Secret 的主要用途是保护和管理敏感数据,以确保其在容器化应用程序中的安全性。它可以用于以下场景:
- 存储和传递敏感数据,如密码、令牌、密钥等。
- 配置安全相关的设置,如 TLS 证书和私钥。
- 在容器化应用程序中访问外部系统和服务,如数据库或其他 API。
类型:
Secret 在 Kubernetes 中有以下几种常见的类型:
-
Opaque:最常用的 Secret 类型,用于存储普通的键值对数据。这种类型的 Secret 可以用于存储用户名、密码、API 密钥等敏感信息。
-
Docker Registry:用于存储连接到 Docker Registry 所需的认证信息,如用户名、密码等。这种类型的 Secret 可以用于拉取私有的 Docker 镜像。
-
TLS:用于存储 TLS/SSL 证书和私钥,用于安全的 HTTPS 通信。这种类型的 Secret 包含两个字段,一个用于存储证书,另一个用于存储私钥。
-
Service Account:由 Kubernetes 自动创建和管理的 Secret,用于存储 Service Account 的令牌信息。这种类型的 Secret 可以在 Pod 中使用,以便与 Kubernetes API 进行身份验证和授权。
除了这些常见的类型之外,还可以通过自定义 Secret 类型来满足特定的需求,例如存储特定应用程序的配置文件、加密密钥等。
创建和使用:
有多种方式可以创建 Secret,包括:
1.使用命令行参数创建:
kubectl create secret <secret-type> <secret-name> --from-literal=key1=value1 --from-literal=key2=value2
这种方式适用于创建一些简单的键值对类型的 Secret。
2.使用 YAML 文件创建:
创建一个包含 Secret 配置的 YAML 文件,并使用 kubectl apply -f
命令将其应用到集群中。示例 YAML 文件如下:
apiVersion: v1
kind: Secret
metadata:
name: my-secret # Secret 的名称
type: Opaque # Secret 的类型,这里设置为 Opaque
data:
username: YWRtaW4= # Base64 编码的用户名 admin
password: cGFzc3dvcmQ= # Base64 编码的密码 password
在 YAML 文件中,您需要指定 Secret 的名称、类型和数据。数据的值应该是经过 Base64 编码的。
3.使用文件创建:
使用文件中的数据创建 Secret。例如,通过以下命令创建一个从文件中读取 TLS 证书和私钥的 Secret:
kubectl create secret tls <secret-name> --cert=path/to/certificate.crt --key=path/to/private.key
在创建 Secret 后,可以在 Pod 的配置文件中引用它,以访问其中的敏感数据。有两种主要的使用方式:
1.以环境变量的形式使用 Secret:
apiVersion: v1
kind: Pod
metadata:
name: my-pod # Pod 的名称
spec:
containers:
- name: my-container
image: nginx # 使用的容器镜像
env:
- name: USERNAME # 环境变量名称
valueFrom:
secretKeyRef:
name: my-secret # 使用的 Secret 的名称
key: username # Secret 中的键名,对应用户名
- name: PASSWORD # 环境变量名称
valueFrom:
secretKeyRef:
name: my-secret # 使用的 Secret 的名称
key: password # Secret 中的键名,对应密码
将上述内容保存为 pod.yaml 文件,并执行以下命令创建 Pod:
kubectl apply -f pod.yaml
2.以 Volume 的形式使用 Secret:
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod # Pod 的名称
spec:
containers:
- name: my-container
image: nginx # 使用的容器镜像
volumeMounts:
- name: secret-volume # Volume 的名称
mountPath: /app/secrets # 挂载路径
volumes:
- name: secret-volume # Volume 的名称
secret:
secretName: my-secret # 使用的 Secret 的名称
将上述内容保存为 pod.yaml 文件,并执行以下命令创建 Pod:
kubectl apply -f pod.yaml
更多推荐
所有评论(0)