k8s数据存储

news/2025/1/19 11:28:08/文章来源:https://www.cnblogs.com/misakivv/p/18337847

目录
  • 一、引言
  • 二、基本存储
    • 1、EmptyDir
      • 1.1、示例
      • 1.2、创建资源清单
      • 1.3、创建Pod
      • 1.4、查看Pod
      • 1.5、通过PodIP访问nginx
      • 1.6、查看容器的标准输出
    • 2、HostPath
      • 2.1、创建资源清单
      • 2.2、.spec.volumes[*].hostPath.type
      • 2.3、创建Pod
      • 2.4、查看Pod
      • 2.5、通过PodIP访问nginx
      • 2.6、到host的/root/logs目录下查看存储的文件
      • 2.7、host下创建文件观察容器内部变化
      • 2.8、删除Pod观察host本地文件是否存在
    • 3、NFS
      • 3.1、准备NFS服务器
        • 3.1.1、master节点安装nfs服务
        • 3.1.2、准备一个共享目录
        • 3.1.3、将共享目录以读写权限暴露给同一网段中的所有主机
        • 3.1.4、启动nfs服务
      • 3.2、每个节点安装nfs
      • 3.3、编写资源清单
      • 3.4、创建Pod
      • 3.5、查看Pod
      • 3.6、通过PodIP访问nginx
      • 3.7、查看nfs服务器的共享目录
  • 三、高级存储
    • 1、引言
    • 2、PV
      • 2.1、资源清单
      • 2.2、字段解释
      • 2.3、核心概念
        • 2.3.1、访问模式(accessModes)
        • 2.3.2、回收策略(persistentVolumeReclaimPolicy)
        • 2.3.3、状态
      • 2.4、使用NFS作为存储,演示PV的使用
        • 2.4.1、准备NFS环境
        • 2.4.2、编写资源清单
        • 2.4.3、创建PV
        • 2.4.4、查看PV
    • 3、PVC
      • 3.1、资源清单
      • 3.2、字段解释
      • 3.3、示例
        • 3.3.1、编写PVC资源清单,申请PV
        • 3.3.2、创建PVC
        • 3.3.3、查看PVC
        • 3.3.4、查看PV
        • 3.3.5、编写Pod资源清单,使用PVC
        • 3.3.6、创建Pod
        • 3.3.7、查看Pod,PVC,PV
        • 3.3.8、查看nfs中的文件存储
        • 3.3.9、删除pod和pvc,查看pv状态
      • 3.4、生命周期
  • 四、配置存储
    • 1、ConfigMap
      • 1.1、资源清单
      • 1.2、字段解释
      • 1.3、使用场景
        • 1.3.1、作为环境变量
        • 1.3.2、挂载为文件
        • 1.3.3、挂载为 Volume 中的文件
      • 1.4、示例
        • 1.4.1、编写configmap资源清单
        • 1.4.2、创建ConfigMap
        • 1.4.3、查看ConfigMap详细信息
        • 1.4.4、编写pod-configmap.yaml,将创建的configmap挂载进去
        • 1.4.5、创建Pod,并进入容器查看
        • 1.4.6、在线修改configmap的内容,查看容器中变化
    • 2、Secret
      • 2.1、Secret的类型
      • 2.2、示例
        • 2.2.1、使用base64对数据进行编码
        • 2.2.2、编写Secret资源清单并创建Secret
        • 2.2.3、查看secret详情
        • 2.2.4、创建Pod,将上面创建的Secret挂载上去
        • 2.2.5、进入容器查看Secret信息

一、引言

容器的生命周期可能很短,会被频繁地创建和销毁。容器在销毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,kubernetes引入了Volume的概念。

Volume是Pod中能够被多个container访问的共享目录。它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下。Kubernetes通过Volume实现:

  1. 同一个Pod中不同容器之间的数据共享
  2. 数据的持久化存储。

Volume的生命周期不与Pod中单个container的生命周期相关联。当container终止或重启时,Volume中的数据也不会丢失。

Kubernetes的Volume支持多种类型,常见的有:

  • 简单存储EmptyDirHostPathNFS
  • 高级存储PVPVC
  • 配置存储ConfigMapSecret

