博客
关于我
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/

你可能感兴趣的文章