博客
关于我
k8s-存储卷类型-emptyDir-hostPath-网络存储-NFS-持久卷PV(静态动态)
阅读量:327 次
发布时间:2019-03-04

本文共 3471 字,大约阅读时间需要 11 分钟。

为什么需要存储卷?

1.启动时需要初始化数据,例如配置文件

2.启动过程中产生临时数据,该临时数据需要多个容器间共享
3.启动过程中产生持久数据,例如mysql的data数据
Kubernetes中的Volume提供了在容器中挂在外度存储的能力。Pod需要设置卷来源(spec.volume)和挂载点(spec.containers.volumeMount)后才能使用相应的Volume。常用的数据卷类型包括:

1.本地(hostPath, emptyDir)
2.网络(NFS,Ceph, GlusterFS)
3.公有云(AWS EBS)
4.k8s资源(configmap, secret)

1.0认识临时存储卷 emptyDir

emptyDir是一个临时存储卷,与Pod生命周期绑定在一起。如果Pod删除了,卷也会被删除

应用场景:
Pod中容器之间数据共享

实验一

1.1创建一个Pod,一个Pod写数据,一个Pod读数据

创建Pod配置文件:

apiVersion: v1kind: Podmetadata:   name: my-podspec:  containers:  - name: zf-pod    image: centos    command: ["bash","-c","for i  in {1..100};do echo $i >> /data/hello;sleep 1;done"]    volumeMounts:    - name: data      mountPath: /data  - name: zf-pod-log    image: centos    command: ["bash","-c","tail -f /data/hello"]    volumeMounts:    - name: data      mountPath: /data  volumes:  - name: data    emptyDir: {}
1.2查看数据

执行以下命令查看数据:

kubectl exec my-pod -c zf-pod -- tail /data/hellokubectl logs -f my-pod -c zf-pod-log

查看宿主机真实数据目录:

ls /var/lib/kubelet/pods/7e53914b-b419-4497-a841-536665d97f7c/volumes/kubernetes.io~empty-dir/data

2.0节点存储卷 hostPath

hostPath卷:挂载Node文件系统(Pod所在节点)上的文件或目录到Pod中的容器。

应用场景:Pod中容器需要访问宿主机文件

2.1创建Pod
apiVersion: v1kind: Podmetadata:   name: host-podspec:  containers:  - name: busybox    image: busybox    args:     - /bin/sh    - -c    - sleep 36000    volumeMounts:    - name: data      mountPath: /data  volumes:  - name: data    hostPath:      path: /tmp      type: Directory
2.2验证

执行以下命令查看Pod状态:

kubectl get pods -o wide

查看宿主机目录确认数据一致性:

ls /tmp

3.0网络存储卷 NFS

NFS卷:提供对NFS挂载支持,可以自动将NFS共享路径挂载到Pod中。

NFS是一个主流的文件共享服务器。

3.1安装NFS
yum -y install nfs-utilsvim /etc/exports# 添加如下内容:IFS/kubernetes *(rw,no_root_squash)mkdir -p /ifs/kubernetessystemctl start nfssystemctl enable nfs
3.2安装客户端并测试NFS
yum -y install nfs-utilsmount -t nfs 192.168.106.200:/ifs/kubernetes /mnt/cd /mnt/touch nfsecho 123 >> nfs

验证NFS共享存储:

df -h | grep ifs
3.3创建Pod使用NFS共享
apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: deploy-nfs  name: deploy-nfsspec:  replicas: 1  selector:    matchLabels:      app: deploy-nfs  strategy: {}  template:    metadata:      labels:        app: deploy-nfs    spec:      containers:      - image: nginx        name: nginx        resources: {}        volumeMounts:        - name: data          mountPath: /usr/share/nginx/html      volumes:      - name: data        nfs:          server: 192.168.106.200          path: /ifs/kubernetes

应用配置文件:

kubectl apply -f nfs.yaml
删除Pod并验证数据是否丢失
kubectl delete pod deploy-nfs-65b77b9fc5-jgp2bkubectl expose deployment deploy-nfs --port=80 --target-port=80 --type=NodePort

分享一个错误案例

错误案例:K8s-node2节点未安装NFS客户端,创建的Pod分配到该节点启动时会报错。

解决方法:在K8s-node2节点上安装NFS客户端:

yum -y install nfs-utils

重新创建Pod即可。

4.0PV与PVC使用流程

1. Pod将数据持久化到远程存储

2. Pod多副本共享数据

创建NFS动态供给PV

下载GitHub动态供给NFS插件:

安装存储类并配置动态供给:

apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:  name: managed-nfs-storageprovisioner: k8s-sigs.io/nfs-subdir-external-provisionerparameters:  archiveOnDelete: "false"

绑定PVC并创建Pod:

apiVersion: apps/v1kind: PersistentVolumeClaimmetadata:  name: my-sc  storageClassName: "managed-nfs-storage"spec:  accessModes: [ReadWriteMany]  resources:    requests:      storage: 5Gi

验证PV和PVC状态:

kubectl get pvkubectl get pvc

在NFS服务器上查看文件同步情况:

ls /ifs/kubernetes

访问Pod即可看到存储内容:

curl http://-your-pod-ip:80

删除Pod并验证数据是否丢失:

kubectl delete pod your-pod

暴露端口并访问:

kubectl expose deployment your-deployment --port=80 --target-port=80 --type=NodePort

访问服务IP:

curl http://your-service-ip:80

转载地址:http://vhah.baihongyu.com/

你可能感兴趣的文章
netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
查看>>
Netty核心模块组件
查看>>
Netty源码—4.客户端接入流程一
查看>>
Netty源码—5.Pipeline和Handler一
查看>>
Netty源码—6.ByteBuf原理二
查看>>
Netty源码—7.ByteBuf原理四
查看>>
Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
查看>>
Network Dissection:Quantifying Interpretability of Deep Visual Representations(深层视觉表征的量化解释)
查看>>
Network Sniffer and Connection Analyzer
查看>>
Nginx Location配置总结
查看>>
Nginx 反向代理解决跨域问题
查看>>
nginx 后端获取真实ip
查看>>
Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
查看>>
Nginx 我们必须知道的那些事
查看>>
oauth2-shiro 添加 redis 实现版本
查看>>
OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
查看>>
Objective-C实现A-Star算法(附完整源码)
查看>>
Objective-C实现atoi函数功能(附完整源码)
查看>>
Objective-C实现base64加密和base64解密算法(附完整源码)
查看>>
Objective-C实现base85 编码算法(附完整源码)
查看>>