二、基本存储

1、EmptyDir

最基础的Volume类型,一个EmptyDir就是Host上的一个空目录。

EmptyDir是在Pod分配到Node时创建的,它的初始内容为空,并且无需指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录。当Pod销毁时,EmptyDir中的数据也会被永久删除。EmptyDir用途为:

  • 临时空间,例如用于某些应用程序运行时所需的临时目录,且无需永久保留
  • 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)
  • 缓存空间,例如基于磁盘的归并排序。
  • 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
  • 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。

1.1、示例

下面演示一个示例:在一个Pod中准备2个容器:nginx和busybox,然后声明一个Volume分别挂在2个容器的目录中。Nginx负责向Volume中写日志,busybox中通过命令将日志内容读到控制台。

如下图所示:

image-20240801002333395

1.2、创建资源清单

volume-emptydir.yaml

apiVersion: v1
kind: Pod
metadata:name: volume-emptydirnamespace: default
spec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80volumeMounts:- name: logs-volumemountPath: /var/log/nginx- name: busyboximage: busybox:1.30command: ["/bin/sh", "-c", "tail -f /logs/access.log"]volumeMounts:- name: logs-volumemountPath: /logsvolumes:- name: logs-volumeemptyDir: {}

1.3、创建Pod

kubectl apply -f volume-emptydir.yaml

image-20240730154218490

1.4、查看Pod

kubectl get pods -o wide

image-20240730154423817

1.5、通过PodIP访问nginx

curl 10.244.2.10

image-20240730154621781

1.6、查看容器的标准输出

kubectl logs -f volume-emptydir -n default -c busybox

image-20240730154756275

2、HostPath

上面EmptyDir提到,EmptyDir中数据不会被持久化,它会随着Pod的结束而销毁,如果想简单的将数据持久化到主机中,可以选择HostPath。

HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据依据可以存在于Node主机上。

image-20240801234925204

2.1、创建资源清单

volume-hostpath.yaml

apiVersion: v1
kind: Pod
metadata:name: volume-hostpathnamespace: default
spec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80volumeMounts:- name: logs-volumemountPath: /var/log/nginx- name: busyboximage: busybox:1.30command: [ "/bin/sh","-c","tail -f /logs/access.log" ]volumeMounts:- name: logs-volumemountPath: /logsvolumes:- name: logs-volumehostPath:path: /root/logstype: DirectoryOrCreate  # 目录存在就使用,不存在就先创建后使用

2.2、.spec.volumes[*].hostPath.type

关于type类型的说明:

类型 说明
DirectoryOrCreate 目录存在就使用,不存在就先创建
Directory 目录必须存在
FileOrCreate 文件存在就使用,不存在就先创建
File 文件必须存在
Socket unix套接字必须存在
CharDevice 字符设备必须存在
BlockDevice 块设备必须存在

2.3、创建Pod

kubectl apply -f volume-hostpath.yaml

image-20240730155231004

2.4、查看Pod

kubectl get pods -n default -o wide

image-20240730155605815

2.5、通过PodIP访问nginx

curl 10.244.1.9

image-20240730155835120

2.6、到host的/root/logs目录下查看存储的文件

下面的操作需要到Pod所在的节点运行(案例中是k8s-node1)

tail -f /root/logs/access.log

image-20240730160208446

2.7、host下创建文件观察容器内部变化

echo "hello HostPath" > test
在host本地创建文件验证同步
image-20240730160540528
分别进入nginx和busybox容器查看
image-20240730161126477

2.8、删除Pod观察host本地文件是否存在

kubectl delete pods volume-hostpath -n default

image-20240730162352540

3、NFS

HostPath可以解决数据持久化的问题,但是一旦Node节点故障了,Pod如果转移到了别的节点,又会出现问题了(会有新的hostpath volume在别的Node创建,但是原来的数据丢失了),此时需要准备单独的网络存储系统,比较常用的用NFS、CIFS。
NFS是一个网络文件存储系统,可以搭建一台NFS服务器,然后将Pod中的存储直接连接到NFS系统上,这样的话,无论Pod在节点上怎么转移,只要Node跟NFS的对接没问题,数据就可以成功访问。

