云计算学习100天-第82天-K8S-8
目录
存储卷
概念
卷是一个抽象化的存储设备
卷可以解决容器崩溃或重启后历史数据丢失的问题
卷可以解决容器或Pod被删除后数据持久保存的问题
卷可以解决在多个容器内共享数据的问题
Pod可以同时使用任意数目的卷
使用卷
首先编写一个Pod的资源清单文件
在Pod.spec下添加volumes字段,配置外部存储为卷
在Pod.spec.containers[*]中添加volumeMounts字段,声明卷在容器中的挂载位置
卷不能挂载到其他卷之上,也不能与其他卷有硬链接
Pod配置中的每个容器必须独立指定各个卷的挂载位置
卷类型:
持久卷——集群中的存储资源,在里面存储的数据不会随着Pod的删除而丢失
临时卷——卷会遵从Pod的生命周期,与Pod一起创建和删除
投射卷——允许将多个现有卷源映射到同一个目录。通过将这些不同类型的卷源组合成一个统一的卷,可以更方便地管理和使用这些资源
持久卷
hostPath
概念
本质是使用本地设备,例如磁盘、分区、目录等。
hostPath卷里的数据不会随着Pod的结束而消失
注意:配置相同的Pod,可能在不同的节点上表现不同,因为不同节点上映射的文件内容不同
type对应类型:
DirectoryOrCreate 卷映射对象是一个目录,如果不存在就创建
Directory 卷映射对象是一个目录,且必须存在
FileOrCreate 卷映射对象是一个文件,如果不存在就创建
File 卷映射对象是一个文件,且必须存在
Socket 卷映射对象是一个Socket套接字,且必须存在
CharDevice 卷映射对象是一个字符设备,且必须存在
BlockDevice 卷映射对象是一个块设备,且必须存在
使用hostPath卷保存日志
---
kind: Pod
apiVersion: v1
metadata:
name: web1
spec:
volumes: # 卷定义
- name: logdata # 卷名称
hostPath: # 资源类型
path: /var/weblog # 宿主机路径,在节点上存放的路径
type: DirectoryOrCreate # 目录不存在就创建
containers:
- name: nginx
image: myos:nginx
volumeMounts: # mount 卷
- name: logdata # 卷名称
mountPath: /usr/local/nginx/logs # 容器内路径
NFS
概念
k8s中允许将nfs存储以卷的方式挂载到你的Pod中
在删除Pod时,nfs存储卷会被卸载,而不是被删除
nfs卷可以在不同节点的Pod之间共享数据
NFS最大的功能就是在不同节点的不同Pod中共享读写数据
本地NFS的客户端可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样
由于Pod是随机调度的,为了保证NFS存储卷可以正确加载,需要在所有node节点都安装NFS软件工具包
Pod调用NFS卷
---
kind: Pod
apiVersion: v1
metadata:
name: web1
spec:
volumes:
- name: logdata
hostPath:
path: /var/weblog
type: DirectoryOrCreate
- name: website # 卷名称
nfs: # NFS 资源类型
server: 192.168.88.240 # NFS 服务器地址
path: /var/webroot # NFS 共享目录
containers:
- name: nginx
image: myos:nginx
volumeMounts:
- name: logdata
mountPath: /usr/local/nginx/logs
- name: website # 卷名称
mountPath: /usr/local/nginx/html # 路径
PV/PVC
概念
持久卷Persistent Volume
持久卷声明PersistentVolumeClaim
PV/PVC实现Pod对卷的部署管理和使用
PV是资源的提供者,根据集群的基础设施变化而变化
PVC是资源的使用者,根据业务服务的需求变化来配置,用户无需指定PV的技术细节,只需要声明你需求什么样的资源即可
PVC会根据用户声明的需求,自动找到PV完成绑定
k8s支持的存储卷:
cephfs——CephFS
csi——容器存储接口
fc——Fibre Channel存储
iscsi——iSCSI存储
hostPath——HostPath卷
nfs——网络文件系统
rbd——Rados块设备卷
创建PV
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-local
spec:
volumeMode: Filesystem #提供资源的类型Filesystem/Block
accessModes: #存储卷能提供的访问模式
- ReadWriteOnce #卷支持的模式 hostPath只支持RWO
capacity:
storage: 10Gi #提供的磁盘空间大小
persistentVolumeReclaimPolicy: Retain #数据手工回收
hostPath: #hostPath配置
path: /var/weblog
type: DirectoryOrCreate
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-nfs
spec:
volumeMode: Filesystem #资源类型:Filesystem、Block
accessModes: #卷支持的多种访问模式:RWO ROX RWX RWOP
- ReadWriteOnce
- ReadOnlyMany
- ReadWriteMany
capacity:
storage: 5Gi
persistentVolumeReclaimPolicy: Retain #数据回收方式
mountOptions: #mount的参数
- nolock
nfs: #NFS配置
server: 192.168.88.240 #NFS服务器IP地址
path: /var/webroot #共享目录路径
创建PVC
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc1
spec:
volumeMode: Filesystem #需要使用Filesystem的存储卷
accessModes:
- ReadWriteOnce #需要支持RWO的存储卷
resources:
requests:
storage: 8Gi #最小磁盘空间需求
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc2
spec:
volumeMode: Filesystem
accessModes:
- ReadWriteMany #需要支持RWM的存储卷
resources:
requests:
storage: 3Gi
Pod 挂载 PVC,映射PVC为卷,使用PVC用户无需关心后端存储设备,系统会自动查找匹配PV——
---
kind: Pod
apiVersion: v1
metadata:
name: web1
spec:
volumes: # 卷定义
- name: logdata # 卷名称
persistentVolumeClaim: # 通过PVC引用存储资源
claimName: pvc1 # PVC名称
- name: website # 卷名称
persistentVolumeClaim: # 通过PVC引用存储资源
claimName: pvc2 # PVC名称
containers:
- name: nginx
image: myos:nginx
volumeMounts:
- name: logdata #PVC卷名称
mountPath: /usr/local/nginx/logs #挂载路径
- name: website #PVC卷名称
mountPath: /usr/local/nginx/html #挂载路径
临时卷
configMap
概念
提供了向Pod注入配置数据的方法,允许将配置文件与镜像分离,使容器化的应用具有可移植性
在使用之前要创建它,不能用来保存大量数据,在其中保存的数据不可超过1MiB
用途
配置环境变量
修改配置文件的参数,数据库的地址等
命令
创建configlMap
kubectl create configmap 名称 [选项/参数]
修改系统时区
kubectl create configmap timezone --from-literal=TZ="Asia/Shanghai" --dry-run=client -o yaml
使用清单文件创建ConfigMap
[root@master ~]# vim timezone.yaml
---
kind: ConfigMap
apiVersion: v1
metadata:
name: timezone
data:
TZ: Asia/Shanghai
修改系统时区——
---
kind: Pod
apiVersion: v1
metadata:
name: web1
spec:
volumes:
- name: logdata
persistentVolumeClaim:
claimName: pvc1
- name: website
persistentVolumeClaim:
claimName: pvc2
containers:
- name: nginx
image: myos:nginx
envFrom: # 配置环境变量
- configMapRef: # 调用资源对象
name: timezone # 资源对象名称
volumeMounts:
- name: logdata
mountPath: /usr/local/nginx/logs
- name: website
mountPath: /usr/local/nginx/html
在 Pod 中增加 php 容器,与 nginx 共享同一块网卡——
# 以下为新增加内容
- name: php
image: myos:php-fpm
envFrom: # 不同容器需要单独配置时区
- configMapRef:
name: timezone
volumeMounts:
- name: website # 不同容器需要单独挂载NFS
mountPath: /usr/local/nginx/html
挂载 ConfigMap
---
kind: Pod
apiVersion: v1
metadata:
name: web1
spec:
volumes:
- name: logdata
persistentVolumeClaim:
claimName: pvc1
- name: website
persistentVolumeClaim:
claimName: pvc2
- name: nginx-php # 卷名称
configMap: # 引用资源对象
name: nginx-php # 资源对象名称
containers:
- name: nginx
image: myos:nginx
envFrom:
- configMapRef:
name: timezone
volumeMounts:
- name: nginx-php # 卷名称
subPath: nginx.conf # 键值(文件名称)
mountPath: /usr/local/nginx/conf/nginx.conf # 路径
- name: logdata
mountPath: /usr/local/nginx/logs
- name: website
mountPath: /usr/local/nginx/html
- name: php
image: myos:php-fpm
envFrom:
- configMapRef:
name: timezone
volumeMounts:
- name: website
mountPath: /usr/local/nginx/html
secret
概念
类似于ConfigMap,但专门用于保存机密数据
在设置Secret.data字段时,所有键值都必须时经过base64编码的字符串
用途
配置一些需要加密的环境变量或文件,例如:https证书
访问需要认证登录的私有镜像仓库,例如:harbor私有仓库
命令
创建secret
kubectl create secret 子类型 名称 [选项/参数]
通用子类型创建
kubectl create secret generic 名称 [选项/参数]
用于认证登录私有仓库的子类型
kubectl create secret docker-registry 名称 [选项/参数]
用于创建TLS证书的子类型
kubectl create secret tls 名称 [选项/参数]
创建需要登录私有仓库的资源对象
kubectl create secret docker-registry 私有仓库名 \
--docker-server="仓库主机名:端口号" \
--docker-username="登录用户名" \
--docker-password="密码"
登录认证仓库
---
kind: Pod
apiVersion: v1
metadata:
name: web2
spec:
imagePullSecrets: #引用secret数据
- name: harbor-auth #资源对象名称
containers:
- name: apache
image: harbor:443/private/httpd:latest #使用私有仓库里的镜像
emptyDir
概念
本质是一个简单的空目录
可以提供临时空间,同一个Pod中容器也可以用来共享数据
随Pod创建而创建,Pod在该节点上运行时一直存在。当Pod被从节点上删除时,临时卷中的数据也将会被永久删除
重启Pod中的容器不会造成emptyDir数据的丢失
配置缓存目录
---
kind: Pod
apiVersion: v1
metadata:
name: web2
spec:
imagePullSecrets:
- name: harbor-auth
volumes: # 卷配置
- name: cache # 卷名称
emptyDir: {} # 资源类型
containers:
- name: apache
image: harbor:443/private/httpd:latest
volumeMounts: # 挂载卷
- name: cache # 卷名称
mountPath: /var/cache # 路径
传递文件
---
kind: Pod
apiVersion: v1
metadata:
name: web2
spec:
imagePullSecrets:
- name: harbor-auth
volumes:
- name: cache
emptyDir: {}
initContainers:
- name: task1
image: myos:latest
volumeMounts:
- name: cache
mountPath: /var/cache
command: ["sh"]
args:
- -c
- |
echo -e "\n#-----------------#" |tee -a /var/cache/init.log
ID=${RANDOM}
echo "获取随机数: ${ID}" |tee -a /var/cache/init.log
echo "执行初始化任务" |tee -a /var/cache/init.log
echo "随机数取余 $((ID%2))" |tee -a /var/cache/init.log
echo "执行初始化任务完成" |tee -a /var/cache/init.log
sleep 1
exit $((ID%2))
containers:
- name: apache
image: harbor:443/private/httpd:latest
volumeMounts:
- name: cache
mountPath: /var/cache
更多推荐


所有评论(0)