合肥网站建设政务区,电脑做视频的网站吗,图虫,北京市建设工程质量监督网站目录
一、什么是Volume
二、k8s中的Volume
三、k8s中常见的Volume类型
四、Volume 之 EmptyDir
4.1 EmptyDir 特点
4.2 EmptyDir 实现文件共享
4.2.1 关于busybox
4.3 操作步骤
4.3.1 创建配置模板文件yaml
4.3.2 创建Pod
4.3.3 访问nginx使其产生访问日志
4.3.4 …目录
一、什么是Volume
二、k8s中的Volume
三、k8s中常见的Volume类型
四、Volume 之 EmptyDir
4.1 EmptyDir 特点
4.2 EmptyDir 实现文件共享
4.2.1 关于busybox
4.3 操作步骤
4.3.1 创建配置模板文件yaml
4.3.2 创建Pod
4.3.3 访问nginx使其产生访问日志
4.3.4 查看容器日志
五、Volume 之 hostPath
5.1 hostPath 概述
5.2 hostPath类型
5.3 hostPath 操作演示
5.3.1 创建模板配置文件
5.3.2 使用apply命令创建pod
5.3.3 访问nginx使其产生访问日志
5.3.4 查看容器输出日志
5.3.5 查看挂载目录日志文件
5.3.6 删除当前的pod
5.4 emptyDir和hostPath的对比
六、Volume 之 ConfigMap
6.1 ConfigMap需求场景
6.2 ConfigMap简介
6.3 ConfigMap 创建操作演示
6.3.1 使用命令行创建
6.3.2 查看创建的configmap
6.3.3 使用yaml配置文件创建
6.3.4 查看configmap详情
6.4 ConfigMap 使用操作演示
6.4.1 使用配置文件创建pod
6.4.2 验证configmap中配置的值
七、Volume 之 Secret
7.1 Secret 简介
7.2 secret 常见类型
7.2.1 dockerconfigjson
7.2.2 Service Account
7.3 Secret Opaque使用
7.3.1 创建模板配置文件
7.3.2 使用apply命令创建secret
7.3.3 查看my-secret详细信息
7.3.4 创建pod
7.3.5 查看secret信息 一、什么是Volume 通过之前学习了解到k8s中Pod是最小的运行单元Pod中运行的是一个个容器但是容器的生命周期可能很短被频繁地创建和销毁。 在学习docker的时候创建一个容器如果没有指定容器的数据卷容器中的文件在磁盘上通常是临时存放的这就给容器中运行的重要应用程序带来了一些问题 比如像下面的场景
当容器崩溃时文件丢失kubelet 会重新启动容器但容器会以干净的状态重启之前保存在容器中的数据也会被清除 当在一个 Pod 中同时运行多个容器时常常需要在这些容器之间共享文件 基于这些问题k8s中就出现了“卷”这个组件来解决 Kubernetes 卷Volume 这一抽象概念能够解决这两个问题卷的核心是包含一些数据的目录Pod 中的容器可以访问该目录 二、k8s中的Volume 关于k8s中卷的总结
Volume是k8s抽象出来的对象它被定义在Pod上然后被一个Pod里的多个容器挂载到具体的文件目录下 kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储 Volume的生命周期不与Pod中单个容器的生命周期相关当容器终止或者重启时Volume中的数据也不会丢失K8S可以支持许多类型的卷Pod 也能同时使用任意数量的卷三、k8s中常见的Volume类型 k8s中提供了很多种类型的Volume下面列举一些常用的类型
常规存储EmptyDir、HostPath 高级存储PV、PVC 配置存储ConfigMap、Secret 其他网络存储系统 NFS、CIFS包括云服务商提供的、本地、分布式 接下来针对日常业务中使用较多的Volume通过实例一一演示下各自的使用。 四、Volume 之 EmptyDir 4.1 EmptyDir 特点 当 Pod 指定到某个节点上时首先创建的是一个 emptyDir 卷只要 Pod 在该节点上运行卷就一直存在 当 Pod 因为某些原因被从节点上删除时emptyDir 卷中的数据也会永久删除 容器崩溃并不会导致 Pod 被从节点上移除所以容器崩溃时 emptyDir 卷中的数据是安全的使用场景临时缓存空间存储一些运行过程中的中继日志 4.2 EmptyDir 实现文件共享 如图所示我们的需求是创建一个类型为EmptyDir的Volume实现两个容器日志的共享 4.2.1 关于busybox 1、是⼀个集成了三百多个最常⽤Linux命令和⼯具的软件 2、包含了简单的⼯具例如ls、cat和echo等等还包含了⼀些更复杂的⼯具例grep、find、telnet等 4.3 操作步骤 下面通过案例演示下使用的步骤 4.3.1 创建配置模板文件yaml
在当前目录下创建一个volume-emptydir.yaml 的文件配置如下内容
apiVersion: v1
kind: Pod
metadata:name: test-volume-emptydirnamespace: default
spec:containers:- name: test-nginximage: nginx:1.20ports:- containerPort: 80volumeMounts: # 将nginx-log-volume挂在到nginx容器中对应的目录为 /var/log/nginx- name: test-log-volumemountPath: /var/log/nginx- name: test-busyboximage: busybox:1.35.0 command: [/bin/sh,-c,tail -f /usr/local/test/access.log] # 容器启动后初始命令读取指定文件中内容volumeMounts: # 将nginx-log-volume挂在到busybox容器中对应的目录为 /logs- name: test-log-volumemountPath: /usr/local/testvolumes: # 这里声明volume存储劵 name为nginx-log-volume类型是emptyDir- name: test-log-volumeemptyDir: {}
配置中的关键位置如下 4.3.2 创建Pod
使用apply命令执行pod的创建创建成功后可以看到在test-volume-emptydir 这个pod里面运行了2个容器 4.3.3 访问nginx使其产生访问日志
随机访问一下使nginx中产生部分日志 4.3.4 查看容器日志
使用下面的命令查看容器产生的access.log日志
kubectl logs -f test-volume-emptydir -n default -c test-busybox 五、Volume 之 hostPath 上面我们聊了EmptyDir的使用相信实际操作之后的同学应该能看出来由于EmptyDir创建的这个Volume是一个虚拟的路径所以当其销毁后pod中容器产生的数据也就随之销毁了即无法真正实现数据的落盘持久化于是我们在想是否可以做到下面这样呢 当然是可以的这就是接下来要说的另一种Volume hostPath 5.1 hostPath 概述
emptyDir中数据没做持久化随着Pod的结束而销毁需要持久化到磁盘则选其他方式 hostPath类型的磁盘就是挂在了主机的一个文件或者目录 某些应用需要用到docker的内部文件这时只需要挂在本机的/var/lib/docker作为hostPath 5.2 hostPath类型
根据使用场景的不同又可以细分成多个类型
Directory 给定的目录路径必须存在 DirectoryOrCreate 如果给定路径不存在将根据需要在那里创建一个空目录 File 给定路径上必须存在对应文件 FileOrCreate 如果给定路径不存在将根据需要在那里创建一个空文件 5.3 hostPath 操作演示 5.3.1 创建模板配置文件
在当前目录下创建一个名叫volume-hostpath.yaml的配置文件内容如下
apiVersion: v1
kind: Pod
metadata:name: hostpath-volume-testnamespace: default
spec:containers:- name: test-nginximage: nginx:1.20ports:- containerPort: 80volumeMounts: # 将nginx-log-volume挂在到nginx容器中对应的目录为 /var/log/nginx- name: test-log-volumemountPath: /var/log/nginx- name: test-busyboximage: busybox:1.35.0 command: [/bin/sh,-c,tail -f /usr/local/test/access.log] # 容器启动后初始命令读取指定文件中内容volumeMounts: # 将nginx-log-volume挂在到busybox容器中对应的目录为 /logs- name: test-log-volumemountPath: /usr/local/testvolumes: # 这里声明volume存储劵 name为test-log-volume类型是hostPath- name: test-log-volumehostPath:path: /usr/local/testtype: DirectoryOrCreate #如果给定路径不存在将根据需要在那里创建一个空目录 主要的配置和上面的emptyDir的案例中的差不多最后的volumes类型那里改成hostPath相关的参数 5.3.2 使用apply命令创建pod
创建成功后可以看到产生了一个hostpath开头的一个Pod里面包含两个容器 5.3.3 访问nginx使其产生访问日志 5.3.4 查看容器输出日志
这这里注意使用你自己定义的那个名称
kubectl logs -f hostpath-volume-test -n default -c test-busybox 5.3.5 查看挂载目录日志文件
工作节点查看对应的挂载目录的日志文件登录工作节点的服务器可以看到对应的nginx日志文件也在里面了 5.3.6 删除当前的pod 删除pod之后发现工作节点目录下的日志文件依然存在 5.4 emptyDir和hostPath的对比 通过上面的演示最后来对比一下emptyDir和hostPath使用上的异同点
两者都是本地存储卷方式 emptyDir是临时存储空间完全不提供持久化支持hostPath的卷数据是持久化在node节点的文件系统中的即便pod已经被删除了volume卷中的数据还留存在node节点上六、Volume 之 ConfigMap 6.1 ConfigMap需求场景 很多应用在其初始化或运行期间要依赖一些配置信息 并且在大多数时候 存在要调整配置参数所设置的数值的需求而ConfigMap是Kubernetes 用来向应用 Pod 中注入配置数据的一种方法 6.2 ConfigMap简介 是K8S的一种API对象用来把【非加密数据】保存到键值对中比如etcd 可以用作环境变量、命令行参数等将环境变量、配置信息和容器镜像解耦便于应用配置的修改 使用方式 kubectl create configmap 命令基于目录、 文件或者键值对来创建 ConfigMap 如下示例 kubectl create configmap NAME --from-literalkey1value1 --from-literalkey2value2 6.3 ConfigMap 创建操作演示 6.3.1 使用命令行创建
使用下面的命令进行ConfigMap的创建
kubectl create configmap test-config --from-literalaccounttest --from-literalpassword123456 6.3.2 查看创建的configmap
kubectl get configmap test-config -o yaml 6.3.3 使用yaml配置文件创建
在当前目录下创建一个 test-configmap.yaml的文件核心配置内容如下
apiVersion: v1
kind: ConfigMap
metadata:name: congge-configmapnamespace: default
data:info: username:conggepassword:123456 使用apply命令执行创建 6.3.4 查看configmap详情
kubectl describe cm congge-configmap -n default 6.4 ConfigMap 使用操作演示 上面演示了两种创建configmap的方式configmap创建出来后怎么使用呢简单来说只需要开启一个pod将这个configmap挂载进去使用即可 6.4.1 使用配置文件创建pod
注意里面的Volume使用上文yaml中创建的那个configmap的名字
apiVersion: v1
kind: Pod
metadata:name: pod-configmapnamespace: default
spec:containers:- name: nginximage: nginx:1.20volumeMounts: # configmap挂载的目录- name: configmountPath: /configvolumes: # 声明configmap- name: configconfigMap:name: congge-configmap
执行apply命令进行创建然后检查下是否创建成功 6.4.2 验证configmap中配置的值
进入pod容器 kubectl exec -it pod-configmap -n default -- /bin/sh 进入配置文件中的挂载目录 /config查看配置信息 七、Volume 之 Secret 有些配置需要加密存储ConfigMap只能使用明文保存因此ConfigMap就不适合了 7.1 Secret 简介 Secret 作用
用来保存敏感信息例如密码、秘钥、证书、OAuth 令牌和 ssh key等 就不需要把这些敏感数据暴露到镜像或者Pod中 不管是哪种Volume最终都是为Pod服务的对于Pod来说可以用三种方式之一来使用 Secret
作为挂载到一个或多个容器上的卷 中的文件 作为容器的环境变量 由 kubelet 在为 Pod 拉取镜像时使用 7.2 secret 常见类型
下面列举secret中常用的几种类型 7.2.1 dockerconfigjson 用来存储私有 docker registry的认证信息 7.2.2 Service Account 1、只要与Kubernetes API有交互的Pod都会自动拥有此种类型的Secret 2、K8S自动创建并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中 7.2.3 Opaque 加密类型为base64其特点就是将明文改为了密文 7.3 Secret Opaque使用 下面以Secret中Opaque这种类型进行说明首先用一个字符串做下测试简单来说就是将字符串进行base64编码得到一串类似于密文的字符串 7.3.1 创建模板配置文件 在当前目录下创建一个secret.yaml的配置文件内容如下其中username和password用的就是上面测试中看到的
apiVersion: v1
kind: Secret
metadata:name: my-secret
type: Opaque
data:username: YWRtaW4password: MTIzNDU2 7.3.2 使用apply命令创建secret
创建成功后可以顺便使用get查看下创建的secret 7.3.3 查看my-secret详细信息
使用下面的命令进行查看 kubectl get secret my-secret -o yaml 7.3.4 创建pod
创建一个新的pod并使用上面这个secret在当前目录下创建一个名叫pod-secret-volume.yaml的配置文件内容如下
apiVersion: v1
kind: Pod
metadata:name: pod-secret
spec:containers:- name: nginximage: nginx:1.20volumeMounts: # secret挂载- name: congge-configmountPath: /etc/secretvolumes:- name: congge-configsecret:secretName: my-secret
使用apply命令执行并创建pod 7.3.5 查看secret信息
在pod中的secret信息实际已经被解密使用下面的命令进入到pod
kubectl exec -it pod-secret -- /bin/sh
查看指定目录下secret中配置的username和password可以看到在pod中加密的信息已被解密了