image-20240801235341867

3.1、准备NFS服务器

3.1.1、master节点安装nfs服务

master节点做nfs服务器

yum install -y nfs-utils

3.1.2、准备一个共享目录

mkdir -pv /root/data/nfs

3.1.3、将共享目录以读写权限暴露给同一网段中的所有主机

echo "/root/data/nfs 192.168.112.0/24(rw,sync,no_subtree_check)" >> /etc/exports

3.1.4、启动nfs服务

systemctl start nfs && systemctl enable nfs

3.2、每个节点安装nfs

不需要启动

yum install -y nfs-utils

3.3、编写资源清单

volume-nfs.yaml

apiVersion: v1
kind: Pod
metadata:name: volume-nfsnamespace: default
spec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80volumeMounts:- name: logs-volumemountPath: /var/log/nginx- name: busyboximage: busybox:1.30command: [ "/bin/sh","-c","tail -f /logs/access.log" ]volumeMounts:- name: logs-volumemountPath: /logsvolumes:- name: logs-volumenfs:server: 192.168.112.10  #nfs服务器地址path: /root/data/nfs #共享文件路径

3.4、创建Pod

kubectl apply -f volume-nfs.yaml

image-20240730164943423

3.5、查看Pod

kubectl get pods -o wide

image-20240730173745582

3.6、通过PodIP访问nginx

curl 10.244.2.3

image-20240730174005173

3.7、查看nfs服务器的共享目录

cd /root/data/nfs && lscat access.log

image-20240730174137541

三、高级存储

1、引言

为了能够屏蔽底层存储实现的细节,方便用户使用,kubernetes引入了PV和PVC两种资源对象。

持久卷(PersistentVolume,PV)是集群中由管理员配置的一段网络存储。它是集群中的资源,就像节点是集群资源一样。一般情况下PV由kubernetes管理员进行创建和配置,它与底层具体的共享存储技术有关。PV持久卷和普通的Volume一样,也是使用卷插件来实现的,只是它们拥有独立于任何使用PV的Pod的生命周期。此API对象捕获存储实现的详细信息,包括NFS,iSCSI或特定于云提供程序的存储系统。

持久卷申领(PersistentVolumeClaim,PVC)表达的是用户对存储的请求。概念上与Pod类似。Pod会耗用节点资源,而PVC申领会耗用PV资源。Pod可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 。

img

对于用户来说,只提存储需求(PVC),专业的具体存储配置细节(PV)由管理员完成。

使用了PV和PVC后,工作可以进一步细分:

  • 存储:存储工程师维护
  • PV:kubernetes管理员维护
  • PVC:kubernetes用户维护

2、PV

PV是存储资源的抽象

2.1、资源清单

apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv
spec:capacity:storage: 10GivolumeMode: FilesystemaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: RetainstorageClassName: nfs-storagemountOptions:- hard- nfsvers=4.1nfs:path: /nfs/dataserver: nfs-server.example.com

2.2、字段解释

  • apiVersion: Kubernetes API 版本,这里是 v1。
  • kind: 资源类型,这里是 PersistentVolume。
  • metadata: PV 的元数据,包括名称。
  • spec: PV 的具体规格。
    • capacity: PV 的容量大小。
    • volumeMode: PV 的模式,这里为 Filesystem 表示这是一个文件系统类型的 PV。
    • accessModes: PV 的访问模式列表。
    • persistentVolumeReclaimPolicy: 当 PV 不再被任何 PVC 使用时的回收策略。
    • storageClassName: PV 所属的存储类名称,可以为空表示无类。
    • mountOptions: NFS 挂载选项。
    • nfs: NFS 具体配置。
    • path: 在 NFS 服务器上的路径。
    • server: NFS 服务器的地址

2.3、核心概念

2.3.1、访问模式(accessModes)

用于描述用户应用对存储资源的访问权限,访问权限包括

  • ReadWriteOnce(RWO):只仅允许单个节点以读写方式挂载
  • ReadOnlyMany(ROX):可以被许多节点以只读方式挂载
  • ReadWriteMany(RWX):可以被许多节点以只读方式挂载
  • ReadWriteOncePod(RWOP k8s v1.29):卷可以被单个 Pod 以读写方式挂载。

