Fork me on GitHub

kubernetes持久化存储

一、nfs网络存储

 kubenetes集群中如果某个节点宕掉了,那么Pod就会漂移到其它节点,此时Pod是一个全新的状态,为了Pod可以使用之前的数据,那么需要将数据进行持久化,以便新的Pod可以继续使用。

 1、安装nfs服务器

参考NFS网络文件共享服务 文章,有NFS服务的详细安装与使用,进行nfs的安装与目录挂载:

[root@nfs-server ~]# showmount -e localhost
Export list for localhost:
/data 192.168.35.0/24

2、集群中的每个节点安装nfs

集群中的每个节点相当于nfs的客户端:

# 在每个节点执行
yum install -y nfs-utils

然后启动每个节点的nfs以及查看挂载情况:

# 每个节点启动
service nfs start

# 查看服务端的挂载目录,192.168.35.9是nfs服务器的ip
[root@k8snode1 ~]# showmount -e 192.168.35.9
Export list for 192.168.35.9:
/data 192.168.35.0/24

有结果就说明已经成功了。

3、集群中使用nfs持久存储

  •  nfs-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-nfs
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: wwwroot
          mountPath: /usr/share/nginx/html
        ports:
        - containerPort: 80
      volumes:
        - name: wwwroot
          nfs:
            server: 192.168.35.9
            path: /data

可以看到volume使用的就是nfs服务器的挂载目录来进行存储的。

现在可以进行测试,将Pod中的/usr/share/nginx/html中的内容存储在nfs服务器中,在Pod中的目录中新建一个文件:

[root@k8smaster ~]# kubectl exec -it nginx-nfs-545c5b9d75-79dl6 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
root@nginx-nfs-545c5b9d75-79dl6:/# cd /usr/share/nginx/html/
root@nginx-nfs-545c5b9d75-79dl6:/usr/share/nginx/html# ls
root@nginx-nfs-545c5b9d75-79dl6:/usr/share/nginx/html# touch index.html

现在去nfs服务器的/data目录中去查看:

[root@nfs-server data]# ll
总用量 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 6月  28 05:34 index.html

这样就完成了nfs持久存储了。

二、PVC和PV

1、概念

上述的持久化方式是可行的,但是有一些问题,那就是Deployment资源与持久化volumes没有解耦,这样nfs服务器信息就会暴露,这里就是用PVC(PersistentVolumeClaim)和PV(PersistentVolume)。它们是集群中提供的连个新的API资源。

PV是集群中由管理员配置的网络存储,是容量插件,获取存储实现的详细信息,比如NFS等。

PVC是由用户进行存储的请求,PVC消耗PV资源,PVC和PV是一一对应的,它们之间可以通过比如容量等条件进行匹配。

 2、使用

 如果需要应用必定需要PVC和PV,那么首先定义PV文件:

  • pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data
    server: 192.168.35.9

执行并且查看:

# 执行
[root@k8smaster ~]# kubectl create -f pv.yaml 
persistentvolume/my-pv created

# 查看
[root@k8smaster ~]# kubectl get PersistentVolume
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
my-pv   5Gi        RWX            Retain           Available                                   10s
  •  pvc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-dep1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: wwwroot
          mountPath: /usr/share/nginx/html
        ports:
        - containerPort: 80
      volumes:
      - name: wwwroot
        persistentVolumeClaim:
          claimName: my-pvc

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

在pvc中定义了5Gi容量的请求资源,它会去寻找这个匹配容量资源的pv。

执行并且查看:

# 执行
[root@k8smaster ~]# kubectl create -f pvc.yaml 
deployment.apps/nginx-dep1 created

# 查看
persistentvolumeclaim/my-pvc created
[root@k8smaster ~]# kubectl get PersistentVolumeClaim
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc   Bound    my-pv    5Gi        RWX                           21s
[root@k8smaster ~]# kubectl get pod
NAME                                                READY   STATUS              RESTARTS   AGE
nginx-dep1-58b7bf955f-mmz4q                         0/1     ContainerCreating   0          29s
nginx-dep1-58b7bf955f-rcg7t                         0/1     ContainerCreating   0          29s
nginx-dep1-58b7bf955f-zwxwx                         1/1     Running             0          29s
  • 测试
# 在某个deployment资源中添加文件index1.html
[root@k8smaster ~]# kubectl exec -it nginx-dep1-58b7bf955f-mmz4q bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
root@nginx-dep1-58b7bf955f-mmz4q:/# cd /usr/share/ 
X11/             debconf/         gcc-8/           man/             polkit-1/
adduser/         debianutils/     gdb/             menu/            readline/
base-files/      dict/            info/            misc/            sensible-utils/
base-passwd/     doc/             java/            nginx/           tabset/
bash-completion/ doc-base/        keyrings/        pam/             terminfo/
bug/             dpkg/            libc-bin/        pam-configs/     xml/
ca-certificates/ fontconfig/      lintian/         perl5/           zoneinfo/
common-licenses/ fonts/           locale/          pixmaps/         zsh/
root@nginx-dep1-58b7bf955f-mmz4q:/# cd /usr/share/nginx/html/
root@nginx-dep1-58b7bf955f-mmz4q:/usr/share/nginx/html# ls
index.html
root@nginx-dep1-58b7bf955f-mmz4q:/usr/share/nginx/html# touch index1.html
root@nginx-dep1-58b7bf955f-mmz4q:/usr/share/nginx/html# ls
index.html  index1.html

# 在nfs服务器挂载目录中查看
[root@nfs-server data]# ll
总用量 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 6月  28 15:34 index1.html
-rw-r--r--. 1 nfsnobody nfsnobody 0 6月  28 05:34 index.html

 

posted @ 2021-06-29 20:51  iveBoy  阅读(235)  评论(0编辑  收藏  举报
TOP