├── etc └── supervisord.conf ├── examples ├── ep.yml ├── kubernetes-glusterfs.yml ├── openshift-glusterfs.yml └── pv100.yml ├── Dockerfile ├── bin ├── run.sh ├── join-gluster.sh └── add-gluster-peer.sh └── README.md /etc/supervisord.conf: -------------------------------------------------------------------------------- 1 | [supervisord] 2 | nodaemon=true 3 | 4 | [program:sshd] 5 | command=/usr/sbin/sshd -D 6 | 7 | [program:glusterd] 8 | command=/usr/sbin/glusterd -p /var/run/glusterd.pid -------------------------------------------------------------------------------- /examples/ep.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: List 3 | items: 4 | - apiVersion: v1 5 | kind: Service 6 | metadata: 7 | name: gluster 8 | spec: 9 | ports: 10 | - port: 1 11 | - apiVersion: v1 12 | kind: Endpoints 13 | metadata: 14 | creationTimestamp: null 15 | name: gluster 16 | subsets: 17 | - addresses: 18 | - ip: 10.203.30.9 19 | - ip: 10.203.30.7 20 | - ip: 10.203.30.8 21 | ports: 22 | - port: 1 23 | protocol: TCP 24 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:14.04 2 | 3 | MAINTAINER Samuel Terburg 4 | 5 | RUN apt-get update && \ 6 | apt-get install -y python-software-properties software-properties-common 7 | RUN add-apt-repository -y ppa:gluster/glusterfs-3.5 && \ 8 | apt-get update && \ 9 | apt-get install -y glusterfs-server supervisor openssh-server dnsutils sshpass 10 | 11 | ENV ROOT_PASSWORD **ChangeMe** 12 | 13 | ENV SSH_PORT 2222 14 | ENV SSH_USER root 15 | ENV SSH_OPTS -p ${SSH_PORT} -o ConnectTimeout=20 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no 16 | ENV GLUSTER_VOL vol0 17 | ENV GLUSTER_BRICK_PATH /gluster_volume 18 | ENV GLUSTER_CONF_FLAG /etc/gluster.env 19 | ENV SERVICE_NAME gluster 20 | ENV MAX_VOLUMES 1 21 | 22 | ENV DEBUG 0 23 | 24 | VOLUME ["${GLUSTER_BRICK_PATH}"] 25 | 26 | RUN mkdir -p /var/run/sshd /root/.ssh /var/log/supervisor 27 | RUN perl -p -i -e "s/^Port .*/Port ${SSH_PORT}/g" /etc/ssh/sshd_config 28 | RUN perl -p -i -e "s/#?PasswordAuthentication .*/PasswordAuthentication yes/g" /etc/ssh/sshd_config 29 | RUN perl -p -i -e "s/#?PermitRootLogin .*/PermitRootLogin yes/g" /etc/ssh/sshd_config 30 | RUN grep ClientAliveInterval /etc/ssh/sshd_config >/dev/null 2>&1 || echo "ClientAliveInterval 60" >> /etc/ssh/sshd_config 31 | 32 | RUN mkdir -p /usr/local/bin 33 | ADD ./bin /usr/local/bin 34 | RUN chmod +x /usr/local/bin/*.sh 35 | ADD ./etc/supervisord.conf /etc/supervisor/conf.d/supervisord.conf 36 | 37 | CMD ["/usr/local/bin/run.sh"] 38 | -------------------------------------------------------------------------------- /bin/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | [ "$DEBUG" == "1" ] && set -x && set +e 6 | 7 | if [ "${ROOT_PASSWORD}" == "**ChangeMe**" -o -z "${ROOT_PASSWORD}" ]; then 8 | echo "*** ERROR: you need to define ROOT_PASSWORD environment variable - Exiting ..." 9 | exit 1 10 | fi 11 | 12 | if [ "${SERVICE_NAME}" == "**ChangeMe**" -o -z "${SERVICE_NAME}" ]; then 13 | echo "*** ERROR: you need to define SERVICE_NAME environment variable - Exiting ..." 14 | exit 1 15 | fi 16 | 17 | # Required stuff to work 18 | sleep 8 19 | export GLUSTER_PEERS=`dig +short ${SERVICE_NAME}` 20 | if [ -z "${GLUSTER_PEERS}" ]; then 21 | echo "*** WARNING: Could not determine which containers are part of this service '${SERVICE_NAME}'." 22 | fi 23 | export MY_IP=`ip addr show scope global |grep inet | tail -1 | awk '{print $2}' | awk -F\/ '{print $1}'` 24 | if [ -z "${MY_IP}" ]; then 25 | echo "*** ERROR: Could not determine this container's IP - Exiting ..." 26 | exit 1 27 | fi 28 | 29 | for i in `seq 1 $MAX_VOLUMES`; do 30 | [ ! -d ${GLUSTER_BRICK_PATH}/$i ] && mkdir ${GLUSTER_BRICK_PATH}/$i 31 | done 32 | 33 | echo "root:${ROOT_PASSWORD}" | chpasswd 34 | 35 | # Prepare a shell to initialize docker environment variables for ssh 36 | echo "#!/bin/bash" > ${GLUSTER_CONF_FLAG} 37 | echo "ROOT_PASSWORD=\"${ROOT_PASSWORD}\"" >> ${GLUSTER_CONF_FLAG} 38 | echo "SSH_PORT=\"${SSH_PORT}\"" >> ${GLUSTER_CONF_FLAG} 39 | echo "SSH_USER=\"${SSH_USER}\"" >> ${GLUSTER_CONF_FLAG} 40 | echo "SSH_OPTS=\"${SSH_OPTS}\"" >> ${GLUSTER_CONF_FLAG} 41 | echo "GLUSTER_VOL=\"${GLUSTER_VOL}\"" >> ${GLUSTER_CONF_FLAG} 42 | echo "GLUSTER_BRICK_PATH=\"${GLUSTER_BRICK_PATH}\"" >> ${GLUSTER_CONF_FLAG} 43 | echo "DEBUG=\"${DEBUG}\"" >> ${GLUSTER_CONF_FLAG} 44 | echo "MY_IP=\"${MY_IP}\"" >> ${GLUSTER_CONF_FLAG} 45 | echo "MAX_VOLUMES=\"${MAX_VOLUMES}\"" >> ${GLUSTER_CONF_FLAG} 46 | 47 | join-gluster.sh & 48 | /usr/bin/supervisord 49 | -------------------------------------------------------------------------------- /bin/join-gluster.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | [ "$DEBUG" == "1" ] && set -x 6 | 7 | function check_if_already_joined { 8 | # Check if I'm part of the cluster 9 | NUMBER_OF_PEERS=`gluster peer status | grep "Number of Peers:" | awk -F: '{print $2}'` 10 | if [ ${NUMBER_OF_PEERS} -ne 0 ]; then 11 | # This container is already part of the cluster 12 | echo "=> This container is already joined with nodes ${GLUSTER_PEERS}, skipping joining ..." 13 | exit 0 14 | fi 15 | } 16 | 17 | echo "=> Waiting for glusterd to start..." 18 | sleep 10 19 | 20 | check_if_already_joined 21 | 22 | # Join the cluster - choose a suitable container 23 | ALIVE=0 24 | for PEER in ${GLUSTER_PEERS}; do 25 | # Skip myself 26 | if [ "${MY_IP}" == "${PEER}" ]; then 27 | continue 28 | fi 29 | echo "=> Checking if I can reach gluster container ${PEER} ..." 30 | if sshpass -p ${ROOT_PASSWORD} ssh ${SSH_OPTS} ${SSH_USER}@${PEER} "hostname" >/dev/null 2>&1; then 31 | echo "=> Gluster container ${PEER} is alive" 32 | ALIVE=1 33 | break 34 | else 35 | echo "*** Could not reach gluster container ${PEER} ..." 36 | fi 37 | done 38 | 39 | if [ ${ALIVE} -eq 0 ]; then 40 | echo "Could not reach any GlusterFS container from this list: ${GLUSTER_PEERS} - Maybe I am the first node in the cluster? Well, I keep waiting for new containers to join me ..." 41 | exit 0 42 | fi 43 | 44 | # If PEER has requested me to join him, just wait for a while 45 | SEMAPHORE_FILE=/tmp/adding-gluster-node.${PEER} 46 | if [ -e ${SEMAPHORE_FILE} ]; then 47 | echo "=> Seems like peer ${PEER} has just requested me to join him" 48 | echo "=> So I'm waiting for 20 seconds to finish it..." 49 | sleep 60 50 | fi 51 | check_if_already_joined 52 | 53 | echo "=> Joining cluster with container ${PEER} ..." 54 | sshpass -p ${ROOT_PASSWORD} ssh ${SSH_OPTS} ${SSH_USER}@${PEER} "add-gluster-peer.sh ${MY_IP}" 55 | if [ $? -eq 0 ]; then 56 | echo "=> Successfully joined cluster with container ${PEER} ..." 57 | else 58 | echo "=> Error joining cluster with container ${PEER} ..." 59 | fi 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kubernetes-glusterfs-server 2 | GlusterFS Server with peer-discovery. 3 | 4 | 5 | Compatible 6 | ========== 7 | * Works on Kubernetes + SkyDNS 8 | * Works on OpenShift 9 | * Works on Rancher 10 | 11 | Features 12 | ======== 13 | * Will discover peers based on same name DNS records. 14 | * Will auto-peer with peers to form a cluster. 15 | * Will auto-create a shared volume or will join in an existing volume if name matches. (increasing the replica count) 16 | 17 | 18 | Environment Variables 19 | ===================== 20 | | Name | Description | Default | Example | 21 | |:------------------ |:------------------------------------------ |:--------------- |:------------------------------------------- | 22 | | ROOT_PASSWORD | SSH login | [required] | blabla9! | 23 | | SERVICE_NAME | DNS name to query = discover peers | gluster | glusterfs-storage.default.svc.cluster.local | 24 | | SSH_USER | SSH login to peers | root | glusterfs | 25 | | SSH_PORT | SSH port to listen on for peers to connect | 2222 | 22 | 26 | | SSH_OPTS | SSH options | -p 2222 -o ConnectTimeout=20 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no | | 27 | | GLUSTER_VOL | name of the gluster volume to expose | vol0 | myvol0 | 28 | | GLUSTER_BRICK_PATH | Path of the local brick (mount) | /gluster_volume | /bricks/brick0 | 29 | | DEBUG=1 | Verbose mode | 0 | | 30 | 31 | 32 | Examples 33 | ======== 34 | See examples dir. 35 | 36 | 37 | Author 38 | ====== 39 | * Manel Martinez: 40 | * For his work on the original nixel/rancher-glusterfs-server 41 | * Samuel Terburg @ Hoolia 42 | * Kubernetes compatibility 43 | * Documentation 44 | * Examples 45 | 46 | -------------------------------------------------------------------------------- /examples/kubernetes-glusterfs.yml: -------------------------------------------------------------------------------- 1 | kind: List 2 | apiVersion: v1 3 | items: 4 | - kind: ServiceAccount 5 | apiVersion: v1 6 | metadata: 7 | name: glusterfs 8 | - kind: SecurityContextConstraints 9 | apiVersion: v1 10 | metadata: 11 | name: glusterfs 12 | labels: 13 | name: glusterfs 14 | allowPrivilegedContainer: true 15 | allowHostDirVolumePlugin: true 16 | allowedCapabilities: 17 | - SYS_ADMIN 18 | runAsUser: 19 | type: RunAsAny 20 | seLinuxContext: 21 | type: RunAsAny 22 | users: 23 | - system:serviceaccounts:default:glusterfs 24 | groups: 25 | - system:cluster-admins 26 | - kind: Service 27 | apiVersion: v1 28 | metadata: 29 | name: glusterfs-storage 30 | spec: 31 | PortalIP: None 32 | ClusterIP: None 33 | ports: 34 | - name: ssh 35 | port: 22 36 | targetPort: 22 37 | - name: glusterfs-api 38 | port: 24007 39 | targetPort: 24007 40 | - name: glusterfs-infiniband 41 | port: 24008 42 | targetPort: 24008 43 | - name: glusterfs-brick0 44 | port: 49152 45 | targetPort: 49152 46 | - name: glusterfs-nfs-0 47 | port: 38465 48 | targetPort: 38465 49 | - name: glusterfs-nfs-1 50 | port: 38466 51 | targetPort: 38466 52 | - name: glusterfs-nfs-2 53 | port: 38467 54 | targetPort: 38467 55 | - name: nfs-rpc 56 | port: 111 57 | targetPort: 111 58 | - name: nfs-rpc-udp 59 | port: 111 60 | targetPort: 111 61 | protocol: UDP 62 | - name: nfs-portmap 63 | port: 2049 64 | targetPort: 2049 65 | selector: 66 | component: glusterfs-storage 67 | - kind: ReplicationController 68 | apiVersion: v1 69 | metadata: 70 | labels: 71 | component: glusterfs-storage 72 | name: glusterfs-storage 73 | spec: 74 | replicas: 2 75 | selector: 76 | component: glusterfs-storage 77 | template: 78 | metadata: 79 | labels: 80 | component: glusterfs-storage 81 | spec: 82 | serviceAccount: glusterfs 83 | containers: 84 | - name: glusterfs-server 85 | image: hoolia/kubernetes-glusterfs-server:latest 86 | ports: 87 | - containerPort: 22 88 | - containerPort: 24007 89 | - containerPort: 24008 90 | - containerPort: 49152 91 | - containerPort: 38465 92 | - containerPort: 38466 93 | - containerPort: 38467 94 | - containerPort: 2049 95 | - containerPort: 111 96 | - containerPort: 111 97 | protocol: UDP 98 | env: 99 | - name: GLUSTER_BRICK_PATH 100 | value: 101 | - name: GLUSTER_VOL 102 | value: shared0 103 | - name: GLUSTER_BRICK_PATH 104 | value: /gluster_volume 105 | - name: SERVICE_NAME 106 | value: glusterfs-storage.default.svc.cluster.local 107 | - name: ROOT_PASSWORD 108 | value: container_root_password 109 | - name: DEBUG 110 | value: "1" 111 | - name: SSH_PORT 112 | value: "22" 113 | volumeMounts: 114 | - name: local0 115 | mountPath: /gluster_volume 116 | securityContext: 117 | privileged: true 118 | runAsUser: 0 119 | capabilities: 120 | add: 121 | - SYS_ADMIN 122 | volumes: 123 | - name: local0 124 | hostPath: 125 | path: "/mnt/cluster_storage/local0" 126 | -------------------------------------------------------------------------------- /bin/add-gluster-peer.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Exit status = 0 means the peer was successfully joined 4 | # Exit status = 1 means there was an error while joining the peer to the cluster 5 | 6 | set -e 7 | 8 | PEER=$1 9 | 10 | if [ -z "${PEER}" ]; then 11 | echo "=> ERROR: I was supposed to add a new gluster peer to the cluster but no IP was specified, doing nothing ..." 12 | exit 1 13 | fi 14 | 15 | GLUSTER_CONF_FLAG=/etc/gluster.env 16 | SEMAPHORE_FILE=/tmp/adding-gluster-node.${PEER} 17 | SEMAPHORE_TIMEOUT=120 18 | source ${GLUSTER_CONF_FLAG} 19 | 20 | function echo() { 21 | builtin echo $(basename $0): [From container ${MY_IP}] $1 22 | } 23 | 24 | function detach() { 25 | echo "=> Some error ocurred while trying to add peer ${PEER} to the cluster - detaching it ..." 26 | gluster peer detach ${PEER} force 27 | rm -f ${SEMAPHORE_FILE} 28 | exit 1 29 | } 30 | 31 | [ "$DEBUG" == "1" ] && set -x && set +e 32 | 33 | echo "=> Checking if I can reach gluster container ${PEER} ..." 34 | if sshpass -p ${ROOT_PASSWORD} ssh ${SSH_OPTS} ${SSH_USER}@${PEER} "hostname" >/dev/null 2>&1; then 35 | echo "=> Gluster container ${PEER} is alive" 36 | else 37 | echo "*** Could not reach gluster master container ${PEER} - exiting ..." 38 | exit 1 39 | fi 40 | 41 | # Gluster does not like to add two nodes at once 42 | for ((SEMAPHORE_RETRY=0; SEMAPHORE_RETRY/dev/null; then 66 | echo "=> Peer container ${PEER} was part of this cluster but must be dropped now ..." 67 | gluster --mode=script volume remove-brick ${GLUSTER_VOL}${i} replica $((NUMBER_OF_REPLICAS-1)) ${PEER}:${GLUSTER_BRICK_PATH}/${i} force 68 | sleep 5 69 | fi 70 | gluster peer detach ${PEER} force 71 | sleep 5 72 | fi 73 | 74 | # Probe the peer 75 | if ! echo "${PEER_STATUS}" | grep "Peer in Cluster" >/dev/null; then 76 | # Peer probe 77 | echo "=> Probing peer ${PEER} ..." 78 | gluster peer probe ${PEER} 79 | sleep 5 80 | fi 81 | 82 | # Check how many peers are already joined in the cluster - needed to add a replica 83 | NUMBER_OF_REPLICAS=`gluster volume info ${GLUSTER_VOL}${i} | grep "Number of Bricks:" | awk '{print $6}'` 84 | # Create the volume 85 | if ! gluster volume list | grep "^${GLUSTER_VOL}${i}$" >/dev/null; then 86 | echo "=> Creating GlusterFS volume ${GLUSTER_VOL}${i}..." 87 | gluster volume create ${GLUSTER_VOL}${i} replica 2 ${MY_IP}:${GLUSTER_BRICK_PATH}/${i} ${PEER}:${GLUSTER_BRICK_PATH}/${i} force || detach 88 | sleep 1 89 | fi 90 | 91 | # Start the volume 92 | if ! gluster volume status ${GLUSTER_VOL}${i} >/dev/null; then 93 | echo "=> Starting GlusterFS volume ${GLUSTER_VOL}${i}..." 94 | gluster volume start ${GLUSTER_VOL}${i} 95 | sleep 1 96 | fi 97 | 98 | if ! gluster volume info ${GLUSTER_VOL}${i} | grep ": ${PEER}:${GLUSTER_BRICK_PATH}/${i}$" >/dev/null; then 99 | echo "=> Adding brick ${PEER}:${GLUSTER_BRICK_PATH}/${i} to the cluster (replica=$((NUMBER_OF_REPLICAS+1)))..." 100 | gluster volume add-brick ${GLUSTER_VOL}${i} replica $((NUMBER_OF_REPLICAS+1)) ${PEER}:${GLUSTER_BRICK_PATH}/${i} force || detach 101 | fi 102 | 103 | done 104 | 105 | rm -f ${SEMAPHORE_FILE} 106 | exit 0 107 | -------------------------------------------------------------------------------- /examples/openshift-glusterfs.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: List 3 | items: 4 | - kind: ServiceAccount 5 | apiVersion: v1 6 | metadata: 7 | name: glusterfs 8 | - kind: SecurityContextConstraints 9 | apiVersion: v1 10 | metadata: 11 | name: glusterfs 12 | labels: 13 | name: glusterfs 14 | allowPrivilegedContainer: true 15 | allowHostDirVolumePlugin: true 16 | allowedCapabilities: 17 | - SYS_ADMIN 18 | runAsUser: 19 | type: RunAsAny 20 | seLinuxContext: 21 | type: RunAsAny 22 | users: 23 | - system:serviceaccounts:default:glusterfs 24 | groups: 25 | - system:cluster-admins 26 | - kind: Service 27 | apiVersion: v1 28 | metadata: 29 | name: storage-webhosting 30 | spec: 31 | PortalIP: None 32 | ClusterIP: None 33 | ports: 34 | - name: ssh 35 | port: 22 36 | targetPort: 22 37 | - name: glusterfs-api 38 | port: 24007 39 | targetPort: 24007 40 | - name: glusterfs-infiniband 41 | port: 24008 42 | targetPort: 24008 43 | - name: glusterfs-brick0 44 | port: 49152 45 | targetPort: 49152 46 | - name: glusterfs-nfs-0 47 | port: 38465 48 | targetPort: 38465 49 | - name: glusterfs-nfs-1 50 | port: 38466 51 | targetPort: 38466 52 | - name: glusterfs-nfs-2 53 | port: 38467 54 | targetPort: 38467 55 | - name: nfs-rpc 56 | port: 111 57 | targetPort: 111 58 | - name: nfs-rpc-udp 59 | port: 111 60 | targetPort: 111 61 | protocol: UDP 62 | - name: nfs-portmap 63 | port: 2049 64 | targetPort: 2049 65 | selector: 66 | service: storage-webhosting 67 | - apiVersion: v1 68 | kind: DeploymentConfig 69 | metadata: 70 | name: storage-webhosting1 71 | status: 72 | latestVersion: 1 73 | spec: 74 | replicas: 1 75 | selector: 76 | deploymentconfig: storage-webhosting1 77 | strategy: 78 | type: Rolling 79 | template: 80 | metadata: 81 | labels: 82 | service: storage-webhosting 83 | deploymentconfig: storage-webhosting1 84 | spec: 85 | serviceAccount: glusterfs 86 | dnsPolicy: ClusterFirst 87 | containers: 88 | - name: glusterfs-server1 89 | image: hoolia/kubernetes-glusterfs-server:latest 90 | ports: 91 | - containerPort: 22 92 | - containerPort: 24007 93 | - containerPort: 24008 94 | - containerPort: 49152 95 | - containerPort: 38465 96 | - containerPort: 38466 97 | - containerPort: 38467 98 | - containerPort: 2049 99 | - containerPort: 111 100 | - containerPort: 111 101 | protocol: UDP 102 | env: 103 | - name: MAX_VOLUMES 104 | value: "100" 105 | - name: GLUSTER_VOL 106 | value: shared 107 | - name: GLUSTER_BRICK_PATH 108 | value: /gluster_volume 109 | - name: SERVICE_NAME 110 | value: storage-webhosting.default.svc.cluster.local 111 | - name: ROOT_PASSWORD 112 | value: container_root_password 113 | - name: DEBUG 114 | value: "1" 115 | - name: SSH_PORT 116 | value: "22" 117 | volumeMounts: 118 | - name: shared-webhosting1 119 | mountPath: /gluster_volume 120 | securityContext: 121 | privileged: true 122 | runAsUser: 0 123 | capabilities: 124 | add: 125 | - SYS_ADMIN 126 | volumes: 127 | - name: shared-webhosting1 128 | hostPath: 129 | path: "/mnt/shared/webhosting/node1" 130 | triggers: 131 | - type: ConfigChange 132 | - type: ImageChange 133 | imageChangeParams: 134 | automatic: true 135 | containerNames: 136 | - glusterfs-server1 137 | from: 138 | kind: ImageStreamTag 139 | name: kubernetes-glusterfs-server:latest 140 | - apiVersion: v1 141 | kind: DeploymentConfig 142 | metadata: 143 | name: storage-webhosting2 144 | status: 145 | latestVersion: 1 146 | spec: 147 | replicas: 1 148 | selector: 149 | deploymentconfig: storage-webhosting2 150 | strategy: 151 | type: Rolling 152 | template: 153 | metadata: 154 | labels: 155 | service: storage-webhosting 156 | deploymentconfig: storage-webhosting2 157 | spec: 158 | serviceAccount: glusterfs 159 | dnsPolicy: ClusterFirst 160 | containers: 161 | - name: glusterfs-server2 162 | image: hoolia/kubernetes-glusterfs-server:latest 163 | ports: 164 | - containerPort: 22 165 | - containerPort: 24007 166 | - containerPort: 24008 167 | - containerPort: 49152 168 | - containerPort: 38465 169 | - containerPort: 38466 170 | - containerPort: 38467 171 | - containerPort: 2049 172 | - containerPort: 111 173 | - containerPort: 111 174 | protocol: UDP 175 | env: 176 | - name: MAX_VOLUMES 177 | value: "100" 178 | - name: GLUSTER_VOL 179 | value: shared 180 | - name: GLUSTER_BRICK_PATH 181 | value: /gluster_volume 182 | - name: SERVICE_NAME 183 | value: storage-webhosting.default.svc.cluster.local 184 | - name: ROOT_PASSWORD 185 | value: container_root_password 186 | - name: DEBUG 187 | value: "1" 188 | - name: SSH_PORT 189 | value: "22" 190 | volumeMounts: 191 | - name: shared-webhosting2 192 | mountPath: /gluster_volume 193 | securityContext: 194 | privileged: true 195 | runAsUser: 0 196 | capabilities: 197 | add: 198 | - SYS_ADMIN 199 | volumes: 200 | - name: shared-webhosting2 201 | hostPath: 202 | path: "/mnt/shared/webhosting/node2" 203 | triggers: 204 | - type: ConfigChange 205 | - type: ImageChange 206 | imageChangeParams: 207 | automatic: true 208 | containerNames: 209 | - glusterfs-server2 210 | from: 211 | kind: ImageStreamTag 212 | name: kubernetes-glusterfs-server:latest 213 | - apiVersion: v1 214 | kind: ImageStream 215 | metadata: 216 | name: kubernetes-glusterfs-server 217 | spec: 218 | dockerImageRepository: hoolia/kubernetes-glusterfs-server 219 | - apiVersion: "v1" 220 | kind: "PersistentVolume" 221 | metadata: 222 | name: "shared-webhosting1" 223 | spec: 224 | capacity: 225 | storage: "1600Gi" 226 | accessModes: 227 | - "ReadWriteMany" 228 | glusterfs: 229 | endpoints: "shared-webhosting" 230 | path: "shared1" 231 | readOnly: false 232 | persistentVolumeReclaimPolicy: "Recycle" 233 | -------------------------------------------------------------------------------- /examples/pv100.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: List 3 | items: 4 | - apiVersion: "v1" 5 | kind: "PersistentVolume" 6 | metadata: 7 | name: "pv1" 8 | spec: 9 | capacity: 10 | storage: "1000Gi" 11 | accessModes: 12 | - "ReadWriteMany" 13 | glusterfs: 14 | endpoints: "gluster" 15 | path: "pv1" 16 | readOnly: false 17 | persistentVolumeReclaimPolicy: "Recycle" 18 | - apiVersion: "v1" 19 | kind: "PersistentVolume" 20 | metadata: 21 | name: "pv2" 22 | spec: 23 | capacity: 24 | storage: "1000Gi" 25 | accessModes: 26 | - "ReadWriteMany" 27 | glusterfs: 28 | endpoints: "gluster" 29 | path: "pv2" 30 | readOnly: false 31 | persistentVolumeReclaimPolicy: "Recycle" 32 | - apiVersion: "v1" 33 | kind: "PersistentVolume" 34 | metadata: 35 | name: "pv3" 36 | spec: 37 | capacity: 38 | storage: "1000Gi" 39 | accessModes: 40 | - "ReadWriteMany" 41 | glusterfs: 42 | endpoints: "gluster" 43 | path: "pv3" 44 | readOnly: false 45 | persistentVolumeReclaimPolicy: "Recycle" 46 | - apiVersion: "v1" 47 | kind: "PersistentVolume" 48 | metadata: 49 | name: "pv4" 50 | spec: 51 | capacity: 52 | storage: "1000Gi" 53 | accessModes: 54 | - "ReadWriteMany" 55 | glusterfs: 56 | endpoints: "gluster" 57 | path: "pv4" 58 | readOnly: false 59 | persistentVolumeReclaimPolicy: "Recycle" 60 | - apiVersion: "v1" 61 | kind: "PersistentVolume" 62 | metadata: 63 | name: "pv5" 64 | spec: 65 | capacity: 66 | storage: "1000Gi" 67 | accessModes: 68 | - "ReadWriteMany" 69 | glusterfs: 70 | endpoints: "gluster" 71 | path: "pv5" 72 | readOnly: false 73 | persistentVolumeReclaimPolicy: "Recycle" 74 | - apiVersion: "v1" 75 | kind: "PersistentVolume" 76 | metadata: 77 | name: "pv6" 78 | spec: 79 | capacity: 80 | storage: "1000Gi" 81 | accessModes: 82 | - "ReadWriteMany" 83 | glusterfs: 84 | endpoints: "gluster" 85 | path: "pv6" 86 | readOnly: false 87 | persistentVolumeReclaimPolicy: "Recycle" 88 | - apiVersion: "v1" 89 | kind: "PersistentVolume" 90 | metadata: 91 | name: "pv7" 92 | spec: 93 | capacity: 94 | storage: "1000Gi" 95 | accessModes: 96 | - "ReadWriteMany" 97 | glusterfs: 98 | endpoints: "gluster" 99 | path: "pv7" 100 | readOnly: false 101 | persistentVolumeReclaimPolicy: "Recycle" 102 | - apiVersion: "v1" 103 | kind: "PersistentVolume" 104 | metadata: 105 | name: "pv8" 106 | spec: 107 | capacity: 108 | storage: "1000Gi" 109 | accessModes: 110 | - "ReadWriteMany" 111 | glusterfs: 112 | endpoints: "gluster" 113 | path: "pv8" 114 | readOnly: false 115 | persistentVolumeReclaimPolicy: "Recycle" 116 | - apiVersion: "v1" 117 | kind: "PersistentVolume" 118 | metadata: 119 | name: "pv9" 120 | spec: 121 | capacity: 122 | storage: "1000Gi" 123 | accessModes: 124 | - "ReadWriteMany" 125 | glusterfs: 126 | endpoints: "gluster" 127 | path: "pv9" 128 | readOnly: false 129 | persistentVolumeReclaimPolicy: "Recycle" 130 | - apiVersion: "v1" 131 | kind: "PersistentVolume" 132 | metadata: 133 | name: "pv10" 134 | spec: 135 | capacity: 136 | storage: "1000Gi" 137 | accessModes: 138 | - "ReadWriteMany" 139 | glusterfs: 140 | endpoints: "gluster" 141 | path: "pv10" 142 | readOnly: false 143 | persistentVolumeReclaimPolicy: "Recycle" 144 | - apiVersion: "v1" 145 | kind: "PersistentVolume" 146 | metadata: 147 | name: "pv11" 148 | spec: 149 | capacity: 150 | storage: "1000Gi" 151 | accessModes: 152 | - "ReadWriteMany" 153 | glusterfs: 154 | endpoints: "gluster" 155 | path: "pv11" 156 | readOnly: false 157 | persistentVolumeReclaimPolicy: "Recycle" 158 | - apiVersion: "v1" 159 | kind: "PersistentVolume" 160 | metadata: 161 | name: "pv12" 162 | spec: 163 | capacity: 164 | storage: "1000Gi" 165 | accessModes: 166 | - "ReadWriteMany" 167 | glusterfs: 168 | endpoints: "gluster" 169 | path: "pv12" 170 | readOnly: false 171 | persistentVolumeReclaimPolicy: "Recycle" 172 | - apiVersion: "v1" 173 | kind: "PersistentVolume" 174 | metadata: 175 | name: "pv13" 176 | spec: 177 | capacity: 178 | storage: "1000Gi" 179 | accessModes: 180 | - "ReadWriteMany" 181 | glusterfs: 182 | endpoints: "gluster" 183 | path: "pv13" 184 | readOnly: false 185 | persistentVolumeReclaimPolicy: "Recycle" 186 | - apiVersion: "v1" 187 | kind: "PersistentVolume" 188 | metadata: 189 | name: "pv14" 190 | spec: 191 | capacity: 192 | storage: "1000Gi" 193 | accessModes: 194 | - "ReadWriteMany" 195 | glusterfs: 196 | endpoints: "gluster" 197 | path: "pv14" 198 | readOnly: false 199 | persistentVolumeReclaimPolicy: "Recycle" 200 | - apiVersion: "v1" 201 | kind: "PersistentVolume" 202 | metadata: 203 | name: "pv15" 204 | spec: 205 | capacity: 206 | storage: "1000Gi" 207 | accessModes: 208 | - "ReadWriteMany" 209 | glusterfs: 210 | endpoints: "gluster" 211 | path: "pv15" 212 | readOnly: false 213 | persistentVolumeReclaimPolicy: "Recycle" 214 | - apiVersion: "v1" 215 | kind: "PersistentVolume" 216 | metadata: 217 | name: "pv16" 218 | spec: 219 | capacity: 220 | storage: "1000Gi" 221 | accessModes: 222 | - "ReadWriteMany" 223 | glusterfs: 224 | endpoints: "gluster" 225 | path: "pv16" 226 | readOnly: false 227 | persistentVolumeReclaimPolicy: "Recycle" 228 | - apiVersion: "v1" 229 | kind: "PersistentVolume" 230 | metadata: 231 | name: "pv17" 232 | spec: 233 | capacity: 234 | storage: "1000Gi" 235 | accessModes: 236 | - "ReadWriteMany" 237 | glusterfs: 238 | endpoints: "gluster" 239 | path: "pv17" 240 | readOnly: false 241 | persistentVolumeReclaimPolicy: "Recycle" 242 | - apiVersion: "v1" 243 | kind: "PersistentVolume" 244 | metadata: 245 | name: "pv18" 246 | spec: 247 | capacity: 248 | storage: "1000Gi" 249 | accessModes: 250 | - "ReadWriteMany" 251 | glusterfs: 252 | endpoints: "gluster" 253 | path: "pv18" 254 | readOnly: false 255 | persistentVolumeReclaimPolicy: "Recycle" 256 | - apiVersion: "v1" 257 | kind: "PersistentVolume" 258 | metadata: 259 | name: "pv19" 260 | spec: 261 | capacity: 262 | storage: "1000Gi" 263 | accessModes: 264 | - "ReadWriteMany" 265 | glusterfs: 266 | endpoints: "gluster" 267 | path: "pv19" 268 | readOnly: false 269 | persistentVolumeReclaimPolicy: "Recycle" 270 | - apiVersion: "v1" 271 | kind: "PersistentVolume" 272 | metadata: 273 | name: "pv20" 274 | spec: 275 | capacity: 276 | storage: "1000Gi" 277 | accessModes: 278 | - "ReadWriteMany" 279 | glusterfs: 280 | endpoints: "gluster" 281 | path: "pv20" 282 | readOnly: false 283 | persistentVolumeReclaimPolicy: "Recycle" 284 | - apiVersion: "v1" 285 | kind: "PersistentVolume" 286 | metadata: 287 | name: "pv21" 288 | spec: 289 | capacity: 290 | storage: "1000Gi" 291 | accessModes: 292 | - "ReadWriteMany" 293 | glusterfs: 294 | endpoints: "gluster" 295 | path: "pv21" 296 | readOnly: false 297 | persistentVolumeReclaimPolicy: "Recycle" 298 | - apiVersion: "v1" 299 | kind: "PersistentVolume" 300 | metadata: 301 | name: "pv22" 302 | spec: 303 | capacity: 304 | storage: "1000Gi" 305 | accessModes: 306 | - "ReadWriteMany" 307 | glusterfs: 308 | endpoints: "gluster" 309 | path: "pv22" 310 | readOnly: false 311 | persistentVolumeReclaimPolicy: "Recycle" 312 | - apiVersion: "v1" 313 | kind: "PersistentVolume" 314 | metadata: 315 | name: "pv23" 316 | spec: 317 | capacity: 318 | storage: "1000Gi" 319 | accessModes: 320 | - "ReadWriteMany" 321 | glusterfs: 322 | endpoints: "gluster" 323 | path: "pv23" 324 | readOnly: false 325 | persistentVolumeReclaimPolicy: "Recycle" 326 | - apiVersion: "v1" 327 | kind: "PersistentVolume" 328 | metadata: 329 | name: "pv24" 330 | spec: 331 | capacity: 332 | storage: "1000Gi" 333 | accessModes: 334 | - "ReadWriteMany" 335 | glusterfs: 336 | endpoints: "gluster" 337 | path: "pv24" 338 | readOnly: false 339 | persistentVolumeReclaimPolicy: "Recycle" 340 | - apiVersion: "v1" 341 | kind: "PersistentVolume" 342 | metadata: 343 | name: "pv25" 344 | spec: 345 | capacity: 346 | storage: "1000Gi" 347 | accessModes: 348 | - "ReadWriteMany" 349 | glusterfs: 350 | endpoints: "gluster" 351 | path: "pv25" 352 | readOnly: false 353 | persistentVolumeReclaimPolicy: "Recycle" 354 | - apiVersion: "v1" 355 | kind: "PersistentVolume" 356 | metadata: 357 | name: "pv26" 358 | spec: 359 | capacity: 360 | storage: "1000Gi" 361 | accessModes: 362 | - "ReadWriteMany" 363 | glusterfs: 364 | endpoints: "gluster" 365 | path: "pv26" 366 | readOnly: false 367 | persistentVolumeReclaimPolicy: "Recycle" 368 | - apiVersion: "v1" 369 | kind: "PersistentVolume" 370 | metadata: 371 | name: "pv27" 372 | spec: 373 | capacity: 374 | storage: "1000Gi" 375 | accessModes: 376 | - "ReadWriteMany" 377 | glusterfs: 378 | endpoints: "gluster" 379 | path: "pv27" 380 | readOnly: false 381 | persistentVolumeReclaimPolicy: "Recycle" 382 | - apiVersion: "v1" 383 | kind: "PersistentVolume" 384 | metadata: 385 | name: "pv28" 386 | spec: 387 | capacity: 388 | storage: "1000Gi" 389 | accessModes: 390 | - "ReadWriteMany" 391 | glusterfs: 392 | endpoints: "gluster" 393 | path: "pv28" 394 | readOnly: false 395 | persistentVolumeReclaimPolicy: "Recycle" 396 | - apiVersion: "v1" 397 | kind: "PersistentVolume" 398 | metadata: 399 | name: "pv29" 400 | spec: 401 | capacity: 402 | storage: "1000Gi" 403 | accessModes: 404 | - "ReadWriteMany" 405 | glusterfs: 406 | endpoints: "gluster" 407 | path: "pv29" 408 | readOnly: false 409 | persistentVolumeReclaimPolicy: "Recycle" 410 | - apiVersion: "v1" 411 | kind: "PersistentVolume" 412 | metadata: 413 | name: "pv30" 414 | spec: 415 | capacity: 416 | storage: "1000Gi" 417 | accessModes: 418 | - "ReadWriteOnce" 419 | glusterfs: 420 | endpoints: "gluster" 421 | path: "pv30" 422 | readOnly: false 423 | persistentVolumeReclaimPolicy: "Recycle" 424 | - apiVersion: "v1" 425 | kind: "PersistentVolume" 426 | metadata: 427 | name: "pv31" 428 | spec: 429 | capacity: 430 | storage: "1000Gi" 431 | accessModes: 432 | - "ReadWriteOnce" 433 | glusterfs: 434 | endpoints: "gluster" 435 | path: "pv31" 436 | readOnly: false 437 | persistentVolumeReclaimPolicy: "Recycle" 438 | - apiVersion: "v1" 439 | kind: "PersistentVolume" 440 | metadata: 441 | name: "pv32" 442 | spec: 443 | capacity: 444 | storage: "1000Gi" 445 | accessModes: 446 | - "ReadWriteOnce" 447 | glusterfs: 448 | endpoints: "gluster" 449 | path: "pv32" 450 | readOnly: false 451 | persistentVolumeReclaimPolicy: "Recycle" 452 | - apiVersion: "v1" 453 | kind: "PersistentVolume" 454 | metadata: 455 | name: "pv33" 456 | spec: 457 | capacity: 458 | storage: "1000Gi" 459 | accessModes: 460 | - "ReadWriteOnce" 461 | glusterfs: 462 | endpoints: "gluster" 463 | path: "pv33" 464 | readOnly: false 465 | persistentVolumeReclaimPolicy: "Recycle" 466 | - apiVersion: "v1" 467 | kind: "PersistentVolume" 468 | metadata: 469 | name: "pv34" 470 | spec: 471 | capacity: 472 | storage: "1000Gi" 473 | accessModes: 474 | - "ReadWriteOnce" 475 | glusterfs: 476 | endpoints: "gluster" 477 | path: "pv34" 478 | readOnly: false 479 | persistentVolumeReclaimPolicy: "Recycle" 480 | - apiVersion: "v1" 481 | kind: "PersistentVolume" 482 | metadata: 483 | name: "pv35" 484 | spec: 485 | capacity: 486 | storage: "1000Gi" 487 | accessModes: 488 | - "ReadWriteOnce" 489 | glusterfs: 490 | endpoints: "gluster" 491 | path: "pv35" 492 | readOnly: false 493 | persistentVolumeReclaimPolicy: "Recycle" 494 | - apiVersion: "v1" 495 | kind: "PersistentVolume" 496 | metadata: 497 | name: "pv36" 498 | spec: 499 | capacity: 500 | storage: "1000Gi" 501 | accessModes: 502 | - "ReadWriteOnce" 503 | glusterfs: 504 | endpoints: "gluster" 505 | path: "pv36" 506 | readOnly: false 507 | persistentVolumeReclaimPolicy: "Recycle" 508 | - apiVersion: "v1" 509 | kind: "PersistentVolume" 510 | metadata: 511 | name: "pv37" 512 | spec: 513 | capacity: 514 | storage: "1000Gi" 515 | accessModes: 516 | - "ReadWriteOnce" 517 | glusterfs: 518 | endpoints: "gluster" 519 | path: "pv37" 520 | readOnly: false 521 | persistentVolumeReclaimPolicy: "Recycle" 522 | - apiVersion: "v1" 523 | kind: "PersistentVolume" 524 | metadata: 525 | name: "pv38" 526 | spec: 527 | capacity: 528 | storage: "1000Gi" 529 | accessModes: 530 | - "ReadWriteOnce" 531 | glusterfs: 532 | endpoints: "gluster" 533 | path: "pv38" 534 | readOnly: false 535 | persistentVolumeReclaimPolicy: "Recycle" 536 | - apiVersion: "v1" 537 | kind: "PersistentVolume" 538 | metadata: 539 | name: "pv39" 540 | spec: 541 | capacity: 542 | storage: "1000Gi" 543 | accessModes: 544 | - "ReadWriteOnce" 545 | glusterfs: 546 | endpoints: "gluster" 547 | path: "pv39" 548 | readOnly: false 549 | persistentVolumeReclaimPolicy: "Recycle" 550 | - apiVersion: "v1" 551 | kind: "PersistentVolume" 552 | metadata: 553 | name: "pv40" 554 | spec: 555 | capacity: 556 | storage: "1000Gi" 557 | accessModes: 558 | - "ReadWriteOnce" 559 | glusterfs: 560 | endpoints: "gluster" 561 | path: "pv40" 562 | readOnly: false 563 | persistentVolumeReclaimPolicy: "Recycle" 564 | - apiVersion: "v1" 565 | kind: "PersistentVolume" 566 | metadata: 567 | name: "pv41" 568 | spec: 569 | capacity: 570 | storage: "1000Gi" 571 | accessModes: 572 | - "ReadWriteOnce" 573 | glusterfs: 574 | endpoints: "gluster" 575 | path: "pv41" 576 | readOnly: false 577 | persistentVolumeReclaimPolicy: "Recycle" 578 | - apiVersion: "v1" 579 | kind: "PersistentVolume" 580 | metadata: 581 | name: "pv42" 582 | spec: 583 | capacity: 584 | storage: "1000Gi" 585 | accessModes: 586 | - "ReadWriteOnce" 587 | glusterfs: 588 | endpoints: "gluster" 589 | path: "pv42" 590 | readOnly: false 591 | persistentVolumeReclaimPolicy: "Recycle" 592 | - apiVersion: "v1" 593 | kind: "PersistentVolume" 594 | metadata: 595 | name: "pv43" 596 | spec: 597 | capacity: 598 | storage: "1000Gi" 599 | accessModes: 600 | - "ReadWriteOnce" 601 | glusterfs: 602 | endpoints: "gluster" 603 | path: "pv43" 604 | readOnly: false 605 | persistentVolumeReclaimPolicy: "Recycle" 606 | - apiVersion: "v1" 607 | kind: "PersistentVolume" 608 | metadata: 609 | name: "pv44" 610 | spec: 611 | capacity: 612 | storage: "1000Gi" 613 | accessModes: 614 | - "ReadWriteOnce" 615 | glusterfs: 616 | endpoints: "gluster" 617 | path: "pv44" 618 | readOnly: false 619 | persistentVolumeReclaimPolicy: "Recycle" 620 | - apiVersion: "v1" 621 | kind: "PersistentVolume" 622 | metadata: 623 | name: "pv45" 624 | spec: 625 | capacity: 626 | storage: "1000Gi" 627 | accessModes: 628 | - "ReadWriteOnce" 629 | glusterfs: 630 | endpoints: "gluster" 631 | path: "pv45" 632 | readOnly: false 633 | persistentVolumeReclaimPolicy: "Recycle" 634 | - apiVersion: "v1" 635 | kind: "PersistentVolume" 636 | metadata: 637 | name: "pv46" 638 | spec: 639 | capacity: 640 | storage: "1000Gi" 641 | accessModes: 642 | - "ReadWriteOnce" 643 | glusterfs: 644 | endpoints: "gluster" 645 | path: "pv46" 646 | readOnly: false 647 | persistentVolumeReclaimPolicy: "Recycle" 648 | - apiVersion: "v1" 649 | kind: "PersistentVolume" 650 | metadata: 651 | name: "pv47" 652 | spec: 653 | capacity: 654 | storage: "1000Gi" 655 | accessModes: 656 | - "ReadWriteOnce" 657 | glusterfs: 658 | endpoints: "gluster" 659 | path: "pv47" 660 | readOnly: false 661 | persistentVolumeReclaimPolicy: "Recycle" 662 | - apiVersion: "v1" 663 | kind: "PersistentVolume" 664 | metadata: 665 | name: "pv48" 666 | spec: 667 | capacity: 668 | storage: "1000Gi" 669 | accessModes: 670 | - "ReadWriteOnce" 671 | glusterfs: 672 | endpoints: "gluster" 673 | path: "pv48" 674 | readOnly: false 675 | persistentVolumeReclaimPolicy: "Recycle" 676 | - apiVersion: "v1" 677 | kind: "PersistentVolume" 678 | metadata: 679 | name: "pv49" 680 | spec: 681 | capacity: 682 | storage: "1000Gi" 683 | accessModes: 684 | - "ReadWriteOnce" 685 | glusterfs: 686 | endpoints: "gluster" 687 | path: "pv49" 688 | readOnly: false 689 | persistentVolumeReclaimPolicy: "Recycle" 690 | - apiVersion: "v1" 691 | kind: "PersistentVolume" 692 | metadata: 693 | name: "pv50" 694 | spec: 695 | capacity: 696 | storage: "1000Gi" 697 | accessModes: 698 | - "ReadWriteOnce" 699 | glusterfs: 700 | endpoints: "gluster" 701 | path: "pv50" 702 | readOnly: false 703 | persistentVolumeReclaimPolicy: "Recycle" 704 | - apiVersion: "v1" 705 | kind: "PersistentVolume" 706 | metadata: 707 | name: "pv51" 708 | spec: 709 | capacity: 710 | storage: "1000Gi" 711 | accessModes: 712 | - "ReadWriteOnce" 713 | glusterfs: 714 | endpoints: "gluster" 715 | path: "pv51" 716 | readOnly: false 717 | persistentVolumeReclaimPolicy: "Recycle" 718 | - apiVersion: "v1" 719 | kind: "PersistentVolume" 720 | metadata: 721 | name: "pv52" 722 | spec: 723 | capacity: 724 | storage: "1000Gi" 725 | accessModes: 726 | - "ReadWriteOnce" 727 | glusterfs: 728 | endpoints: "gluster" 729 | path: "pv52" 730 | readOnly: false 731 | persistentVolumeReclaimPolicy: "Recycle" 732 | - apiVersion: "v1" 733 | kind: "PersistentVolume" 734 | metadata: 735 | name: "pv53" 736 | spec: 737 | capacity: 738 | storage: "1000Gi" 739 | accessModes: 740 | - "ReadWriteOnce" 741 | glusterfs: 742 | endpoints: "gluster" 743 | path: "pv53" 744 | readOnly: false 745 | persistentVolumeReclaimPolicy: "Recycle" 746 | - apiVersion: "v1" 747 | kind: "PersistentVolume" 748 | metadata: 749 | name: "pv54" 750 | spec: 751 | capacity: 752 | storage: "1000Gi" 753 | accessModes: 754 | - "ReadWriteOnce" 755 | glusterfs: 756 | endpoints: "gluster" 757 | path: "pv54" 758 | readOnly: false 759 | persistentVolumeReclaimPolicy: "Recycle" 760 | - apiVersion: "v1" 761 | kind: "PersistentVolume" 762 | metadata: 763 | name: "pv55" 764 | spec: 765 | capacity: 766 | storage: "1000Gi" 767 | accessModes: 768 | - "ReadWriteOnce" 769 | glusterfs: 770 | endpoints: "gluster" 771 | path: "pv55" 772 | readOnly: false 773 | persistentVolumeReclaimPolicy: "Recycle" 774 | - apiVersion: "v1" 775 | kind: "PersistentVolume" 776 | metadata: 777 | name: "pv56" 778 | spec: 779 | capacity: 780 | storage: "1000Gi" 781 | accessModes: 782 | - "ReadWriteOnce" 783 | glusterfs: 784 | endpoints: "gluster" 785 | path: "pv56" 786 | readOnly: false 787 | persistentVolumeReclaimPolicy: "Recycle" 788 | - apiVersion: "v1" 789 | kind: "PersistentVolume" 790 | metadata: 791 | name: "pv57" 792 | spec: 793 | capacity: 794 | storage: "1000Gi" 795 | accessModes: 796 | - "ReadWriteOnce" 797 | glusterfs: 798 | endpoints: "gluster" 799 | path: "pv57" 800 | readOnly: false 801 | persistentVolumeReclaimPolicy: "Recycle" 802 | - apiVersion: "v1" 803 | kind: "PersistentVolume" 804 | metadata: 805 | name: "pv58" 806 | spec: 807 | capacity: 808 | storage: "1000Gi" 809 | accessModes: 810 | - "ReadWriteOnce" 811 | glusterfs: 812 | endpoints: "gluster" 813 | path: "pv58" 814 | readOnly: false 815 | persistentVolumeReclaimPolicy: "Recycle" 816 | - apiVersion: "v1" 817 | kind: "PersistentVolume" 818 | metadata: 819 | name: "pv59" 820 | spec: 821 | capacity: 822 | storage: "1000Gi" 823 | accessModes: 824 | - "ReadWriteOnce" 825 | glusterfs: 826 | endpoints: "gluster" 827 | path: "pv59" 828 | readOnly: false 829 | persistentVolumeReclaimPolicy: "Recycle" 830 | - apiVersion: "v1" 831 | kind: "PersistentVolume" 832 | metadata: 833 | name: "pv60" 834 | spec: 835 | capacity: 836 | storage: "1000Gi" 837 | accessModes: 838 | - "ReadWriteMany" 839 | glusterfs: 840 | endpoints: "gluster" 841 | path: "pv60" 842 | readOnly: false 843 | persistentVolumeReclaimPolicy: "Recycle" 844 | - apiVersion: "v1" 845 | kind: "PersistentVolume" 846 | metadata: 847 | name: "pv61" 848 | spec: 849 | capacity: 850 | storage: "1000Gi" 851 | accessModes: 852 | - "ReadWriteMany" 853 | glusterfs: 854 | endpoints: "gluster" 855 | path: "pv61" 856 | readOnly: false 857 | persistentVolumeReclaimPolicy: "Recycle" 858 | - apiVersion: "v1" 859 | kind: "PersistentVolume" 860 | metadata: 861 | name: "pv62" 862 | spec: 863 | capacity: 864 | storage: "1000Gi" 865 | accessModes: 866 | - "ReadWriteMany" 867 | glusterfs: 868 | endpoints: "gluster" 869 | path: "pv62" 870 | readOnly: false 871 | persistentVolumeReclaimPolicy: "Recycle" 872 | - apiVersion: "v1" 873 | kind: "PersistentVolume" 874 | metadata: 875 | name: "pv63" 876 | spec: 877 | capacity: 878 | storage: "1000Gi" 879 | accessModes: 880 | - "ReadWriteMany" 881 | glusterfs: 882 | endpoints: "gluster" 883 | path: "pv63" 884 | readOnly: false 885 | persistentVolumeReclaimPolicy: "Recycle" 886 | - apiVersion: "v1" 887 | kind: "PersistentVolume" 888 | metadata: 889 | name: "pv64" 890 | spec: 891 | capacity: 892 | storage: "1000Gi" 893 | accessModes: 894 | - "ReadWriteMany" 895 | glusterfs: 896 | endpoints: "gluster" 897 | path: "pv64" 898 | readOnly: false 899 | persistentVolumeReclaimPolicy: "Recycle" 900 | - apiVersion: "v1" 901 | kind: "PersistentVolume" 902 | metadata: 903 | name: "pv65" 904 | spec: 905 | capacity: 906 | storage: "1000Gi" 907 | accessModes: 908 | - "ReadWriteMany" 909 | glusterfs: 910 | endpoints: "gluster" 911 | path: "pv65" 912 | readOnly: false 913 | persistentVolumeReclaimPolicy: "Recycle" 914 | - apiVersion: "v1" 915 | kind: "PersistentVolume" 916 | metadata: 917 | name: "pv66" 918 | spec: 919 | capacity: 920 | storage: "1000Gi" 921 | accessModes: 922 | - "ReadWriteMany" 923 | glusterfs: 924 | endpoints: "gluster" 925 | path: "pv66" 926 | readOnly: false 927 | persistentVolumeReclaimPolicy: "Recycle" 928 | - apiVersion: "v1" 929 | kind: "PersistentVolume" 930 | metadata: 931 | name: "pv67" 932 | spec: 933 | capacity: 934 | storage: "1000Gi" 935 | accessModes: 936 | - "ReadWriteMany" 937 | glusterfs: 938 | endpoints: "gluster" 939 | path: "pv67" 940 | readOnly: false 941 | persistentVolumeReclaimPolicy: "Recycle" 942 | - apiVersion: "v1" 943 | kind: "PersistentVolume" 944 | metadata: 945 | name: "pv68" 946 | spec: 947 | capacity: 948 | storage: "1000Gi" 949 | accessModes: 950 | - "ReadWriteMany" 951 | glusterfs: 952 | endpoints: "gluster" 953 | path: "pv68" 954 | readOnly: false 955 | persistentVolumeReclaimPolicy: "Recycle" 956 | - apiVersion: "v1" 957 | kind: "PersistentVolume" 958 | metadata: 959 | name: "pv69" 960 | spec: 961 | capacity: 962 | storage: "1000Gi" 963 | accessModes: 964 | - "ReadWriteMany" 965 | glusterfs: 966 | endpoints: "gluster" 967 | path: "pv69" 968 | readOnly: false 969 | persistentVolumeReclaimPolicy: "Recycle" 970 | - apiVersion: "v1" 971 | kind: "PersistentVolume" 972 | metadata: 973 | name: "pv70" 974 | spec: 975 | capacity: 976 | storage: "1000Gi" 977 | accessModes: 978 | - "ReadOnlyMany" 979 | glusterfs: 980 | endpoints: "gluster" 981 | path: "pv70" 982 | readOnly: false 983 | persistentVolumeReclaimPolicy: "Recycle" 984 | - apiVersion: "v1" 985 | kind: "PersistentVolume" 986 | metadata: 987 | name: "pv71" 988 | spec: 989 | capacity: 990 | storage: "1000Gi" 991 | accessModes: 992 | - "ReadOnlyMany" 993 | glusterfs: 994 | endpoints: "gluster" 995 | path: "pv71" 996 | readOnly: false 997 | persistentVolumeReclaimPolicy: "Recycle" 998 | - apiVersion: "v1" 999 | kind: "PersistentVolume" 1000 | metadata: 1001 | name: "pv72" 1002 | spec: 1003 | capacity: 1004 | storage: "1000Gi" 1005 | accessModes: 1006 | - "ReadOnlyMany" 1007 | glusterfs: 1008 | endpoints: "gluster" 1009 | path: "pv72" 1010 | readOnly: false 1011 | persistentVolumeReclaimPolicy: "Recycle" 1012 | - apiVersion: "v1" 1013 | kind: "PersistentVolume" 1014 | metadata: 1015 | name: "pv73" 1016 | spec: 1017 | capacity: 1018 | storage: "1000Gi" 1019 | accessModes: 1020 | - "ReadOnlyMany" 1021 | glusterfs: 1022 | endpoints: "gluster" 1023 | path: "pv73" 1024 | readOnly: false 1025 | persistentVolumeReclaimPolicy: "Recycle" 1026 | - apiVersion: "v1" 1027 | kind: "PersistentVolume" 1028 | metadata: 1029 | name: "pv74" 1030 | spec: 1031 | capacity: 1032 | storage: "1000Gi" 1033 | accessModes: 1034 | - "ReadOnlyMany" 1035 | glusterfs: 1036 | endpoints: "gluster" 1037 | path: "pv74" 1038 | readOnly: false 1039 | persistentVolumeReclaimPolicy: "Recycle" 1040 | - apiVersion: "v1" 1041 | kind: "PersistentVolume" 1042 | metadata: 1043 | name: "pv75" 1044 | spec: 1045 | capacity: 1046 | storage: "1000Gi" 1047 | accessModes: 1048 | - "ReadOnlyMany" 1049 | glusterfs: 1050 | endpoints: "gluster" 1051 | path: "pv75" 1052 | readOnly: false 1053 | persistentVolumeReclaimPolicy: "Recycle" 1054 | - apiVersion: "v1" 1055 | kind: "PersistentVolume" 1056 | metadata: 1057 | name: "pv76" 1058 | spec: 1059 | capacity: 1060 | storage: "1000Gi" 1061 | accessModes: 1062 | - "ReadOnlyMany" 1063 | glusterfs: 1064 | endpoints: "gluster" 1065 | path: "pv76" 1066 | readOnly: false 1067 | persistentVolumeReclaimPolicy: "Recycle" 1068 | - apiVersion: "v1" 1069 | kind: "PersistentVolume" 1070 | metadata: 1071 | name: "pv77" 1072 | spec: 1073 | capacity: 1074 | storage: "1000Gi" 1075 | accessModes: 1076 | - "ReadOnlyMany" 1077 | glusterfs: 1078 | endpoints: "gluster" 1079 | path: "pv77" 1080 | readOnly: false 1081 | persistentVolumeReclaimPolicy: "Recycle" 1082 | - apiVersion: "v1" 1083 | kind: "PersistentVolume" 1084 | metadata: 1085 | name: "pv78" 1086 | spec: 1087 | capacity: 1088 | storage: "1000Gi" 1089 | accessModes: 1090 | - "ReadOnlyMany" 1091 | glusterfs: 1092 | endpoints: "gluster" 1093 | path: "pv78" 1094 | readOnly: false 1095 | persistentVolumeReclaimPolicy: "Recycle" 1096 | - apiVersion: "v1" 1097 | kind: "PersistentVolume" 1098 | metadata: 1099 | name: "pv79" 1100 | spec: 1101 | capacity: 1102 | storage: "1000Gi" 1103 | accessModes: 1104 | - "ReadOnlyMany" 1105 | glusterfs: 1106 | endpoints: "gluster" 1107 | path: "pv79" 1108 | readOnly: false 1109 | persistentVolumeReclaimPolicy: "Recycle" 1110 | - apiVersion: "v1" 1111 | kind: "PersistentVolume" 1112 | metadata: 1113 | name: "pv80" 1114 | spec: 1115 | capacity: 1116 | storage: "1000Gi" 1117 | accessModes: 1118 | - "ReadOnlyMany" 1119 | glusterfs: 1120 | endpoints: "gluster" 1121 | path: "pv80" 1122 | readOnly: false 1123 | persistentVolumeReclaimPolicy: "Recycle" 1124 | - apiVersion: "v1" 1125 | kind: "PersistentVolume" 1126 | metadata: 1127 | name: "pv81" 1128 | spec: 1129 | capacity: 1130 | storage: "1000Gi" 1131 | accessModes: 1132 | - "ReadOnlyMany" 1133 | glusterfs: 1134 | endpoints: "gluster" 1135 | path: "pv81" 1136 | readOnly: false 1137 | persistentVolumeReclaimPolicy: "Recycle" 1138 | - apiVersion: "v1" 1139 | kind: "PersistentVolume" 1140 | metadata: 1141 | name: "pv82" 1142 | spec: 1143 | capacity: 1144 | storage: "1000Gi" 1145 | accessModes: 1146 | - "ReadOnlyMany" 1147 | glusterfs: 1148 | endpoints: "gluster" 1149 | path: "pv82" 1150 | readOnly: false 1151 | persistentVolumeReclaimPolicy: "Recycle" 1152 | - apiVersion: "v1" 1153 | kind: "PersistentVolume" 1154 | metadata: 1155 | name: "pv83" 1156 | spec: 1157 | capacity: 1158 | storage: "1000Gi" 1159 | accessModes: 1160 | - "ReadOnlyMany" 1161 | glusterfs: 1162 | endpoints: "gluster" 1163 | path: "pv83" 1164 | readOnly: false 1165 | persistentVolumeReclaimPolicy: "Recycle" 1166 | - apiVersion: "v1" 1167 | kind: "PersistentVolume" 1168 | metadata: 1169 | name: "pv84" 1170 | spec: 1171 | capacity: 1172 | storage: "1000Gi" 1173 | accessModes: 1174 | - "ReadOnlyMany" 1175 | glusterfs: 1176 | endpoints: "gluster" 1177 | path: "pv84" 1178 | readOnly: false 1179 | persistentVolumeReclaimPolicy: "Recycle" 1180 | - apiVersion: "v1" 1181 | kind: "PersistentVolume" 1182 | metadata: 1183 | name: "pv85" 1184 | spec: 1185 | capacity: 1186 | storage: "1000Gi" 1187 | accessModes: 1188 | - "ReadOnlyMany" 1189 | glusterfs: 1190 | endpoints: "gluster" 1191 | path: "pv85" 1192 | readOnly: false 1193 | persistentVolumeReclaimPolicy: "Recycle" 1194 | - apiVersion: "v1" 1195 | kind: "PersistentVolume" 1196 | metadata: 1197 | name: "pv86" 1198 | spec: 1199 | capacity: 1200 | storage: "1000Gi" 1201 | accessModes: 1202 | - "ReadOnlyMany" 1203 | glusterfs: 1204 | endpoints: "gluster" 1205 | path: "pv86" 1206 | readOnly: false 1207 | persistentVolumeReclaimPolicy: "Recycle" 1208 | - apiVersion: "v1" 1209 | kind: "PersistentVolume" 1210 | metadata: 1211 | name: "pv87" 1212 | spec: 1213 | capacity: 1214 | storage: "1000Gi" 1215 | accessModes: 1216 | - "ReadOnlyMany" 1217 | glusterfs: 1218 | endpoints: "gluster" 1219 | path: "pv87" 1220 | readOnly: false 1221 | persistentVolumeReclaimPolicy: "Recycle" 1222 | - apiVersion: "v1" 1223 | kind: "PersistentVolume" 1224 | metadata: 1225 | name: "pv88" 1226 | spec: 1227 | capacity: 1228 | storage: "1000Gi" 1229 | accessModes: 1230 | - "ReadOnlyMany" 1231 | glusterfs: 1232 | endpoints: "gluster" 1233 | path: "pv88" 1234 | readOnly: false 1235 | persistentVolumeReclaimPolicy: "Recycle" 1236 | - apiVersion: "v1" 1237 | kind: "PersistentVolume" 1238 | metadata: 1239 | name: "pv89" 1240 | spec: 1241 | capacity: 1242 | storage: "1000Gi" 1243 | accessModes: 1244 | - "ReadOnlyMany" 1245 | glusterfs: 1246 | endpoints: "gluster" 1247 | path: "pv89" 1248 | readOnly: false 1249 | persistentVolumeReclaimPolicy: "Recycle" 1250 | - apiVersion: "v1" 1251 | kind: "PersistentVolume" 1252 | metadata: 1253 | name: "pv90" 1254 | spec: 1255 | capacity: 1256 | storage: "1000Gi" 1257 | accessModes: 1258 | - "ReadOnlyMany" 1259 | glusterfs: 1260 | endpoints: "gluster" 1261 | path: "pv90" 1262 | readOnly: false 1263 | persistentVolumeReclaimPolicy: "Recycle" 1264 | - apiVersion: "v1" 1265 | kind: "PersistentVolume" 1266 | metadata: 1267 | name: "pv91" 1268 | spec: 1269 | capacity: 1270 | storage: "1000Gi" 1271 | accessModes: 1272 | - "ReadOnlyMany" 1273 | glusterfs: 1274 | endpoints: "gluster" 1275 | path: "pv91" 1276 | readOnly: false 1277 | persistentVolumeReclaimPolicy: "Recycle" 1278 | - apiVersion: "v1" 1279 | kind: "PersistentVolume" 1280 | metadata: 1281 | name: "pv92" 1282 | spec: 1283 | capacity: 1284 | storage: "1000Gi" 1285 | accessModes: 1286 | - "ReadOnlyMany" 1287 | glusterfs: 1288 | endpoints: "gluster" 1289 | path: "pv92" 1290 | readOnly: false 1291 | persistentVolumeReclaimPolicy: "Recycle" 1292 | - apiVersion: "v1" 1293 | kind: "PersistentVolume" 1294 | metadata: 1295 | name: "pv93" 1296 | spec: 1297 | capacity: 1298 | storage: "1000Gi" 1299 | accessModes: 1300 | - "ReadOnlyMany" 1301 | glusterfs: 1302 | endpoints: "gluster" 1303 | path: "pv93" 1304 | readOnly: false 1305 | persistentVolumeReclaimPolicy: "Recycle" 1306 | - apiVersion: "v1" 1307 | kind: "PersistentVolume" 1308 | metadata: 1309 | name: "pv94" 1310 | spec: 1311 | capacity: 1312 | storage: "1000Gi" 1313 | accessModes: 1314 | - "ReadOnlyMany" 1315 | glusterfs: 1316 | endpoints: "gluster" 1317 | path: "pv94" 1318 | readOnly: false 1319 | persistentVolumeReclaimPolicy: "Recycle" 1320 | - apiVersion: "v1" 1321 | kind: "PersistentVolume" 1322 | metadata: 1323 | name: "pv95" 1324 | spec: 1325 | capacity: 1326 | storage: "1000Gi" 1327 | accessModes: 1328 | - "ReadOnlyMany" 1329 | glusterfs: 1330 | endpoints: "gluster" 1331 | path: "pv95" 1332 | readOnly: false 1333 | persistentVolumeReclaimPolicy: "Recycle" 1334 | - apiVersion: "v1" 1335 | kind: "PersistentVolume" 1336 | metadata: 1337 | name: "pv96" 1338 | spec: 1339 | capacity: 1340 | storage: "1000Gi" 1341 | accessModes: 1342 | - "ReadOnlyMany" 1343 | glusterfs: 1344 | endpoints: "gluster" 1345 | path: "pv96" 1346 | readOnly: false 1347 | persistentVolumeReclaimPolicy: "Recycle" 1348 | - apiVersion: "v1" 1349 | kind: "PersistentVolume" 1350 | metadata: 1351 | name: "pv97" 1352 | spec: 1353 | capacity: 1354 | storage: "1000Gi" 1355 | accessModes: 1356 | - "ReadOnlyMany" 1357 | glusterfs: 1358 | endpoints: "gluster" 1359 | path: "pv97" 1360 | readOnly: false 1361 | persistentVolumeReclaimPolicy: "Recycle" 1362 | - apiVersion: "v1" 1363 | kind: "PersistentVolume" 1364 | metadata: 1365 | name: "pv98" 1366 | spec: 1367 | capacity: 1368 | storage: "1000Gi" 1369 | accessModes: 1370 | - "ReadOnlyMany" 1371 | glusterfs: 1372 | endpoints: "gluster" 1373 | path: "pv98" 1374 | readOnly: false 1375 | persistentVolumeReclaimPolicy: "Recycle" 1376 | - apiVersion: "v1" 1377 | kind: "PersistentVolume" 1378 | metadata: 1379 | name: "pv99" 1380 | spec: 1381 | capacity: 1382 | storage: "1000Gi" 1383 | accessModes: 1384 | - "ReadOnlyMany" 1385 | glusterfs: 1386 | endpoints: "gluster" 1387 | path: "pv99" 1388 | readOnly: false 1389 | persistentVolumeReclaimPolicy: "Recycle" 1390 | - apiVersion: "v1" 1391 | kind: "PersistentVolume" 1392 | metadata: 1393 | name: "pv100" 1394 | spec: 1395 | capacity: 1396 | storage: "1000Gi" 1397 | accessModes: 1398 | - "ReadOnlyMany" 1399 | glusterfs: 1400 | endpoints: "gluster" 1401 | path: "pv100" 1402 | readOnly: false 1403 | persistentVolumeReclaimPolicy: "Recycle" 1404 | --------------------------------------------------------------------------------