2.3.2、回收策略(persistentVolumeReclaimPolicy)

  • Retain:保留,该策略允许手动回收资源,当删除PVC时,PV仍然存在,PV被视为已释放,管理员可以手动回收卷。
  • Delete:删除,如果Volume插件支持,删除PVC时会同时删除PV,动态卷默认为Delete,目前支持Delete的存储后端包括AWS EBS,GCE PD,Azure Disk,OpenStack Cinder等。
  • Recycle:回收,如果Volume插件支持,Recycle策略会对卷执行rm -rf清理该PV,并使其可用于下一个新的PVC,但是本策略将来会被弃用,目前只有NFS和HostPath支持该策略。

2.3.3、状态

  • Available,表示pv已经创建正常,处于可用状态;
  • Bound,表示pv已经被某个pvc绑定,注意,一个pv一旦被某个pvc绑定,那么该pvc就独占该pv,其他pvc不能再与该pv绑定;
  • Released,表示pvc被删除了,pv状态就会变成已释放;
  • Failed,表示pv的自动回收失败;

2.4、使用NFS作为存储,演示PV的使用

2.4.1、准备NFS环境

  • 创建目录
mkdir -pv /root/data/pv{1..3}

image-20240730192514329

  • 暴露服务
echo -e "/root/data/pv1\t192.168.112.0/24(rw,no_root_squash)\n/root/data/pv2\t192.168.112.0/24(rw,no_root_squash)\n/root/data/pv3\t192.168.112.0/24(rw,no_root_squash)" > /root/data/nfs_exports

image-20240730193113143

  • 重启nfs服务
systemctl restart nfs

2.4.2、编写资源清单

pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:name:  pv1
spec:capacity:storage: 1GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /root/data/pv1server: 192.168.112.10---apiVersion: v1
kind: PersistentVolume
metadata:name:  pv2
spec:capacity:storage: 2GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /root/data/pv2server: 192.168.112.10---apiVersion: v1
kind: PersistentVolume
metadata:name:  pv3
spec:capacity:storage: 3GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /root/data/pv3server: 192.168.112.10

2.4.3、创建PV

kubectl apply -f pv.yaml

image-20240730193752934

2.4.4、查看PV

kubectl get pv -o wide

image-20240730193847790

3、PVC

PVC作为用户对存储资源的需求申请,主要包括存储空间请求、访问模式、PV选择条件和存储类别等信息的设置。

3.1、资源清单

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: myclaim
spec:accessModes:- ReadWriteOncevolumeMode: Filesystemresources:requests:storage: 8GistorageClassName: slowselector:matchLabels:release: "stable"matchExpressions:- {key: environment, operator: In, values: [dev]}

3.2、字段解释

  • apiVersion: Kubernetes API 版本,这里是 v1。

  • kind: 资源类型,这里是 PersistentVolumeClaim。

  • metadata:

    • name: PVC 的名称,这里是 myclaim。
  • spec: PVC 的具体规格。

    • accessModes: PVC 请求的访问模式列表。这里请求的是 ReadWriteOnce,意味着 PVC 只能被单个节点以读写方式挂

    • volumeMode: PVC 请求的 PV 的模式,这里为 Filesystem 表示这是一个文件系统类型的 PV。

    • resources:

      • requests: PVC 请求的资源量,这里是 storage: 8Gi,即请求 8GiB 的存储空间。
    • storageClassName: PVC 请求的存储类名称,这里是 slow。如果未指定,则使用默认存储类。

    • selector: PVC 可以选择特定的 PV。如果指定,PVC 只能绑定到符合这些选择器条件的 PV。

      • matchLabels: 标签选择器。这里的 PVC 将仅绑定到带有标签 release: stable 的 PV。
      • matchExpressions: 表达式选择器。这里的 PVC 将仅绑定到带有标签 environment 并且值为 dev 的 PV。

3.3、示例

3.3.1、编写PVC资源清单,申请PV

pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc1namespace: default
spec:accessModes:- ReadWriteManyresources:requests:storage: 1Gi---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc2namespace: default
spec:accessModes:- ReadWriteManyresources:requests:storage: 3Gi---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc3namespace: default
spec:accessModes:- ReadWriteManyresources:requests:storage: 5Gi

3.3.2、创建PVC

kubectl applpy -f pvc.yaml

image-20240730200946288

3.3.3、查看PVC

kubectl get pvc -o wide

image-20240730201347410

3.3.4、查看PV

kubectl get pv -o wide

image-20240730201517699

3.3.5、编写Pod资源清单,使用PVC

pods.yaml

apiVersion: v1
kind: Pod
metadata:name: pod1namespace: default
spec:containers:- name: busyboximage: busybox:1.30command: [ "/bin/sh","-c","while true;do echo pod1 >> /root/out.txt; sleep 10; done;" ]volumeMounts:- name: volumemountPath: /root/volumes:- name: volumepersistentVolumeClaim:claimName: pvc1readOnly: false
---
apiVersion: v1
kind: Pod
metadata:name: pod2namespace: default
spec:containers:- name: busyboximage: busybox:1.30command: [ "/bin/sh","-c","while true;do echo pod2 >> /root/out.txt; sleep 10; done;" ]volumeMounts:- name: volumemountPath: /root/volumes:- name: volumepersistentVolumeClaim:claimName: pvc2readOnly: false

3.3.6、创建Pod

kubectl apply -f pods.yaml

image-20240730202113136

3.3.7、查看Pod,PVC,PV

kubectl get pods,pvc,pv -o wide

image-20240730202510890

3.3.8、查看nfs中的文件存储

cat /root/data/pv1/out.txt
cat /root/data/pv2/out.txt
cat /root/data/pv3/out.txt
/root/data/pv1/out.txt
image-20240730203551447
/root/data/pv2/out.txt
image-20240730203651579
/root/data/pv3/out.txt
image-20240730203830479

Pod1 使用了 PVC1,PVC1 绑定了 PV1。因此,Pod1 写入的文件位于 /root/data/pv1/out.txt。
Pod2 使用了 PVC2,PVC2 绑定了 PV3。因此,Pod2 写入的文件位于 /root/data/pv3/out.txt。
PV2 未被使用,因此 /root/data/pv2/out.txt 文件不存在。

3.3.9、删除pod和pvc,查看pv状态

kubectl delete -f pods.yamlkubectl delete -f pvc.yamlkubectl get pv -o wide

image-20240730204255191

3.4、生命周期

PVC和PV是一一对应的,PV和PVC之间的相互作用遵循以下生命周期

1、资源供应:管理员手动创建底层存储和PV

2、资源绑定:用户创建PVC,kubernetes负责根据PVC的声明去寻找PV,并绑定在用户定义好PVC之后,系统将根据PVC对存储资源的请求在已存在的PV中选择一个满足条件的

  • 一旦找到,就将该PV与用户定义的PVC进行绑定,用户的应用就可以使用这个PVC了。PV一旦绑定到某个PVC上,就会被这个PVC独占,不能再与其他PVC进行绑定了

  • 如果找不到,PVC则会无限期处于Pending状态,直到等到系统管理员创建了一个符合其要求的PV

3、资源使用:用户可在pod中像volume一样使用pvc

Pod使用Volume的定义,将PVC挂载到容器内的某个路径进行使用。

4、资源释放:用户删除pvc来释放pv

当存储资源使用完毕后,用户可以删除PVC,与该PVC绑定的PV将会被标记为“已释放”,但还不能立刻与其他PVC进行绑定。通过之前PVC写入的数据可能还被留在存储设备上,只有在清除之后该PV才能再次使用。

5、资源回收:kubernetes根据pv设置的回收策略进行资源的回收

对于PV,管理员可以设定回收策略,用于设置与之绑定的PVC释放资源之后如何处理遗留数据的问题。只有PV的存储空间完成回收,才能供新的PVC绑定和使用

image-20240802001743014

四、配置存储

1、ConfigMap

