K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)
1、K8S-emptyDir2、K8S-hostPath3、K8S-NFS4、K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)
K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)
1、K8S-emptyDir(pod挂载到真机节点目录,随着容器删除而删除)
搭建K8S文档:yum安装K8S
ansible搭建K8S集群:ansible搭建K8S
准备至少3个机器搭建好K8S集群
节点名称 | IP |
---|---|
k8s-master | 192.168.116.134 |
k8s-node1 | 192.168.116.135 |
k8s-node2 | 192.168.116.136 |
官网介绍:k8s-emptyDir
emptyDir:在k8s集群中,当pod指定挂载emptyDir卷时,pod创建在某个节点上,节点就会自动生成一个挂载目录存放pod的指定目录内容,这个目录不会随着pod重建而删除,但是pod真正被删除后,数据就会被删除。
emptyDir 的一些用途:
- 缓存空间,例如基于磁盘的归并排序。指定emptyDir.medium字段为Memory时,如果节点重启,数据会丢失。
- 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
- 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。
在master创建pod
vi nginx-volume-emptydir.yml 创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-emptydir
name: nginx-emptydir-deployment
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx-emptydir
template:
metadata:
labels:
app: nginx-emptydir
spec:
containers:
- name: nginx-emptydir
image: docker.io/library/nginx:1.18.0-alpine
volumeMounts:
- mountPath: /emptydir #指定被挂载的容器目录
name: nginx-volume #指定节点挂载的目录名字
volumes:
- name: nginx-volume #指定卷名字
emptyDir: {} #设置卷属性为emtyDir
kubectl apply -f nginx-volume-emptydir.yml 创建pod
kubectl get pod -o wide 查看pod创建在了k8s-node2节点
查看这个名字default-token-gxjmw,查看挂载目录需要用到
kubectl describe pod nginx-emptydir-deployment-899d6c77-8rj5q |grep SecretName
进入容器
kubectl exec -it nginx-emptydir-deployment-899d6c77-8rj5q /bin/sh
进入目录,创建文件
cd emptydir/
echo test >test.txt
在k8s-node2查看挂载的目录
df -Th 通过名字default-token-gxjmw可以看到节点挂载的目录
通过指定前半部分就可以找到节点的挂载目录
ll /var/lib/kubelet/pods/c43bd831-e5a1-4159-9665-9d86be634a54/volumes/kubernetes.io~empty-dir/
在目录下查看刚才pod创建的文件
cat /var/lib/kubelet/pods/c43bd831-e5a1-4159-9665-9d86be634a54/volumes/kubernetes.io~empty-dir/nginx-volume/test.txt
在master删除pod,确认k8s-node2的目录会自动删除
kubectl delete -f nginx-volume-emptydir.yml 删除pod
kubectl get pod -o wide 可以看到没有pod运行
在k8s-node2查看目录是否被删除
df -Th 可以看到没有刚才挂载的目录
2、K8S-hostPath(真机节点目录挂载到pod,pod删除真机节点目录不删除)
官网介绍:k8s-hostPath
hostPath:在K8S集群中,当需要把真机节点的目录挂载到pod中,就需要使用这种挂载方式,挂载时最好是以只读方式挂载,不然可能出现pod被黑导致真机瘫痪的情况。
注意:
- HostPath 卷可能会暴露特权系统凭据(例如 Kubelet)或特权
API(例如容器运行时套接字),可用于容器逃逸或攻击集群的其他部分。 - 具有相同配置(例如基于同一 PodTemplate 创建)的多个 Pod 会由于节点上文件的不同而在不同节点上有不同的行为。
- 下层主机上创建的文件或目录只能由 root 用户写入。你需要在 特权容器 中以 root
身份运行进程,或者修改主机上的文件权限以便容器能够写入 hostPath 卷。
因为pod是根据K8S的调度规则调度到节点生成,所以数据不能确定放在哪个K8S的节点上,一种方式是可以先创建pod,然后把数据转移到节点。也可以通过下面这个文档指定pod创建在节点上。
查看这个文档:k8s亲和
2.1不指定节点,让pod自动挂载
master创建pod
vi nginx-volume-hostpath.yml 创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-hostpath
name: nginx-hostpath-deployment
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx-hostpath
template:
metadata:
labels:
app: nginx-hostpath
spec:
containers:
- name: nginx-hostpath
image: docker.io/library/nginx:1.18.0-alpine
volumeMounts:
- mountPath: /data #设置pod的目录
name: nginx-volume-hostpath #设置pod的挂载区名字
volumes:
- name: nginx-volume-hostpath
hostPath:
path: /k8s-hostPath-data #设置真机节点目录
type: DirectoryOrCreate #设置类型为创建目录
kubectl apply -f nginx-volume-hostpath.yml 创建pod
kubectl get pod -o wide 查看pod在k8s-node2节点
在k8s-node2查看
ll / 可以看到pod自动在节点目录下创建目录,默认权限为0755
在master连接容器,创建文件后,删除容器
连接容器,创建文件
kubectl exec -it nginx-hostpath-deployment-5f4c88b499-cvhj8 /bin/sh
echo k8s-node2 >/data/test.txt
exit
删除容器
kubectl delete -f volume/nginx-volume-hostpath.yml
返回k8s-node2,可以看到刚才创建的文件还在,证明这种挂载方式的数据不会随着容器删除而删除数据
ll /k8s-hostPath-data/
cat /k8s-hostPath-data/test.txt
2.2 指定节点,指定pod的挂载点
在k8s-node1创建目录
mkdir /k8s-node1/data -p
cp /etc/fstab /k8s-node1/data/ 复制文件到目录下
在master操作
对k8s-node1打上标签
kubectl label nodes k8s-node1 node-labels=nginx-test
kubectl get nodes --show-labels
在master创建pod
vi nginx-volume-hostpath2.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-hostpath2
name: nginx-hostpath2-deployment
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx-hostpath2
template:
metadata:
labels:
app: nginx-hostpath2
spec:
containers:
- name: nginx-hostpath2
image: docker.io/library/nginx:1.18.0-alpine
volumeMounts:
- mountPath: /pod/data #指定pod的目录
name: nginx-volume-hostpath2
volumes:
- name: nginx-volume-hostpath2
hostPath:
path: /k8s-node1/data #指定节点的真机目录
type: Directory
nodeSelector:
node-labels: nginx-test #指定创建的节点标签
kubectl apply -f nginx-volume-hostpath2.yml 创建pod
kubectl get pod -o wide 查看pod创建在了k8s-node1节点
连接pod
kubectl exec -it nginx-hostpath2-deployment-559fc49864-lv8fv /bin/sh
ls /pod/data/fstab 可以看到真机的文件挂载到了pod的目录
3、K8S-NFS 共享存储
官网文档:k8s-NFS
GitHub文档:k8s-github-NFS
全部节点都必须按照NFS服务,要不然在创建pod会挂载不上去
yum install -y nfs-utils
在NFS服务器上创建共享目录
mkdir /nfs/data -p 创建目录
vi /etc/exports 创建配置文件
/nfs/data *(rw,no_root_squash)
systemctl enable nfs-server
systemctl start nfs-server
showmount -e 192.168.116.134 确认服务开启成功
在master创建pod
vi nginx-volume-nfs.yml 创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-nfs
name: nginx-nfs-deployment
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx-nfs
template:
metadata:
labels:
app: nginx-nfs
spec:
containers:
- name: nginx-nfs
image: docker.io/library/nginx:1.18.0-alpine
volumeMounts:
- mountPath: /data #指定pod的目录
name: nginx-volume-nfs
volumes:
- name: nginx-volume-nfs
nfs:
server: 192.168.116.134 #指定NFS服务器的IP
path: /nfs/data #指定NFS的共享目录
kubectl apply -f nginx-volume-nfs.yml
kubectl get pod -o wide
连接容器
kubectl exec -it nginx-nfs-deployment-69c7445777-8hhnz /bin/sh
创建文件
echo nfs >/data/nfs.txt
exit
在NFS服务器上查看pod的文件创建在了NFS的目录下
cat /nfs/data/nfs.txt
在创建pod的k8s-node2查看挂载可以看到NFS挂载点
df -Th
4、K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)
目的:因为文件系统多种多样,所以K8S集群需要一个中间件也就是pv连接各种文件系统,而pvc用来在K8S集群中将pod和pv连接起来,从而使集群更加高效、简洁。
pv:在K8S的集群中创建一个存储卷,主要是和NFS、CephFS、Cinder等其他文件系统绑定,并且通过kubectl可以查看pv信息,方便集群存储管理。
pvc:主要用于定义pod和pv之间的连接规则,比如说这个pod使用多少pv空间,pod访问pv的策略限制。
4.1 以NFS+PV+PVC为例
全部节点都必须按照NFS服务,要不然在创建pod会挂载不上去
yum install -y nfs-utils
在NFS服务器上创建共享目录
mkdir /nfs/data -p 创建目录
vi /etc/exports 创建配置文件
/nfs/data *(rw,no_root_squash)
systemctl enable nfs-server
systemctl start nfs-server
showmount -e 192.168.116.134 确认服务开启成功
4.2 master创建PV
vi nginx-pv.yml 创建pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: nginx-pv #设置pv的名字
namespace: default
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.116.134 #设置NFS的服务器IP
path: /nfs/data #设置NFS的共享目录
kubectl apply -f nginx-pv.yml
kubectl get pv 默认没绑定pvc的状态是Available
4.3 在master创建pvc,并且和pv绑定
vi nginx-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc #设置pvc的名字
namespace: default
spec:
accessModes:
- ReadWriteOnce #设置文件读取方式为读写
volumeName: nginx-pv #指定pv的名字
resources:
requests:
storage: 2Gi #可以比pv的容量小,这里可以自定义
kubectl apply -f nginx-pvc.yml 创建pvc
kubectl get pv 当pv的状态为Bound,证明和pvc绑定了
kubectl get pvc 当pvc的状态为Bound,证明和pv绑定
4.4 在master创建pod,通过pvc使用pv空间
vi nginx-volume-nginx-pvc-pv.yml 创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-pvc-pv
name: nginx-pvc-pv-deployment
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx-pvc-pv
template:
metadata:
labels:
app: nginx-pvc-pv
spec:
containers:
- name: nginx-pvc-pv
image: docker.io/library/nginx:1.18.0-alpine
volumeMounts:
- mountPath: /data #指定pod的目录
name: nginx-pvc-pv
volumes:
- name: nginx-pvc-pv
persistentVolumeClaim:
claimName: nginx-pvc #指定pvc的名字
kubectl apply -f nginx-volume-nginx-pvc-pv.yml 创建pod
kubectl get pod -o wide 查看pod的节点
进入容器
kubectl exec -it nginx-pvc-pv-deployment-86f55bd84d-64mml /bin/sh
echo pv-pvc >/data/pv-pvc.txt 创建文件
exit
cat /nfs/data/pv-pvc.txt 查看创建的文件在NFS的共享目录下生成
4.5 在创建pod的节点上查看挂载方式还是NFS方式挂载
df -Th
更多推荐
所有评论(0)