k8s 数据存储相关
-
ConfigMap 存储
-
1、创建方式
-
2、configmap 数据作为环境变量
-
3、configmap 和容器挂载的结合
-
Secret 存储
-
Volume 存储
-
1、emptyDir 类型
-
2、hostpath 类型
-
PersistentVolumeClaim(PVC)存储
ConfigMap 存储
ConfigMap 是 Kubernetes 中用于存储配置信息的一种资源,允许你将配置信息从应用代码中分离出来。ConfigMap 可以用来存储单个属性、配置文件或者 JSON、XML 文件格式的配置数据
1、创建方式
1.1、文件方式创建
-
指定文件夹:目录下所有文件被用在 configmap 里面创建一个键值对,文件名为 key、文件内容为 value
-
指定文件:文件名为 key、文件内容为 value
kubectl create configmap lqhcm1 --from-file=../configmap/ -n space01

1.2、文本参数方式创建
-
指定参数:
--from-literal
参数指定 key、valuekubectl create configmap lqhcm3 --from-literal=key1=value1 --from-literal=key2=value2 -n space01

1.3、标准 yaml 文件
-
指定 yaml 文件:使用提前写好的标准 configmap 的 yaml 文件创建
kubectl apply -f configmap.yaml
2、configmap 数据作为环境变量
-
新建一个 pod(configmap-env-test)打印一下上面 configMap 的数据
apiVersion: v1
kind: Pod
metadata:
name: configmap-env-test #这个pod的名字
labels:
namespace: space01 #声明一个新的命名空间
spec:
containers:
- name: redis01 #容器名
image: redis #镜像名字
command: [ "/bin/sh", "-c", "env" ]
imagePullPolicy: IfNotPresent # 指定拉取镜像的策略,默认是Always,每次尝试拉去新的, IfNotPresent表示每本的的再去拉
env:
- name: env1
valueFrom:
configMapKeyRef:
name: lqhcm1
key: file1.txt
- name: env2
valueFrom:
configMapKeyRef:
name: lqhcm1
key: file2.txt
- name: nginx01 #容器名
image: nginx #镜像名字
command: [ "/bin/sh", "-c", "env" ]
imagePullPolicy: IfNotPresent
envFrom: #导入lqhcm3这个configmap所有的key-value
- configMapRef:
name: lqhcm3
restartPolicy: Never
-
验证截图


3、configmap 和容器挂载的结合
-
新建一个挂载 configmap 的 deployment,一个 configmap 的所有 key 会成为容器内部挂载目录的文件名字,对应的 value 会成为文件名对应的文件内容。
-
kubectl edit configmap lqhcm3 -n space01
可以编辑配置进行热更新,pod 内容器会跟着改。(注意:使用该 ConfigMap 挂载的 Env 不会同步更新)apiVersion: apps/v1
kind: Deployment
metadata:
name: configmap-deployment-test #这个pod的名字
labels:
namespace: space01 #声明一个新的命名空间
spec:
replicas: 1
selector:
matchLabels:
cdtestk: cdtestv
template:
metadata:
labels:
cdtestk: cdtestv
spec:
volumes: #和containerst同级
- name: config-volume1
configMap:
name: lqhcm3 #configMap的名字
- name: config-volume2
configMap:
name: lqhcm2 #configMap的名字
containers:
- name: redis01 #容器名
image: redis #镜像名字
volumeMounts:
- name: config-volume1
mountPath: /etc/config #容器内挂载的目录
imagePullPolicy: IfNotPresent
- name: nginx01 #容器名
image: nginx #镜像名字
volumeMounts:
- name: config-volume2
mountPath: /etc/config #容器内挂载的目录
imagePullPolicy: IfNotPresent -
验证截图