ConfigMap 是 Kubernetes 中的一种 API 对象,用于存储非敏感的配置数据。它允许开发者将配置数据与应用程序容器分离,从而使得配置可以在不重新构建容器镜像的情况下进行更改。ConfigMap 可以存储简单的键值对或者一组文件,并且可以通过多种方式被应用程序容器访问。

1.1、资源清单

apiVersion: v1
kind: ConfigMap
metadata:name: game-demo
data:# 类属性键;每一个键都映射到一个简单的值player_initial_lives: "3"ui_properties_file_name: "user-interface.properties"# 类文件键game.properties: |enemy.types=aliens,monstersplayer.maximum-lives=5    user-interface.properties: |color.good=purplecolor.bad=yellowallow.textmode=true    

1.2、字段解释

apiVersion: v1

  • 说明: 指定 ConfigMap 的 API 版本。在这个例子中,我们使用的是 Kubernetes API 的第一个版本。

kind: ConfigMap

  • 说明: 指定此资源的类型为 ConfigMap。

metadata:

  • 说明: 包含元数据信息,比如名称。
    • name: game-demo
      • 说明: ConfigMap 的名称。在同一个命名空间内必须唯一。

data:

  • 说明: 存储配置数据的部分,支持键值对的形式。
    • player_initial_lives: "3"
      • 说明: 一个键值对,键为 player_initial_lives,值为 "3"。这个键值对表示玩家初始的生命值为 3。
    • ui_properties_file_name: "user-interface.properties"
      • 说明: 一个键值对,键为 ui_properties_file_name,值为 "user-interface.properties"。这个键值对表示 UI 属性文件的名称。
    • game.properties: |
      • 说明: 一个多行配置文件的示例。这里使用了 YAML 的|符号来表示一个块文本(block text),允许你直接嵌入多行文本而不必使用换行符。
        • enemy.types=aliens,monsters
          • 说明: 表示敌人类型为外星人和怪物。
        • player.maximum-lives=5
          • 说明: 表示玩家的最大生命值为 5。
    • user-interface.properties: |
      • 说明: 另一个多行配置文件的示例。
        • color.good=purple
          • 说明: 表示好的颜色为紫色。
        • color.bad=yellow
          • 说明: 表示坏的颜色为黄色。
        • allow.textmode=true
          • 说明: 表示是否允许文本模式。

1.3、使用场景

官方示例的 ConfigMap 可以通过多种方式被 Pod 使用

1.3.1、作为环境变量

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imageenv:- name: PLAYER_INITIAL_LIVESvalueFrom:configMapKeyRef:name: game-demokey: player_initial_lives- name: UI_PROPERTIES_FILE_NAMEvalueFrom:configMapKeyRef:name: game-demokey: ui_properties_file_name

1.3.2、挂载为文件

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imagevolumeMounts:- name: config-volumemountPath: /etc/game-demovolumes:- name: config-volumeconfigMap:name: game-demo

1.3.3、挂载为 Volume 中的文件

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imagevolumeMounts:- name: config-volumemountPath: /etc/game-demovolumes:- name: config-volumeconfigMap:name: game-demoitems:- key: player_initial_livespath: player_initial_lives.properties- key: ui_properties_file_namepath: ui_properties_file_name.properties- key: game.propertiespath: game.properties- key: user-interface.propertiespath: user-interface.properties

1.4、示例

1.4.1、编写configmap资源清单

apiVersion: v1
kind: ConfigMap
metadata:name: configmapnamespace: default
data: # info是key,后面的都是valueinfo: | # | 代表保留换行符username:adminpassword:123456

1.4.2、创建ConfigMap

kubectl apply -f configmap.yaml

image-20240730234833147

1.4.3、查看ConfigMap详细信息

kubectl describe configmap configmap

image-20240730235135501

1.4.4、编写pod-configmap.yaml,将创建的configmap挂载进去

apiVersion: v1
kind: Pod
metadata:name: pod-configmapnamespace: default
spec:containers:- name: nginximage: nginx:1.17.1volumeMounts: # 将configmap挂载到目录- name: configmountPath: /configmap/configvolumes: # 引用configmap- name: configconfigMap:name: configmap # 注意这里的name就是上面创建好的configmap

