精华内容
下载资源
问答
  • Volumes

    千次阅读 2020-11-23 09:02:50
    Volumes 学习对象:kubectl explain pod.spec.volumes、pod.spec.containers.image.volumeMounts 介绍Volumes 容器内部也有自己的空间,但这里面保存的数据会在容器重启后就没了;所以为了保证容器重新启动时,数据...

    Volumes

    学习对象:kubectl explain pod.spec.volumespod.spec.containers.image.volumeMounts

    介绍Volumes

    容器内部也有自己的空间,但这里面保存的数据会在容器重启后就没了;所以为了保证容器重新启动时,数据保存不丢失,可以使用Volume挂载到pod上;另外,如果一个Pod中有多个容器,那么这个卷可以同时被所有的容器使用。

    多容器的Pod中,容器之间无法互相访问彼此里面存的东西,所以可以用Volume来实现。

    使用Volume首先要弄清楚:.spec.volumes.spec.containers.image.volumeMounts

    spec:
      containers:
      - image: demoimage:latest
        name: containername
        volumeMounts:
        - name: thisVolumeName      # 和下面保持一致
          mountPath: /data          # 挂载在容器内的路径
          readOnly: true
      volumes:
      - name: thisVolumeName        # 保持一致
        emptyDir: {}                # 一种volume类型
    
    • .spec.volumes.name.spec.containers.image.volumeMounts.name这样就可以将volume挂载到容器的对应位置;
    • 挂载点路径不存在的话是会自动创建的,而且可以设置挂载点权限readOnly: true;

    当我设置readOnly: true,在容器中看挂载文件夹的权限是777,但尝试写入时:

    # touch aaa
    touch: aaa: Read-only file system
    

    Volume重要参数

    持续更新ing

    subPath

    挂载到一个容器里已有的文件夹,如挂载volume到容器的/etc下,那么/etc下的所有原有文件都会被覆盖;

    我们只是想把某少量文件,放到容器内原有的文件夹里,不对原有文件更改,

    1. K8s提供了 volumeMounts.subPath 属性用于挂在单个文件而不是整个目录。
    spec:
        containers:
        - name: php
          image: php:7.0-apache
          volumeMounts:
          - mountPath: /var/www/html/index.php
            name: index
            subPath: indexaaa.php    
        volumes:
        - name: index
          configMap:
            name: php-index
            items:
            - key: index.php
              path: indexaaa.php      # configmap中的目录index.php对应的值给了相对路径 indexaaa.php,所以上面的subpath要用 相对路径indexaaa.php
    
    1. 用subpath挂载文件夹到容器内已存在文件夹里
    spec:
        containers:
        - name: mysql
          image: mysql
          volumeMounts:
          - mountPath: /var/lib/mysql
            name: site-data
            subPath: mysql               # /var/lib/mysql/mysql
        - name: php
          image: php
          volumeMounts:
          - mountPath: /var/www/html
            name: site-data
            subPath: html                # 
        volumes:
        - name: site-data
          persistentVolumeClaim: xxx
    

    Volume的类型

    目标对象:kubectl explain pod.spec.volumes

    volume有太多类型,会详细介绍一些,官网有每一种Volume的具体使用方式 https://v1-18.docs.kubernetes.io/zh/docs/concepts/storage/volumes/:

    EmptyDir

    emptyDir卷对于在同一个pod中运行的容器之间共享文件特别有用。但是它用于将数据临时写入磁盘,当删除pod时卷的数据就会丢失。

    使用emptyDir

    spec:
      containers:
      - image: luksa/fortune
        name: html-generator
        volumeMounts:
        - name: html
          mountPath: /var/htdocs
      volumes:
      - name: html
        emptyDir: {}
    

    使用emptyDir创建的volume实际是在节点磁盘上创建的,我们可以将这个暂时存在的volume(tmfs)创建在内存上:

      volumes:
      - name: html
        emptyDir: {}
          medium: Memory
    

    HostPath:访问节点主机上的文件

    HostPath卷需要和节点绑定,hostPath中的路径是Pod创建节点的绝对路径;

    Pod删除后该路径下的数据不会被删除;

    apiVersion: v1
    kind: Pod
    metadata:
      name: hostpath-pod
    spec:
      nodeSelector: 
        kubernetes.io/hostname: nodename
      containers:
      - image: hub-mirror.c.163.com/library/busybox
        name: busybox
        args:
        - /bin/sh
        - -c
        - sleep 10; touch /tmp/healthy; sleep 30000
        volumeMounts:
        - name: test
          mountPath: /data/test
      volumes:
      - name: test
        hostPath:
          path: /home/rancher/test
    

    NFS

    这个和NFS的StorageClass不同,这种会将nfs的整个资源池挂载在pod里,而不是在里面创建一个文件夹给pod使用的这种形式。

    spec:
        containers:
        - name: php
          image: php:7.0-apache
          volumeMounts:
          - mountPath: /var/www/html/index.php
            name: index
            subPath: index.php
    

    ISCSI

    建议先使用:kubectl explain pod.spec.volumes.iscsi

    spec:
      volumes:
      - name: iscsipd-rw
        iscsi:
          targetPortal: 10.0.2.15:3260
          portals: ['10.0.2.16:3260', '10.0.2.17:3260']			 # 没有多个可以省略
          iqn: iqn.2001-04.com.example:storage.kube.sys1.xyz # iscsi target端的iqn
          lun: 0
          fsType: ext4
          readOnly: true
    
    展开全文
  • cesium-sensor-volumes.js

    2021-07-28 16:22:11
    适用于Cesium1.58版本
  • VMware App Volumes部署、VMware App Volumes安装配置、VMware App Volumes安装手册、VMware应用虚拟化、即时应用交付
  • Volumes Bind mounts tmpfs mounts 下图展示了这三种技术: Volumes Volumes(数据卷)是一个可供一个或多个容器使用的位于宿主机上特殊目录,它拥有以下特性: 数据卷可以在容器间共享和重用 对数据卷的写入...
  • VMware_App_Volumes_POC部署

    2018-09-19 13:12:14
    VMware_App_Volumes_POC部署,
  • Docker卷备份 该脚本允许您从tar.gz文件中的容器备份所有卷。 备份容器 $ ./backup-docker.sh [Your container] 例子 $ ./backup-docker.sh ...$ docker run --volumes-from [Your container] -v $( pwd ) :/backup
  • Volumes方法的二维Matlab缩减。 注释中提供了初始条件和其他参数。 该脚本会自动生成并运行模拟执行的电影文件。 从高强度激光相互作用在目标中心产生密度和温度峰值的那一刻开始,这两种环境都可以模拟ICF目标的...
  • The Art of Computer Programming, Volumes 1
  • 无法上传到百度文库,在这分享给大家 CFA Level I 教材名称: Volume 1: Ethical and professional Standards, Quantitative Methods Volume 2: Economics Volume 3: Financial Statement Volume 4: Corporate ...
  • AppVolumes基本介绍.docx

    2019-12-19 07:23:05
    AppVolumes基本介绍.docx
  • emptyDir卷 ...[root@server2 ~]# mkdir volumes [root@server2 ~]# cd volumes/ [root@server2 volumes]# vim emptydir.yaml apiVersion: v1 kind: Pod metadata: name: vol1 spec: containers: - i.

    在这里插入图片描述

    emptyDir卷

    在这里插入图片描述

    在这里插入图片描述

    emptyDir 示例

    [root@server2 ~]# kubectl delete pod mypod --force 
    [root@server2 ~]# mkdir volumes
    [root@server2 ~]# cd volumes/
    
    [root@server2 volumes]# vim emptydir.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: vol1
    spec:
      containers:
      - image: busyboxplus
        name: vm1
        stdin: true
        tty: true
        volumeMounts:
        - mountPath: /cache
          name: cache-volume
      - name: vm2
        image: myapp:v1
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: cache-volume
      volumes:
      - name: cache-volume
        emptyDir:
          medium: Memory
          sizeLimit: 100Mi
    
    [root@server2 volumes]# kubectl apply -f emptydir.yaml 
    [root@server2 volumes]# kubectl get pod
    [root@server2 volumes]# kubectl describe pod vol1 
    

    在这里插入图片描述

    在这里插入图片描述

    [root@server2 volumes]# kubectl get pod -o wide
    

    在这里插入图片描述

    [root@server2 volumes]# kubectl attach vol1 -c vm1 -it
    / # cd /cache/
    /cache # echo www.westos.org > index.html
    /cache # curl localhost
    

    在这里插入图片描述

    emptyDir缺点

    在这里插入图片描述

    [root@server2 volumes]# kubectl attach vol1 -c vm1 -it
    / # cd cache/
    /cache # dd if=/dev/zero of=bigfile bs=1M count=200
    
    [root@server2 volumes]# kubectl get pod
    

    可以看到文件超过sizelimit,则一段时间后会被kubelet evict掉。之所以不是立即被evict,是因为kubelet是定期检查的,这里会有一个时间差
    在这里插入图片描述

    [root@server2 volumes]# kubectl delete pod vol1 
    

    hostPath卷

    在这里插入图片描述

    • 除了必要的path属性之外,用户可以选择性地为hostpath卷指定type

    在这里插入图片描述

    hostPath示例

    [root@server2 volumes]# vim hostpath.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pd
    spec:
      containers:
      - image: myapp:v1
        name: vm1
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: test-volume
      volumes:
      - name: test-volume
        hostPath:
          path: /webdata
          type: DirectoryOrCreate
    
    [root@server2 volumes]# kubectl apply -f hostpath.yaml 
    [root@server2 volumes]# kubectl get pod -o wide
    [root@server2 volumes]# curl 10.244.22.25
    

    在这里插入图片描述
    在server4节点写入

    [root@server4 ~]# cd /webdata/
    [root@server4 webdata]# echo www.westos.org > index.html
    

    在访问

    [root@server2 volumes]# curl 10.244.22.25
    

    在这里插入图片描述

    [root@server2 volumes]# kubectl delete pod test-pd 
    

    删除容器后,srver4的写入的内容并不会被删除

    在这里插入图片描述

    NFS

    [root@server2 volumes]# vim nfs.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: nfs-pd
    spec:
      containers:
      - image: myapp:v1
        name: vm1
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: test-volume
      volumes:
      - name: test-volume
        nfs:
          server: 192.168.3.201
          path: /nfsdata
    
    [root@server1 ~]# yum install -y nfs-utils
    每个节点尽量都安装一下
    [root@server1 ~]# vim /etc/exports
    /nfsdata        *(rw,no_root_squash)
    
    [root@server1 ~]# systemctl enable --now nfs
    [root@server1 ~]# showmount -e
    

    在这里插入图片描述

    [root@server4 webdata]# yum install -y nfs-utils
    
    [root@server2 volumes]# kubectl apply -f nfs.yaml 
    [root@server2 volumes]# kubectl get pod -o wide
    [root@server2 volumes]# curl 10.244.22.26
    

    在这里插入图片描述

    [root@server1 nfsdata]# rm -rf *
    [root@server1 nfsdata]# echo www.westos.org > index.html
    
    [root@server2 volumes]# curl 10.244.22.26
    

    在这里插入图片描述

    PersistentVolume (持久卷,简称PV)

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    NFS PV 示例

    清理实验环境

    [root@server2 volumes]# kubectl delete nfs.yaml 
    

    编写文件

    [root@server2 volumes]# vim pv1.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv1
    spec:
      capacity:
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      storageClassName: nfs
      nfs:
        path: /nfsdata/pv1
        server: 192.168.3.201
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv2
    spec:
      capacity:
        storage: 10Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Recycle
      storageClassName: nfs
      nfs:
        path: /nfsdata/pv2
        server: 192.168.3.201
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv3
    spec:
      capacity:
        storage: 20Gi
      volumeMode: Filesystem
      accessModes:
        - ReadOnlyMany
      persistentVolumeReclaimPolicy: Recycle
      storageClassName: nfs
      nfs:
        path: /nfsdata/pv3
        server: 192.168.3.201
    
    [root@server2 volumes]# vim pvc.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc1
    spec:
      storageClassName: nfs
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc2
    spec:
      storageClassName: nfs
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
    
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pd
    spec:
      containers:
      - image: myapp:v1
        name: nginx
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: nfs-pv
      volumes:
      - name: nfs-pv
        persistentVolumeClaim:
          claimName: pvc1
    
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pd-2
    spec:
      containers:
      - image: myapp:v1
        name: nginx
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: nfs-pv-2
      volumes:
      - name: nfs-pv-2
        persistentVolumeClaim:
          claimName: pvc2
    
    [root@server1 nfsdata]# rm -rf *
    [root@server1 nfsdata]# mkdir pv1 pv2 pv3
    [root@server1 nfsdata]# cd pv1
    [root@server1 pv1]# echo www.westos.org > index.html
    [root@server1 pv1]# cd ../pv2
    [root@server1 pv2]# echo www.redhat.com > index.html
    

    在这里插入图片描述

    [root@server2 volumes]# kubectl apply -f pv1.yaml 
    [root@server2 volumes]# kubectl apply -f pvc.yaml 
    [root@server2 volumes]# kubectl get  pv
    [root@server2 volumes]# kubectl get  pvc
    

    在这里插入图片描述

    [root@server2 volumes]# kubectl get  pod -o wide
    

    在这里插入图片描述
    删除一个pvc后

    [root@server2 volumes]# kubectl delete pvc pvc2 
    [root@server2 volumes]# kubectl get pv
    

    在这里插入图片描述

    此处的文件也会被回收

    [root@server1 pv2]# ll
    

    在这里插入图片描述

    清理环境

    [root@server2 volumes]# kubectl delete -f pvc.yaml
    [root@server2 volumes]# kubectl delete -f pv1.yaml
    

    同理此处文件被清理
    在这里插入图片描述

    [root@server1 nfsdata]# rm -rf *
    

    动态卷

    在这里插入图片描述
    在这里插入图片描述
    上传所需镜像

    [root@server1 ~]# docker load -i nfs-client-provisioner-v4.0.0.tar
    [root@server1 harbor]# docker push reg.westos.org/library/nfs-subdir-external-provisioner:v4.0.0
    

    创建实验目录

    [root@server2 ~]# cd volumes/
    [root@server2 volumes]# mkdir nfs-client
    [root@server2 ~]# cd volumes/nfs-client/
    

    编写代码

    参考代码请点击

    [root@server2 nfs-client]# vim nfs-client-provisioner.yaml 
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: nfs-client-provisioner
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: nfs-client-provisioner-runner
    rules:
      - apiGroups: [""]
        resources: ["persistentvolumes"]
        verbs: ["get", "list", "watch", "create", "delete"]
      - apiGroups: [""]
        resources: ["persistentvolumeclaims"]
        verbs: ["get", "list", "watch", "update"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses"]
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources: ["events"]
        verbs: ["create", "update", "patch"]
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: run-nfs-client-provisioner
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        # replace with namespace where provisioner is deployed
        namespace: nfs-client-provisioner
    roleRef:
      kind: ClusterRole
      name: nfs-client-provisioner-runner
      apiGroup: rbac.authorization.k8s.io
    ---
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: nfs-client-provisioner
    rules:
      - apiGroups: [""]
        resources: ["endpoints"]
        verbs: ["get", "list", "watch", "create", "update", "patch"]
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: nfs-client-provisioner
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        # replace with namespace where provisioner is deployed
        namespace: nfs-client-provisioner
    roleRef:
      kind: Role
      name: leader-locking-nfs-client-provisioner
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nfs-client-provisioner
      labels:
        app: nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: nfs-client-provisioner
    spec:
      replicas: 1
      strategy:
        type: Recreate
      selector:
        matchLabels:
          app: nfs-client-provisioner
      template:
        metadata:
          labels:
            app: nfs-client-provisioner
        spec:
          serviceAccountName: nfs-client-provisioner
          containers:
            - name: nfs-client-provisioner
              image: nfs-subdir-external-provisioner:v4.0.0
              volumeMounts:
                - name: nfs-client-root
                  mountPath: /persistentvolumes
              env:
                - name: PROVISIONER_NAME
                  value: k8s-sigs.io/nfs-subdir-external-provisioner
                - name: NFS_SERVER
                  value: 192.168.3.201
                - name: NFS_PATH
                  value: /nfsdata
          volumes:
            - name: nfs-client-root
              nfs:
                server: 192.168.3.201
                path: /nfsdata
    ---
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: managed-nfs-storage
    provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
    parameters:
      archiveOnDelete: "true"
    
    [root@server2 ~]# vim pvc.yaml 
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-claim
    spec:
      storageClassName: managed-nfs-storage
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 2Gi
    ---
    kind: Pod
    apiVersion: v1
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-pod
        image: myapp:v1
        volumeMounts:
          - name: nfs-pvc
            mountPath: "/usr/share/nginx/html"
      volumes:
        - name: nfs-pvc
          persistentVolumeClaim:
            claimName: test-claim
    

    创建独自的namespace

    [root@server2 nfs-client]# kubectl create namespace nfs-client-provisioner
    [root@server2 nfs-client]# kubectl get ns
    

    在这里插入图片描述
    运行

    [root@server2 nfs-client]# kubectl apply -f nfs-client-provisioner.yaml -n nfs-client-provisioner
    [root@server2 nfs-client]# kubectl get sc
    

    在这里插入图片描述

    [root@server2 nfs-client]# kubectl apply -f pvc.yaml 
    [root@server2 nfs-client]# kubectl get pvc
    [root@server2 nfs-client]# kubectl get pv
    

    在这里插入图片描述
    查看文件会自动生成,编写一个发布目录

    [root@server1 nfsdata]# ls
    [root@server1 nfsdata]# cd default-test-claim-pvc-8443c14a-b355-476c-a819-c3083b4e1177/
    [root@server1 default-test-claim-pvc-8443c14a-b355-476c-a819-c3083b4e1177]# echo www.westos.org > index.html
    

    在这里插入图片描述
    查看ip并访问

    [root@server2 nfs-client]# kubectl get pod -o wide
    

    在这里插入图片描述

    在这里插入图片描述

    StatefulSet

    在这里插入图片描述

    清理实验环境
    在这里插入图片描述

    [root@server2 ~]# cd volumes/
    [root@server2 volumes]# mkdir statefulset
    [root@server2 volumes]# cd statefulset/
    
    [root@server2 statefulset]# vim service.yaml
    apiVersion: v1
    kind: Service
    metadata:
     name: nginx-svc
     labels:
      app: nginx
    spec:
     ports:
     - port: 80
       name: web
     clusterIP: None
     selector:
      app: nginx
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
     name: web
    spec:
     serviceName: "nginx-svc"
     replicas: 2
     selector:
      matchLabels:
       app: nginx
     template:
      metadata:
       labels:
        app: nginx
      spec:
       containers:
       - name: nginx
         image: myapp:v1
         ports:
         - containerPort: 80
           name: web
         volumeMounts:
           - name: www
             mountPath: /usr/share/nginx/html
     volumeClaimTemplates:
      - metadata:
         name: www
        spec:
         storageClassName: managed-nfs-storage
         accessModes:
         - ReadWriteOnce
         resources:
          requests:
           storage: 1Gi
    
    [root@server2 statefulset]# kubectl apply -f service.yaml
    [root@server2 statefulset]# kubectl get pod
    [root@server2 statefulset]# kubectl get pvc
    [root@server2 statefulset]# kubectl get pv
    

    在这里插入图片描述

    [root@server1 harbor]# cd /nfsdata/
    [root@server1 nfsdata]# ls
    [root@server1 nfsdata]# echo web-0 > default-www-web-0-pvc-c05e881a-4fdb-46d5-8e63-6b9c7cb73ff0/index.html
    [root@server1 nfsdata]# echo web-1 > default-www-web-1-pvc-c07040d3-077c-4b3d-90c2-ddf83380d407/index.html
    

    在这里插入图片描述

    [root@server2 statefulset]# kubectl get pod -o wide
    

    在这里插入图片描述
    重建后ip会变化,在容器内访问

    [root@server2 statefulset]# kubectl run demo --image=busyboxplus -it
    

    在这里插入图片描述
    删除

    [root@server2 statefulset]# vim service.yaml
    

    在这里插入图片描述

    [root@server2 statefulset]# kubectl apply -f service.yaml
    [root@server2 statefulset]# kubectl get pod
    

    从下到上慢慢关闭
    在这里插入图片描述
    开启

    [root@server2 statefulset]# vim service.yaml
    

    在这里插入图片描述

    [root@server2 statefulset]# kubectl apply -f service.yaml
    [root@server2 statefulset]# kubectl get pod
    

    从上至下开启
    在这里插入图片描述
    访问不变

    [root@server2 statefulset]# kubectl attach demo -it
    

    在这里插入图片描述

    使用statefullset部署mtsql主从集群

    在这里插入图片描述
    清理实验环境

    [root@server2 statefulset]# kubectl delete -f service.yaml 
    [root@server2 statefulset]# kubectl delete pod demo --force 
    [root@server2 statefulset]# kubectl delete pvc --all
    [root@server2 statefulset]# kubectl delete cm cm1-config my-config my-config-2 my-config-3 nginx-config
    
    [root@server2 statefulset]# mkdir mysql
    [root@server2 statefulset]# cd mysql/
    [root@server2 mysql]# vim configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mysql
      labels:
        app: mysql
    data:
      master.cnf: |
        # Apply this config only on the master.
        [mysqld]
        log-bin    
      slave.cnf: |
        # Apply this config only on slaves.
        [mysqld]
        super-read-only
    
    [root@server2 mysql]# kubectl apply -f configmap.yaml 
    [root@server2 mysql]# kubectl get cm
    [root@server2 mysql]# kubectl describe cm mysql
    

    在这里插入图片描述

    [root@server2 mysql]# vim service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
      labels:
        app: mysql
    spec:
      ports:
      - name: mysql
        port: 3306
      clusterIP: None
      selector:
        app: mysql
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-read
      labels:
        app: mysql
    spec:
      ports:
      - name: mysql
        port: 3306
      selector:
        app: mysql
    
    [root@server2 mysql]# kubectl apply -f service.yaml 
    [root@server2 mysql]# kubectl get svc
    

    在这里插入图片描述

    [root@server1 nfsdata]# docker pull mysql:5.7
    [root@server1 nfsdata]# docker tag mysql:5.7 reg.westos.org/library/mysql:5.7
    [root@server1 nfsdata]# docker push reg.westos.org/library/mysql:5.7
    

    gcr.io/google-samples/xtrabackup:1.0这个镜像拉取不到

    [root@server2 mysql]# vim statefulset.yaml 
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
    spec:
      selector:
        matchLabels:
          app: mysql
      serviceName: mysql
      replicas: 3
      template:
        metadata:
          labels:
            app: mysql
        spec:
          initContainers:
          - name: init-mysql
            image: mysql:5.7
            command:
            - bash
            - "-c"
            - |
              set -ex
              # Generate mysql server-id from pod ordinal index.
              [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
              ordinal=${BASH_REMATCH[1]}
              echo [mysqld] > /mnt/conf.d/server-id.cnf
              # Add an offset to avoid reserved server-id=0 value.
              echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf
              # Copy appropriate conf.d files from config-map to emptyDir.
              if [[ $ordinal -eq 0 ]]; then
                cp /mnt/config-map/master.cnf /mnt/conf.d/
              else
                cp /mnt/config-map/slave.cnf /mnt/conf.d/
              fi          
            volumeMounts:
            - name: conf
              mountPath: /mnt/conf.d
            - name: config-map
              mountPath: /mnt/config-map
          - name: clone-mysql
            image: xtrabackup:1.0
            command:
            - bash
            - "-c"
            - |
              set -ex
              # Skip the clone if data already exists.
              [[ -d /var/lib/mysql/mysql ]] && exit 0
              # Skip the clone on master (ordinal index 0).
              [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
              ordinal=${BASH_REMATCH[1]}
              [[ $ordinal -eq 0 ]] && exit 0
              # Clone data from previous peer.
              ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql
              # Prepare the backup.
              xtrabackup --prepare --target-dir=/var/lib/mysql          
            volumeMounts:
            - name: data
              mountPath: /var/lib/mysql
              subPath: mysql
            - name: conf
              mountPath: /etc/mysql/conf.d
          containers:
          - name: mysql
            image: mysql:5.7
            env:
            - name: MYSQL_ALLOW_EMPTY_PASSWORD
              value: "1"
            ports:
            - name: mysql
              containerPort: 3306
            volumeMounts:
            - name: data
              mountPath: /var/lib/mysql
              subPath: mysql
            - name: conf
              mountPath: /etc/mysql/conf.d
            resources:
              requests:
                cpu: 500m
                memory: 512Mi
            livenessProbe:
              exec:
                command: ["mysqladmin", "ping"]
              initialDelaySeconds: 30
              periodSeconds: 10
              timeoutSeconds: 5
            readinessProbe:
              exec:
                # Check we can execute queries over TCP (skip-networking is off).
                command: ["mysql", "-h", "127.0.0.1", "-e", "SELECT 1"]
              initialDelaySeconds: 5
              periodSeconds: 2
              timeoutSeconds: 1      
          - name: xtrabackup
            image: xtrabackup:1.0
            ports:
            - name: xtrabackup
              containerPort: 3307
            command:
            - bash
            - "-c"
            - |
              set -ex
              cd /var/lib/mysql
    
              # Determine binlog position of cloned data, if any.
              if [[ -f xtrabackup_slave_info && "x$(<xtrabackup_slave_info)" != "x" ]]; then
                # XtraBackup already generated a partial "CHANGE MASTER TO" query
                # because we're cloning from an existing slave. (Need to remove the tailing semicolon!)
                cat xtrabackup_slave_info | sed -E 's/;$//g' > change_master_to.sql.in
                # Ignore xtrabackup_binlog_info in this case (it's useless).
                rm -f xtrabackup_slave_info xtrabackup_binlog_info
              elif [[ -f xtrabackup_binlog_info ]]; then
                # We're cloning directly from master. Parse binlog position.
                [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1
                rm -f xtrabackup_binlog_info xtrabackup_slave_info
                echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\
                      MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.in
              fi
    
              # Check if we need to complete a clone by starting replication.
              if [[ -f change_master_to.sql.in ]]; then
                echo "Waiting for mysqld to be ready (accepting connections)"
                until mysql -h 127.0.0.1 -e "SELECT 1"; do sleep 1; done
    
                echo "Initializing replication from clone position"
                mysql -h 127.0.0.1 \
                      -e "$(<change_master_to.sql.in), \
                              MASTER_HOST='mysql-0.mysql', \
                              MASTER_USER='root', \
                              MASTER_PASSWORD='', \
                              MASTER_CONNECT_RETRY=10; \
                            START SLAVE;" || exit 1
                # In case of container restart, attempt this at-most-once.
                mv change_master_to.sql.in change_master_to.sql.orig
              fi
    
              # Start a server to send backups when requested by peers.
              exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \
                "xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root"          
            volumeMounts:
            - name: data
              mountPath: /var/lib/mysql
              subPath: mysql
            - name: conf
              mountPath: /etc/mysql/conf.d
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
          volumes:
          - name: conf
            emptyDir: {}
          - name: config-map
            configMap:
              name: mysql
      volumeClaimTemplates:
      - metadata:
          name: data
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 5Gi
    
    [root@server2 mysql]# kubectl apply -f statefulset.yaml 
    [root@server2 mysql]# yum insatll -y myriadb
    
    [root@server2 mysql]# kubectl get svc
    [root@server2 mysql]# kubectl get pod -o wide
    [root@server2 mysql]# mysql -h 容器ip
    

    在这里插入图片描述
    自动生成目录

    [root@server1 ~]# cd /nfsdata/
    [root@server1 nfsdata]# ls
    
    展开全文
  • tore_volumes 用于生成和测试TORE卷的源代码 该代码已在运行MATLAB 2019b / 2020b的Ubuntu 18.04系统(i7-8700 CPU,64GB RAM和GeForce RTX 2080Ti GPU)上进行了测试。 需要Matlab的图像处理,计算机视觉,ROS和...
  • k8s volumes 实践

    千次阅读 2019-04-23 19:01:13
    一、linux下命令行删除上一个字符使用ctrl-h,删除光标到行首使用ctrl-u,删除光标到行尾使用ctrl-k,跳转到上...以上这些是常用命令,删除上一个单词的快捷键ctrl-w二、k8s volumes 实践 实践1:应用创建hostPath类型...

    一、linux下命令行删除上一个字符使用ctrl-h,删除光标到行首使用ctrl-u,删除光标到行尾使用ctrl-k,跳转到上一个单词使用alt-b,跳转到下一个单词使用alt-f,跳转到行首使用ctrl-a,跳转到行尾使用ctrl-e,搜索历史命令使用ctrl-r。以上这些是常用命令,删除上一个单词的快捷键ctrl-w
    二、k8s volumes 实践
        实践1:应用创建hostPath类型(node节点本机)存储卷
        [root@k8s-master vol]# mkdir -p /k8s/vol
        [root@k8s-master vol]# cd /k8s/vol
        [root@k8s-master vol]# vi nginx-deploy-vol.yaml

            apiVersion: apps/v1
            kind: Deployment
            metadata:
              name: nginx-vol-deploy
              namespace: default
            spec:
              selector:
                matchLabels:
                  app: nginx-vol-pod
              replicas: 2
              template:
                metadata:
                  labels:
                    app: nginx-vol-pod
                spec:
                  containers:
                  - name: nginx-containers
                    image: nginx
                    volumeMounts:
                    - name: html
                      mountPath: /usr/share/nginx/html/
                  volumes:
                  - name: html
                    hostPath:
                      path: /k8s/vol/nginx-vol
                      type: DirectoryOrCreate
        [root@k8s-node1 /]# mkdir -p /k8s/vol/nginx-vol && cd /k8s/vol/nginx-vol
        [root@k8s-node1 /]# echo 161 > index.html

        注1:如果在node上没有事先创建挂载路径,根据type: DirectoryOrCreate会在node节点上创建对应的路径;
        注2:如果在此目录下没有加入任何文件,curl pod的url,则nginx会返回403,因为外面的存储卷会覆盖原来在镜像中的数据!

        [root@k8s-node2 /]# mkdir -p /k8s/vol/nginx-vol && cd /k8s/vol/nginx-vol
        [root@k8s-node2 /]# echo 171 > index.html

        此时,curl pod的url,则nginx会返回161或171
        
       实践2:应用创建nfs类型(nfs server)存储卷(适用场景:nfs server更改文件,可以同步到多个容器中)
        [root@store01 ~]# yum install -y nfs-utils
        [root@store01 ~]# systemctl stop firewalld.service
        [root@store01 ~]# systemctl disable firewalld.service
        [root@store01 ~]# mkdir -p /k8s/volumes/
        [root@store01 ~]# cd /k8s/volumes/
        [root@store01 volumes]# vim /etc/exports

            /k8s/volumes 192.168.0.0/16(rw,no_root_squash)
        [root@store01 volumes]# systemctl restart nfs
        注1:如果改变挂载路径一定要重启nfs service
        [root@store01 volumes]# systemctl status nfs
            ● nfs-server.service - NFS server and services
               Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
               Active: active (exited) since 二 2019-04-23 06:04:07 CST; 8min ago
              Process: 2842 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
              Process: 2839 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
              Process: 2838 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
              Process: 2869 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl restart gssproxy ; fi (code=exited, status=0/SUCCESS)
              Process: 2852 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
              Process: 2851 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
             Main PID: 2852 (code=exited, status=0/SUCCESS)
                Tasks: 0
               CGroup: /system.slice/nfs-server.service

            4月 23 06:04:07 store01 systemd[1]: Starting NFS server and services...
            4月 23 06:04:07 store01 systemd[1]: Started NFS server and services.
        [root@store01 volumes]# cat /var/log/messages | grep mount
        [root@k8s-node1 /]# yum install -y nfs-utils
        [root@k8s-node2 /]# yum install -y nfs-utils
        [root@k8s-master vol]# vi nginx-deploy-vol-nfs.yaml

            apiVersion: apps/v1
            kind: Deployment
            metadata:
              name: nginx-vol-deploy-nfs
              namespace: default
            spec:
              selector:
                matchLabels:
                  app: nginx-vol-pod-nfs
              replicas: 2
              template:
                metadata:
                  labels:
                    app: nginx-vol-pod-nfs
                spec:
                  containers:
                  - name: nginx-containers-nfs
                    image: nginx
                    volumeMounts:
                    - name: html
                      mountPath: /usr/share/nginx/html/
                  volumes:
                  - name: html
                    nfs:
                      path: /k8s/volumes
                      server: k8s-store1  => 先加到k8s各节点hosts文件中
        [root@k8s-master vol]# kubectl apply -f nginx-deploy-vol-nfs.yaml
        [root@k8s-master vol]# kubectl get pod -owide

            NAME                                   READY   STATUS    RESTARTS   AGE     IP            NODE  
            nginx-vol-deploy-nfs-bf7458b65-4xsnc   1/1     Running   0          3m2s    10.244.1.35   k8s-node1  
            nginx-vol-deploy-nfs-bf7458b65-xjlml   1/1     Running   0          3m2s    10.244.2.29   k8s-node2  
        [root@k8s-master vol]# curl 10.244.1.35
            <html>
            <head><title>403 Forbidden</title></head> ==> 这是因为外部挂载的路径下空文件夹覆盖了容器内部的文件,即删除了index.html文件
            <body>
            <center><h1>403 Forbidden</h1></center>
            <hr><center>nginx/1.15.12</center>
            </body>
            </html>

        [root@k8s-master vol]# kubectl exec -it nginx-vol-deploy-nfs-bf7458b65-4xsnc -- /bin/bash
            root@nginx-vol-deploy-nfs-bf7458b65-4xsnc:/# cd /usr/share/nginx/html/
            root@nginx-vol-deploy-nfs-bf7458b65-4xsnc:/usr/share/nginx/html# echo '<h1>success</h1>' > index.html
            root@nginx-vol-deploy-nfs-bf7458b65-4xsnc:/usr/share/nginx/html# exit
            exit
        [root@k8s-master vol]# curl 10.244.2.29
            <h1>success</h1>
        [root@store01 volumes]# cat index.html
            <h1>success</h1>
       实践3:应用创建 pvc+pv+nfs 类型存储卷(运维、存储工程师分工明细;动态绑定存储卷)
        

        
        1.创建 nfs 挂载目录:
        [root@store01 k8s]# mkdir volume0{1,2,3}
        [root@store01 k8s]# ls

            volume01  volume02  volume03
        [root@store01 k8s]# vi /etc/exports
            /k8s/volume01 192.168.0.0/16(rw,no_root_squash)
            /k8s/volume02 192.168.0.0/16(rw,no_root_squash)
            /k8s/volume03 192.168.0.0/16(rw,no_root_squash)
        [root@store01 k8s]# systemctl restart nfs
        2.在k8s上创建pv资源
        [root@k8s-master vol]# vi nginx-pv.yaml
            ---
            apiVersion: v1
            kind: PersistentVolume
            metadata:
              name: pv01
              labels:
                name: pv01
            spec:
              nfs:
                path: /k8s/volume01
                server: k8s-store1
              accessModes: ["ReadWriteMany","ReadWriteOnce"]
              capacity:
                storage: 2Gi
            ---
            apiVersion: v1
            kind: PersistentVolume
            metadata:
              name: pv02
              labels:
                name: pv02
            spec:
              nfs:
                path: /k8s/volume02
                server: k8s-store1
              accessModes: ["ReadWriteMany","ReadWriteOnce"]
              capacity:
                storage: 1Gi
            ---
            apiVersion: v1
            kind: PersistentVolume
            metadata:
              name: pv03
              labels:
                name: pv03
            spec:
              nfs:
                path: /k8s/volume03
                server: k8s-store1
              accessModes: ["ReadWriteOnce"]
              capacity:
                storage: 5Gi
        [root@k8s-master vol]# kubectl get pv
        NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
        pv01   2Gi        RWO,RWX        Retain           Available                                   9s
        pv02   1Gi        RWO,RWX        Retain           Available                                   9s
        pv03   5Gi        RWO            Retain           Available                                   7s
        3.创建pod与pvc(同一个命名空间)
        [root@k8s-master vol]# vi nginx-deploy-pvc-vol.yaml
            ---
            apiVersion: apps/v1
            kind: Deployment
            metadata:
              name: nginx-vol-deploy
              namespace: default
            spec:
              selector:
                matchLabels:
                  app: nginx-vol-pod
              replicas: 2
              template:
                metadata:
                  labels:
                    app: nginx-vol-pod
                spec:
                  containers:
                  - name: nginx-containers
                    image: nginx
                    volumeMounts:
                    - name: html
                      mountPath: /usr/share/nginx/html/
                  volumes:
                  - name: html
                    persistentVolumeClaim:
                      claimName: nginx-pvc
            ---
            apiVersion: v1
            kind: PersistentVolumeClaim
            metadata:
              name: nginx-pvc
              namespace: default
            spec:
              accessModes: ["ReadWriteMany"]
              resources:
                requests:
                  storage: 2Gi
        4.初始化pod,并测试 pvc+pv+nfs 类型存储卷
            [root@k8s-master vol]# kubectl apply -f nginx-deploy-pvc-vol.yaml
                deployment.apps/nginx-vol-deploy created
                persistentvolumeclaim/nginx-pvc created
            [root@k8s-master vol]# kubectl get pvc
            NAME        STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
            nginx-pvc   Bound    pv01     2Gi        RWO,RWX                       3h8m
            [root@k8s-master vol]# kubectl get pod -owide
            NAME                                READY   STATUS    RESTARTS   AGE    IP            NODE  
            nginx-vol-deploy-5b7d779688-6vhcl   1/1     Running   0          3h7m   10.244.2.30   k8s-node2   
            nginx-vol-deploy-5b7d779688-jcm2d   1/1     Running   0          3h7m   10.244.1.36   k8s-node1  
            [root@k8s-master vol]# curl 10.244.2.30
            <html>
            <head><title>403 Forbidden</title></head>
            <body>
            <center><h1>403 Forbidden</h1></center>
            <hr><center>nginx/1.15.12</center>
            </body>
            </html>

            [root@store01 volume01]# echo '<h1>pod-pvc-pv-nfs success</h1>' > index.html
            [root@k8s-master vol]# curl 10.244.2.30
            <h1>pod-pvc-pv-nfs success</h1>
            [root@k8s-master vol]# curl 10.244.1.36
            <h1>pod-pvc-pv-nfs success</h1>
        5.当删除了一次pvc时,PV在Retain策略Released状态下,pv资源不可用,解决办法
            [root@k8s-master vol]# kubectl get pv
            NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGE
            pv01   2Gi        RWO,RWX        Retain           Released    default/nginx-pvc                           92m
            pv02   1Gi        RWO,RWX        Retain           Available                                               92m
            pv03   5Gi        RWO            Retain           Available                                               92m
            [root@k8s-master vol]# kubectl edit pv pv01
            删除 claimRef:
                    apiVersion: v1
                    kind: PersistentVolumeClaim
                    name: pvc-test
                    namespace: default
                    resourceVersion: "11751559"
                    uid: 069c4486-d773-11e8-bd12-000c2931d938    
            persistentvolume/pv01 edited

            [root@k8s-master vol]# kubectl get pv
            NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
            pv01   2Gi        RWO,RWX        Retain           Available                                   93m
            pv02   1Gi        RWO,RWX        Retain           Available                                   93m
            pv03   5Gi        RWO            Retain           Available                                   93m
        
    参考文献
        1.mount命令+nfs挂载失败原因
        2.Kubernetes PV在Retain策略Released状态下重新分配到PVC恢复数据

    附一:虚机挂载nfs操作
        [root@k8s-node1 vol]# mount -t nfs k8s-store1:/k8s/volumes1 /k8s/vol
        注1:umount -l /k8s/vol 强制取消挂载,但选项–l并不是马上umount,而是在该目录空闲后再umount。还可以先用命令 ps aux 来查看占用设备的程序PID,然后用命令kill来杀死占用设备的进程,这样就umount的非常放心了
        

    展开全文
  • Docker的volumes的使用

    万次阅读 2018-04-20 14:12:46
    volumes是Docker数据持久化机制。bind mounts依赖主机目录结构,volumes完全由Docker管理。Volumes有以下优点:Volumes更容易备份和移植。可以通过Docker CLI或API进行管理Volumes可以无区别的工作中Windows和Linux...
    volumes是Docker数据持久化机制。bind mounts依赖主机目录结构,volumes完全由Docker管理。Volumes有以下优点:
    • Volumes更容易备份和移植。
    • 可以通过Docker CLI或API进行管理
    • Volumes可以无区别的工作中Windows和Linux下。
    • 多个容器共享Volumes更安全。
    • Volume驱动可以允许你把数据存储到远程主机或者云端,并且加密数据内容,以及添加额外功能。
    • 一个新的数据内容可以由容器预填充。
    而且,volumes不会增加容器的大小,生命周期独立与容器。


    如果你的容器产生不需要持久化数据,请使用tmpfs mount方式,可以避免容器的写入层数据写入。

    Volumes use  rprivate  bind propagation, and bind propagation is not configurable for volumes.(不理解什么意思)

    选择使用 -v还是—mount

    起初,-v或者—volume用于独立容器,--mount用于 swarm services。然而,从 Docker 17.06开始,也可是使用 --mount用于独立容器。—mount命令更精准详细。-v将选项进行了合并。使用—mount。

    如果你需要制定volume驱动选项,你必须使用 —mount。
    • -v或者--volume:由3部分参数组成,使用“:”间隔。顺序不能颠倒。
      • 第一个部分是volumes名字,在宿主机上具有唯一性。匿名卷名字系统给出。
      • 第二部分是挂载到容器里的文件或文件夹路径。
      • 第三部分是可选项列表分隔符,例如“or”,这些可选项在下面会讨论。
    •     —mount:由多个键值对组成,<key>=<value>。—mount要比-v或者--volume命令更长,但是更容易理解。
      • type,可以是bind,volume或者tmpfs。这篇文章主要讨论volumes,所以type一直使用volume.
      • source,volumes的名字,匿名volume可以省略。source可缩写为src.
      • destination,挂载到容器中的文件或目录路径。可也缩写为dst或者使用target。
      • readonly,指定挂载在容器中为只读。
      • volume-opt,可选属性,可以多次使用。
    下面是—mount和-v的例子。

    -v和—mount的不同行为
    与bind mounts不同,对于—mount和-v所有的选项都可以使用。
    当使用volumes服务时,只支持—mount.

    创建和管理volumes
    不像bind mount,你可以在容器外创建和管理volumes。

    创建一个volume:

    $ docker volume create my-vol

    显示所有volumes

    $ docker volume ls

    local               my-vol

    查看volumes

    $ docker volume inspect my-vol
    [
    {
    "Driver" : "local" ,
            "Labels" : {} ,
            "Mountpoint" : "/var/lib/docker/volumes/my-vol/_data" ,
            "Name" : "my-vol" ,
            "Options" : {} ,
            "Scope" : "local"
    }
    ]

    删除一个volume:

    $ docker volume rm my-vol

    启动一个带volume的容器

    如果你启动一个带有volume容器,volume还没有创建,Docker会为你创建。下面的例子挂载myvol2到容器中的/app/下。

    下面的例子-v和—mount结果是一样的。

    —mount:
    $ docker run -d \
    --name devtest \
    --mount source = myvol2,target = /app \
      nginx:latest

    -v:

    $ docker run -d \
    --name devtest \
    -v myvol2:/app \
      nginx:latest
    使用inspect查看挂载是否正确,查看Mounts部分:
    "Mounts" : [
    {
    "Type" : "volume" ,
    "Name" : "myvol2" ,
    "Source" : "/var/lib/docker/volumes/myvol2/_data" ,
    "Destination" : "/app" ,
    "Driver" : "local" ,
    "Mode" : "" ,
    "RW" : true ,
    "Propagation" : ""
    }
    ],

    可以看出挂载正确,并且是可读写的。

    停止容器然后删除volume
    $ docker container stop devtest

    $ docker container rm devtest

    $ docker volume rm myvol2

    启动一个带有volumes服务

    当你启动服务定义一个volume,每个服务可以使用自己本地人volume.如果你使用local volume,容器不能分享数据,但是一些volume驱动支持分享存储。 Docker for AWS and Docker for Azure使用 Cloudstor插件 都支持持久化存储。

    下面的例子启动4份nginx服务,每个使用一个本地存储myvol2。
    $ docker service create -d \
    --replicas = 4 \
    --name devtest-service \
    --mount source = myvol2,target = /app \
      nginx:latest

    使用 docker service ps devtest-service  查看服务是否运行:
    $ docker service ps devtest-service

    ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
    4d7oz1j85wwn        devtest-service.1   nginx:latest        moby                Running             Running 14 seconds ago  
    删除服务
    $ docker service rm devtest-service

    服务标识的不同

      docker service create  命令不支持-v或者—volume。必须使用—mount。

    使用容器加载一个volume

    和上面一样,如果你启动一个容器创建一个新的volume,在容器被挂载的目录(/app/)中有文件或者文件夹,这个目录中的内容会被拷贝到volume中。然后容器挂载使用volume,其他容器使用这个volume也可以访问预加载内容。

    为了说明这个,这个例子启动一个nginx容器并且加载一个新volume nginx-vol,里面包括容器中 /usr/share/nginx/html  目录中的内容,里面存储的是nginx默认的HTML内容。

    —mount and -v具有相同结果

    —mount:
    $ docker run -d \
    --name = nginxtest \
    --mount source = nginx-vol,destination = /usr/share/nginx/html \
      nginx:latest

    -v
    $ docker run -d \
    --name = nginxtest \
    -v nginx-vol:/usr/share/nginx/html \
      nginx:latest

    以下是运行后清理命令
    $ docker container stop nginxtest

    $ docker container rm nginxtest

    $ docker volume rm nginx-vol

    使用只读volume

    对于一些开发应用,容器需要回写数据到Docker主机。但有时容器只需要读数据。请记住多个容器可以挂载相同volume,一个挂载读写容器,也可以挂载只读容器,还可以两种同时挂载。

    这个例子修改上面的例子,但是挂载的是只读容器,使用’or’分隔符处理选项列表,

    —mount and -v具有相同结果

    —mount
    $ docker run -d \
    --name = nginxtest \
    --mount source = nginx-vol,destination = /usr/share/nginx/html,readonly \
      nginx:latest

    -v
    $ docker run -d \
    --name = nginxtest \
    -v nginx-vol:/usr/share/nginx/html:ro \
      nginx:latest

    使用  docker inspect nginxtest 命令查看是否挂载正确,查看Mounts部分
    "Mounts" : [
    {
    "Type" : "volume" ,
    "Name" : "nginx-vol" ,
    "Source" : "/var/lib/docker/volumes/nginx-vol/_data" ,
    "Destination" : "/usr/share/nginx/html" ,
    "Driver" : "local" ,
    "Mode" : "" ,
    "RW" : false ,
    "Propagation" : ""
    }
    ],

    清理命令
    $ docker container stop nginxtest

    $ docker container rm nginxtest

    $ docker volume rm nginx-vol

    机器间共享数据

    当构建高可用应用程序,你需要配置多个相同的服务访问相同文件。

    有几种方法可以达到这种效果。一种是在你的应用中添加对云存储文件的访问,如 Amazon S3。另一种是使用支持外服存储驱动(NFS,  Amazon S3 )的volume。

    Volume驱动允许你在应用中抽象下层的存储系统。例如,如果你的服务使用NFS驱动volume,你可以使用不同的驱动更新服务,就像存储在云中的数据,不需要修改应用逻辑。

    使用volume驱动

    当你使用docker volume create创建一个volume,或者当你启动一个带有没创建volume的容器,你可以指定volume驱动。下面例子使用 vieux/sshfs volume驱动 ,首先创建一个独立的volume,然后启动一个创建新volume的容器。

    初始化设置

    这个例子假设你有两个节点,第一个是Docker主机而且可以连接到第二个的ssh.

    在Docker主机中安装vieux/sshfs插件:
    $ docker plugin install --grant-all-permissions vieux/sshfs

    使用volume驱动创建volume

    这个样例指定一个SSH密码,但是如果两个主机共享keys配置,你可以省略密码。每个volume驱动可以没有或者更多配置选项,可以使用-o标识。

    $ docker volume create --driver vieux/sshfs \
    -o sshcmd = test @node2:/home/test \
    -o password = testpassword \
      sshvolume

    test @node2:/home/test 为远程主机挂载点

    启动一个带有使用volume驱动创建volume的容器

    这个样例指定一个SSH密码,但是如果两个主机共享keys配置,你可以省略密码。每个volume驱动可以没有或者更多配置选项。如果volume驱动要穿可选参数,你必须使用—mount。

    $ docker run -d \
    --name sshfs-container \
    --volume-driver vieux/sshfs \
    --mount src = sshvolume,target = /app,volume-opt = sshcmd = test @node2:/home/test,volume-opt = password = testpassword \
      nginx:latest




    展开全文
  • AsBuiltReport.VMware.AppVolumes VMware AppVolumes AsBuilt报告的存储库 样本报告 入门 以下是有关如何安装,配置和生成VMware AppVolumes As Built Report的说明 先决条件 生成VMware AppVolumes As Built报告...
  • Tatarchuk_Irradiance_Volumes

    2018-03-02 11:17:09
    Tatarchuk_Irradiance_Volumessssssssssssssssssssssssssssssssss
  • Docker——Docker 容器数据卷(Volumes

    千次阅读 2021-04-22 21:11:04
    Docker 容器数据卷容器数据卷(Volumes)容器数据卷概述使用数据卷实现mysql数据同步具名挂载和匿名挂载匿名挂载具名挂载DockerFile 容器数据卷(Volumes) 容器数据卷概述 Docker 镜像是分层结构,联合挂载,镜像...
  • In this post you'll learn how to configure a development environment with live-reload ... This will allow you to convert a legacy application so it uses Docker, Docker volumes, and docker-compose...
  • Docker的volumes踩坑

    2021-10-16 23:21:07
    并且容器删除并不会删除数据卷 docker run --name b1 -v $PWD:/v1 -it busybox:1.32.0 sh docker run --name b2 --volumes-from b1 -it busybox:1.32.0 sh ​ volume权限问题 TODO ​ volume规则总结 应该避免挂载一...
  • Kubernetes 存储 之 Volumes配置管理一、Volumes介绍Volume 的类型二、emptyDir三、hostPath四、NFS 一、Volumes 介绍 容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。 首先,当容器...
  • docker中的volumes

    千次阅读 2019-11-17 23:40:43
    volumes: - /var/run/:/host/var/run/ - ./channel-artifacts:/var/hyperledger/configs - ./fabric_logs:/tmp/fabric_logs/ 把容器中/tmp/fabric_logs目录映射到宿主机当前目录下的./fabric...
  • Kubernetes之Volumes

    千次阅读 2018-09-14 18:26:13
    volumes: - name: test-volume # This AWS EBS volume must already exist. awsElasticBlockStore: volumeID: fsType: ext4 azureDisk A  azureDisk  is used to mount a Microsoft Azure  Data ...
  • Light Propagation Volumes

    2015-05-02 12:05:12
    这个文档是讲解Light Propagation Volumes在游戏中应用的技术文档。
  • Docker 在长时间使用的情况下,经常需要删除旧的容器并创建新的容器,长此以往,Docker 的数据卷 volumes 会产生了非常多的僵尸文件,这些将是稳健大都是未绑定容器的目录 查询僵尸文件 在 Docker 1.9 以上的版本中...
  • 文档后面说如果想要多个容器共享此目录,则需要再顶级volumes标签中定义。 那我如果像要在顶级标签中引用这个volume,然后又想挂载本地目录,那应该如何定义呢? 我看着官方文档没有满足我这个需求的定义呀? ...
  • Kubernetes volumes简介

    2019-01-02 15:24:16
    Kubernetes volumes简介  容器中的磁盘文件生命周期比较短暂,在一些比较复杂的容器应用中会产生一些问题。一、容器crash后,kubelet会重启该容器,但这些文件会丢失掉。二、pod中的多个容器经常需要共享文件。...
  • 目录 k8s存储卷-volumes 为什么要用volumes? volumes类型 emptyDir gitrepo hostPath nfs k8s--PV, PVC PV PVC带来了哪...
  • describe pod 参考 # cni0、flannel.1 刪除他,砍了他,踢了他 # 先移除 flannel kubectl delete daemonsets -n kube-system -l app=flannel sudo ip link delete cni.0 sudo ip link delete flannel.1 ...
  • Kubernetes之持久化Volumes及StorageClass

    千次阅读 2019-12-30 09:42:00
    Kubernetes 官网对 Volumes的介绍说:On-disk files in a Container are ephemeral, which presents some problems for non-trivial applications when running in Containers. First, when a Container crashes, ...
  • 由于计划为Docker 1.9提供本地Docker docker volumes支持以及该项目带来的维护负担,因此我不再维护它。 我将很高兴接受拉动请求以解决问题,但不会提供任何新的修复程序。 造成您的不便,我们深感抱歉。感谢您为该...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 91,181
精华内容 36,472
关键字:

volumes

友情链接: 模拟吸盘鼠demoPID.rar