Secret 存储
Secret 是 Kubernetes 中用于存储敏感信息如密码、OAuth 令牌和 SSH 密钥等的一种资源。与 ConfigMap 类似,Secret 让你能够将敏感配置与容器镜像分离,以便更安全地管理和传输这些信息。Secret 的数据在 Kubernetes 内部是加密的,这为敏感数据的使用提供了一个更安全的方式。
-
和 ConfigMap 没什么区别,也是 key-value,只是这种类型存储的内容 value 是加密的,在读的时候会自动给你解密。
Volume 存储
在 Kubernetes 中,Volume 是用来存储容器运行时数据的一个抽象概念。它与 Docker 卷类似,但是具有更多的功能。Volume 可以持久化数据,跨多个容器共享数据,并且可以在 Pod 的生命周期内保持状态。Volume 的使用可以解决容器存储的两个主要问题:数据的非持久化和容器间共享文件。
1、emptyDir 类型
-
一个简单的空目录,用于存储临时数据。它在 Pod 被分配到节点时创建,并且只要该 Pod 在节点上运行就会一直存在。当 Pod 被删除时,emptyDir 中的数据也会被永久删除。
-
新建一个两个容器共享一个数据卷的 deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: emptydir-deployment-test #这个pod的名字
labels:
namespace: space01 #声明一个新的命名空间
spec:
replicas: 1
selector:
matchLabels:
edtestk: edtestv
template:
metadata:
labels:
edtestk: edtestv
spec:
volumes: #和containerst同级
- name: emptydir-volume
emptyDir: {}
containers:
- name: redis01 #容器名
image: redis #镜像名字
volumeMounts:
- name: emptydir-volume
mountPath: /lqh-empty-dir #容器内挂载的目录
imagePullPolicy: IfNotPresent
- name: nginx01 #容器名
image: nginx #镜像名字
volumeMounts:
- name: emptydir-volume
mountPath: /lqh-empty-dir #容器内挂载的目录
imagePullPolicy: IfNotPresent -
验证截图

2、hostpath 类型
-
需要制定本地 node 的目录,master 节点新建 Pod 时如果本地没有这个目录会报错。这也是他的缺点,无法知道新建 pod 会被指派到哪个 node,要所有 node 都要新建这个目录。hostpath 的生命周期是脱离 Kubernetes 管理的,如果 Pod 被删除,存储在 hostpath 的数据依然存在。hostPath 通常只在单节点集群中使用,因为如果 Pod 被调度到其他节点后,它将访问不到原有节点的 hostPath,所以也做不到持久化存储。
-
新建一个两个容器共享/nodepath 这个目录的 deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: hostpath-deployment-test #这个pod的名字
labels:
namespace: space01 #声明一个新的命名空间
spec:
replicas: 1
selector:
matchLabels:
edtestk: edtestv
template:
metadata:
labels:
edtestk: edtestv
spec:
volumes: #和containerst同级
- name: hostpath-volume
hostPath:
path: /nodepath #确保node节点有这个目录,不然新建pod报错
type: Directory
containers:
- name: redis01 #容器名
image: redis #镜像名字
volumeMounts:
- name: hostpath-volume
mountPath: /lqh-hostpath #容器内挂载的目录
imagePullPolicy: IfNotPresent
- name: nginx01 #容器名
image: nginx #镜像名字
volumeMounts:
- name: hostpath-volume
mountPath: /lqh-hostpath #容器内挂载的目录
imagePullPolicy: IfNotPresent -
验证截图

PersistentVolumeClaim(PVC)存储
PersistentVolumeClaim (PVC) 是 Kubernetes 中用于请求存储资源的一种资源对象。在 Kubernetes 中,存储资源被抽象化并以两种主要资源对象的形式存在:PersistentVolume (PV) 和 PVC。
PersistentVolume (PV): PV 是集群中的一块存储,由管理员预先配置或由 Kubernetes 通过 StorageClass 动态创建。它相当于一块网络硬盘,可以是 NFS、iSCSI、云服务商提供的存储。
PersistentVolumeClaim (PVC): PVC 是用户对存储的请求。它允许用户不用关心底层存储的具体细节,只需要声明所需的存储大小和存取模式(比如,读写一次或只读多个节点等)。然后,Kubernetes 会自动处理在后端找到一个符合要求的 PV 或者动态创建一个 PV。
-
创建一个 PersistentVolumeClaim (PVC) 且没有指定 storageClassName
属性,Kubernetes 的动态供给系统会自动使用默认 StorageClass 来创建一个 PersistentVolume,并将其与 PVC 绑定。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
namespace: dev
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
namespace: dev
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.7
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: kedacom@123
- name: MYSQL_DATABASE
value: bogelihai
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
-
验证截图

原文始发于微信公众号(给爷整笑辣):k8s 数据存储相关
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/206868.html