1.4.5、创建Pod,并进入容器查看

kubectl apply -f pod-configmap.yamlkubectl exec -it pod-configmap -c nginx /bin/bashcd configmap/config/ && ls && cat info

image-20240730235840604

可以看到映射已经成功,每个configmap都映射成了一个目录

key--->文件 value---->文件中的内容

1.4.6、在线修改configmap的内容,查看容器中变化

kubectl edit configmap configmapkubectl exec -it pod-configmap -c nginx /bin/bashcd configmap/config/ && ls && cat change info
kubectl edit 在线修改ConfigMap
image-20240731000447888
进入到容器查看内容变化
image-20240731000647467

2、Secret

在kubernetes中,还存在一种和ConfigMap非常类似的对象,称为Secret对象。用于存储敏感信息,如密码、密钥和其他机密数据。Secret 的设计目的是为了安全地管理这些敏感信息,避免它们被硬编码到配置文件或源代码中。

2.1、Secret的类型

创建 Secret 时,你可以使用 Secret 资源的 type 字段,或者与其等价的 kubectl 命令行参数(如果有的话)为其设置类型。 Secret 类型有助于对 Secret 数据进行编程处理。

Kubernetes 提供若干种内置的类型,用于一些常见的使用场景。 针对这些类型,Kubernetes 所执行的合法性检查操作以及对其所实施的限制各不相同。

内置类型 用法
Opaque 用户定义的任意数据
kubernetes.io/service-account-token 服务账号令牌
kubernetes.io/dockercfg ~/.dockercfg 文件的序列化形式
kubernetes.io/dockerconfigjson ~/.docker/config.json 文件的序列化形式
kubernetes.io/basic-auth 用于基本身份认证的凭据
kubernetes.io/ssh-auth 用于 SSH 身份认证的凭据
kubernetes.io/tls 用于 TLS 客户端或者服务器端的数据
bootstrap.kubernetes.io/token 启动引导令牌数据

通过为 Secret 对象的 type 字段设置一个非空的字符串值,你也可以定义并使用自己 Secret 类型(如果 type 值为空字符串,则被视为 Opaque 类型)。

Kubernetes 并不对类型的名称作任何限制。不过,如果你要使用内置类型之一, 则你必须满足为该类型所定义的所有要求。

如果你要定义一种公开使用的 Secret 类型,请遵守 Secret 类型的约定和结构, 在类型名前面添加域名,并用 / 隔开。 例如:cloud-hosting.example.net/cloud-api-credentials

2.2、示例

2.2.1、使用base64对数据进行编码

echo -n 'root' | base64echo -n 'zhangsan' | base64

image-20240731231850202

在创建 Kubernetes Secret 时,使用 -n 参数可以确保 base64 编码的字符串不会包含不必要的换行符,因为换行符可能会导致 base64 编码的结果不正确。

2.2.2、编写Secret资源清单并创建Secret

secret.yaml

apiVersion: v1
kind: Secret
metadata:name: secretnamespace: default
type: Opaque
data:username: cm9vdA==password: emhhbmdzYW4=
kubectl apply -f secret.yaml

image-20240731232538345

2.2.3、查看secret详情

kubectl get secret secret -o yaml

image-20240731232749287

2.2.4、创建Pod,将上面创建的Secret挂载上去

pod-secret.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-secretnamespace: default
spec:containers:- name: nginximage: nginx:1.17.1volumeMounts: # 将secret挂载到目录- name: configmountPath: /secret/configvolumes:- name: configsecret:secretName: secret
kubectl apply -f pod-secret.yamlkubectl get pods -o wide

image-20240731233719383

2.2.5、进入容器查看Secret信息

kubectl exec -it pod-secret -- bash

image-20240731234835852

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/776413.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1、Qt-pyqt6与pyqt6-tools的安装配置与使用

前提环境操作系统:Windows 10 22H2 Python版本:3.12.0 IDE:PyCharm Community Edition 2022 提示:为避免后续出现的一系列软件包安装出错的问题,请安装Python3.11虚拟环境 1.创建虚拟环境 在cmd中或pycharm中的终端执行: 注意:在指定目录下去创建,防止找不到 virtualen…

