八 、 k8s volume 本地存储和网络存储

volume 根据使用可以分为以下三类

  1. Volume 本地和网络数据卷
  2. PersistentVolume 持久数据卷
  3. PersistentVolume 动态供给 数据卷

参考;https://kubernetes.io/docs/concepts/storage/volumes/
Volume:
• Kubernetes中的Volume提供了在容器中挂载外部存储的能力
• Pod需要设置卷来源(spec.volume)和挂载点(spec.containers.volumeMounts)两个
信息后才可以使用相应的Volume

volume中的本地本地数据卷和网络数据卷:

本地数据卷:emptyDir、hostPath
网络数据卷:NFS

emptyDir(空目录)

创建一个空卷,挂载到Pod中的容器。Pod删除该卷也会被删除。 应用场景:Pod中容器之间数据共享,
我们可以创建2个容器,一个写,一个读,来测试我们数据是否共享

[root@master volume]# cat empty.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: write
    image: busybox
    command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"]
    volumeMounts:
      #根据下面的数据卷名字使用名为data的数据卷,挂载在/data下面
      - name: data
        mountPath: /data

  - name: read
    image: centos
    command: ["bash","-c","tail -f /data/hello"]
    volumeMounts:
      #根据下面的数据卷名字使用名为data的数据卷,挂载在/data下面
      - name: data
      mountPath: /data

  #定义一个数据卷来源
  volumes:
  #定义数据卷名字
  - name: data
    emptyDir: {}

这样,我们2个容器都将名为data的数据卷挂载在/data目录下,
创建:

kubectl create -f empty.yaml

检测:

kubectl logs my-pod -c write

这个下面因为写入没有日志。

kubectl logs my-pod -c read
1
2
3

因为我们是每隔一秒写入,所以我们能够不停的看见打印的数据。

hostPath(本地挂载)

挂载Node文件系统上文件或者目录到Pod中的容器。 应用场景:Pod中容器需要访问宿主机文件

[root@master volume]# cat hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 36000
   # 挂载点
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data
    #挂载来源,宿主机的/tmp目录
    hostPath:
      path: /tmp
      type: Directory

创建:

kubectl create -f hostpath.yaml

查看pod具体在那个node上面:

[root@master volume]# kubectl get pods -o wide
NAME                              READY   STATUS      RESTARTS   AGE    IP             NODE           NOMINATED NODE
my-pod                            1/1     Running     0          20m    172.17.33.3    192.168.1.40   

此时我们知道pod在node 192.168.1.40上面运行,此时,我们可以查看192.168.1.40上的/tmp目录里面的数据是否在容器中展示:
node 192.168.1.40中:

[root@k8s-g1 tmp]# ls
mongodb-27017.sock  zabbix_agentd.log  zabbix_agentd.pid
[root@k8s-g1 tmp]# touch 1.txt
[root@k8s-g1 tmp]# ls
1.txt  mongodb-27017.sock  zabbix_agentd.log  zabbix_agentd.pid

我们进入pod中:

kubectl exec -it my-pod sh
/ # ls /data/
1.txt               mongodb-27017.sock  zabbix_agentd.log   zabbix_agentd.pid

此时,我们可以看到宿主机上/tmp上的数据,成功展示在pod 的/data目录下

NFS(文件共享存储,网络卷)

安装nfs:(需要使用nfs服务,每台机器都需要安装)

yum install -y nfs-utils

此处我们设置192.168.1.39为服务端,配置/opt/container_data 目录共享出来,并且具有读写权限

[root@master volume]# cat /etc/export
/opt/container_data 192.168.1.0/24(rw,no_root_squash)

此时,我们在客户端的时候,不用刻意去用mount 挂载,因为k8s会帮我们自动挂载
nfs部署yaml文件:

[root@master volume]# cat nfs.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        #启用数据卷的名字为wwwroot,并挂载到nginx的html目录下
        volumeMounts:
        - name: wwwroot
          mountPath: /usr/share/nginx/html
        ports:
        - containerPort: 80
    #定义数据卷名字为wwwroot,类型为nfs
      volumes:
      - name: wwwroot
        nfs:
          server: 192.168.1.39
          path: /opt/container_data

创建:

kubectl create -f nfs.yaml

查看挂载点下的文件:

[root@master container_data]# ls
index.html  test.html  wordpress  wordpress-4.7.4-zh_CN.tar.gz  wp-mysql  wp-wwwroot
[root@master container_data]# echo "xianrenqiu" > index.html

根据kubectl get all
找到一个对应的pod,查看 /usr/share/nginx/html 下面是否有挂载进来的数据:

 kubectl exec -it pod/nginx-deployment-98c677b96-fc9rl sh
# ls /usr/share/nginx/html
index.html  test.html  wordpress  wordpress-4.7.4-zh_CN.tar.gz	wp-mysql  wp-wwwroot
# more /usr/share/nginx/html/index.html
xianrenqiu

测试页面显示:
#找到ip

kubectl get pod -o wide 

在node上面测试:

[root@k8s-g1 tmp]# curl 172.17.33.4
xianrenqiu

你可能感兴趣的:(k8s)