Linux学习——2 目录结构

windows与Linux目录结构对比

[笔记](更新中)KMP

算法详解 KMP是一种字符串匹配算法,可以在线性的时间复杂度内解决字符串的“模式定位”问题,即: 在字符串 \(A\) 中查找字符串 \(B\) 出现的所有位置。 我们称 \(A\) 为主串,\(B\) 为模式串。下文都用\(n\)表示\(A\)的长度,\(m\)表示\(B\)的长度,下标从\(1\)开始。 初始状…

抖音多账号授权给独立客服系统,实现评论私信互动与自动化回复

在当今数字化时代,社交媒体平台如抖音已成为企业与客户互动的重要渠道。为了更好地管理客户关系并提升服务质量,企业需要有效地整合抖音账号与客服系统。本文将详细介绍两种抖音授权接入方式,以及如何利用这些授权提升客户互动和自动化回复的效率。 演示网站:gofly.v1kf.co…

【Mysql】Docker下Mysql8数据备份与恢复

目录【Mysql】Docker下Mysql8数据备份与恢复1 创建Mysql容器2 连接Mysql3 Binlog检查3.1 检查是否开启3.2 mysql 5.73.3 mysql84 备份数据库4.1 容器里执行备份4.2 宿主机执行备份4.3 参数说明5 定时备份!/bin/bash按 shift + :输入 wq 【Mysql】Docker下Mysql8数据备份与恢复 …

【Windows】安装WSL

1、启用子系统2、商店搜wsl并下载3、重启电脑生效

前端使用 Konva 实现可视化设计器(19)- 连接线 - 直线、折线

本章响应小伙伴的反馈,除了算法自动画连接线(仍需优化完善),实现了可以手动绘制直线、折线连接线功能。本章响应小伙伴的反馈,除了算法自动画连接线(仍需优化完善),实现了可以手动绘制直线、折线连接线功能。请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 B…

2024牛客多校第5场

很神奇的场hh,大家一起坐牢,多好啊! B 找规律,这种题一般都是多模拟几个数据然后猜出来#include<bits/stdc++.h> using namespace std;inline int read() {int x=0;bool f=1;char ch=getchar();for(;ch<0||ch>9;ch=getchar())f^=(ch==-);for(;ch>=0&&am…

15. 序列化模块json和pickle、os模块

1. 序列化模块1.1 序列化与反序列化 (1)序列化 将原本的python数据类型字典、列表、元组 转换成json格式字符串的过程就叫序列化 (2)反序列化 将json格式字符串转换成python数据类型字典、列表、元组的过程就叫反序列化 (3)为什么要序列化 计算机文件中没有字典这种数据类…

AI表情神同步!LivePortrait安装配置,一键包,使用教程

快手在AI视频这领域还真有点东西,视频生成工具“可灵”让大家玩得不亦乐乎。现在又开源了一款超好玩的表情同步(表情控制)项目。 一看这图片,就知道是小视频平台出的,充满了娱乐性。发布没几天就已经有8000+Star。项目简介 LivePortrait 是一款由快手团队开发的高效肖像动…

右下角wifi图案点击无可用wifi/更新网卡驱动时遇到错误代码56的解决办法

1.问题 如下图所示,我这里遇到明明有wifi,但是无法检索到任何有用wifi的情况。2.解决方法 参考:电脑WIFI消失,网卡驱动Intel(R) Wi-Fi 6 AX201 160MHz感叹号报错 解决方案集合 —— 无线WI-FI功能缺失,Intel(R) Wi-Fi 6 AX201 160MHz异常,驱动更新错误 2.1 问题原因 当时…

单例模式及其思想

本文包括以下几点↓结论:设计模式不是简单地将一个固定的代码框架套用到项目中,而是一种严谨的编程思想,旨在提供解决特定问题的经验和指导。 单例模式(Singleton Pattern) 意图 旨在确保类只有一个实例,并提供一个全局访问点以访问该实例。 适用性 当你希望系统中只有一…