GlusterFS-动态卷快速应用
- 本文编译来自
- 本文地址 ,by openthings, 2018.06.09.
- 参考:
- Gluster官网,
- Gluster源码,
- Gluster文档,
- Gluster 4.0 & Kubernetes,
- GlusterFS分布式文件系统的安装配置教程,
- Kubernetes部署GlusterFS
- Adding new glusterfs StorageClass to Kubernetes?
有了一个 Kubernetes cluster 集群,以及一个工作的 Heketi Server。下一步我们将创建一个 NGINX HelloWorld application,使用Kubernetes动态存储提供机制和Heketi。
本例子假定你已经熟悉 Kubernetes 和 架构模型。
确认环境变量并收集信息用于后面的步骤
验证 Heketi REST URL 和 Server IP Address:
$ echo $HEKETI_CLI_SERVERhttp://10.42.0.0:8080
缺省情况下,user_authorization
被关闭。如果被打开,你将需要找到 rest user 和 rest user secret key (本例程不适用,任何值都可以工作)。也可以配置一个 secret
然后传递到Gluster dynamic provisioner的credentials,通过StorageClass 参数来进行。
kubectl get endpointsNAME ENDPOINTS AGEheketi 10.42.0.0:8080 22hheketi-storage-endpoints 192.168.10.100:1,192.168.10.101:1,192.168.10.102:1 22hkubernetes 192.168.10.90:6443 23h
Dynamic provisioner in Kubernetes >= 1.5
从 Kubernetes 1.5 开始,手动的Endpoint对于 GlusterFS dynamic provisioner不再需要了。在Kubernetes 1.6 和后续版本,手动指定endpoint将引起失败。当 dynamic provisioner 创建volume时将自动创建 Endpoint。
Kubernetes中这里有另外的 StorageClass 参数 (e.g. cluster, GID) 被添加到 Gluster dynamic provisioner。请参阅 获得更多的参数设置的信息。
创建 StorageClass,支持 GlusterFS Dynamic Provisioner
用于管理和支持Persistent Storage。下面是 Storage Class的例子, 将请求创建一个 5GB 的即时存储,用于这里的 HelloWorld 应用。
对 Kubernetes 1.5和以后版本:
apiVersion: storage.k8s.io/v1beta1kind: StorageClassmetadata: name: gluster-heketi <1>provisioner: kubernetes.io/glusterfs <2>parameters: resturl: "http://10.42.0.0:8080" <4> restuser: "joe" <5> restuserkey: "My Secret Life" <6>
- Name,StorageClass的名称。
- Provisioner,存储服务提供者。
- GlusterFS defined EndPoint taken from Step 1 above (kubectl get endpoints).
- For Kubernetes >= 1.6, this parameter should be removed as Kubernetes will reject this YAML definition.
- 参数
- Heketi REST Url, taken from Step 1 above (echo $HEKETI_CLI_SERVER), may also be set to the Kubernetes service DNS name for the Heketi service.
- Restuser, can be anything since authorization is turned off
- Restuserkey, like Restuser, can be anything
创建StorageClass YAML 文件,保存,然后提交到Kubernetes:
kubectl create -f gluster-storage-class.yamlstorageclass "gluster-heketi" created
查看StorageClass:
kubectl get storageclassNAME TYPEgluster-heketi kubernetes.io/glusterfs
创建PersistentVolumeClaim (PVC) 请求为HelloWorld创建存储
下一步,我们创建PVC,将请求 5GB存储空间,Kubernetes Dynamic Provisioning Framework 和 Heketi 将自动提供新的 GlusterFS volume 然后创建 Kubernetes PersistentVolume (PV) 对象。
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: gluster1 annotations: volume.beta.kubernetes.io/storage-class: gluster-heketi <1>spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi <2>
- The Kubernetes Storage Class annotation and the name of the Storage Class
- The amount of storage requested
创建PVC的YAML文件,保存,然后提交到Kubernetes集群:
kubectl create -f gluster-pvc.yamlpersistentvolumeclaim "gluster1" created
查看 PVC:
kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESSMODES AGEgluster1 Bound pvc-7d37c7bd-bb5b-11e6-b81e-525400d87180 5Gi RWO 14h
注意,PVC 绑定到动态创建的volume. 我们可以看见这个Volume (PV):
kubectl get pvNAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGEpvc-7d37c7bd-bb5b-11e6-b81e-525400d87180 5Gi RWO Delete Bound default/gluster1 14h
创建NGINX pod使用上面的PVC
At this point we have a dynamically created GlusterFS volume, bound to a PersistentVolumeClaim, we can now utilize this claim in a pod. We will create a simple NGINX pod.
apiVersion: v1kind: Podmetadata: name: nginx-pod1 labels: name: nginx-pod1spec: containers: - name: nginx-pod1 image: gcr.io/google_containers/nginx-slim:0.8 ports: - name: web containerPort: 80 volumeMounts: - name: gluster-vol1 mountPath: /usr/share/nginx/html volumes: - name: gluster-vol1 persistentVolumeClaim: claimName: gluster1
- volumes里面为PVC,在上面的步骤中创建的。
创建 Pod YAML 文件,保存,然后提交到 Kubernetes集群:
kubectl create -f nginx-pod.yamlpod "nginx-pod1" created
查看Pod (可能需要几分钟,因为需要下载 image):
kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODEnginx-pod1 1/1 Running 0 9m 10.38.0.0 node1glusterfs-node0-2509304327-vpce1 1/1 Running 0 1d 192.168.10.100 node0glusterfs-node1-3290690057-hhq92 1/1 Running 0 1d 192.168.10.101 node1glusterfs-node2-4072075787-okzjv 1/1 Running 0 1d 192.168.10.102 node2heketi-3017632314-yyngh 1/1 Running 0 1d 10.42.0.0 node0
现在进到容器中运行 exec,创建一个 index.html 文件。
kubectl exec -ti nginx-pod1 /bin/sh$ cd /usr/share/nginx/html$ echo 'Hello World from GlusterFS!!!' > index.html$ lsindex.html$ exit
现在,可以通过 curl访问 pod的URL地址(内部地址,只能内部访问,外面要用service+ingerss等方法访问):
curl http://10.38.0.0Hello World from GlusterFS!!!
最后,检查gluster pod, 查看我们写入的 index.html 文件,选择任何一个 gluster pods:
kubectl exec -ti glusterfs-node1-3290690057-hhq92 /bin/sh$ mount | grep heketi/dev/mapper/VolGroup00-LogVol00 on /var/lib/heketi type xfs (rw,relatime,seclabel,attr2,inode64,noquota)/dev/mapper/vg_f92e09091f6b20ab12b02a2513e4ed90-brick_1e730a5462c352835055018e1874e578 on /var/lib/heketi/mounts/vg_f92e09091f6b20ab12b02a2513e4ed90/brick_1e730a5462c352835055018e1874e578 type xfs (rw,noatime,seclabel,nouuid,attr2,inode64,logbsize=256k,sunit=512,swidth=512,noquota)/dev/mapper/vg_f92e09091f6b20ab12b02a2513e4ed90-brick_d8c06e606ff4cc29ccb9d018c73ee292 on /var/lib/heketi/mounts/vg_f92e09091f6b20ab12b02a2513e4ed90/brick_d8c06e606ff4cc29ccb9d018c73ee292 type xfs (rw,noatime,seclabel,nouuid,attr2,inode64,logbsize=256k,sunit=512,swidth=512,noquota)$ cd /var/lib/heketi/mounts/vg_f92e09091f6b20ab12b02a2513e4ed90/brick_d8c06e606ff4cc29ccb9d018c73ee292/brick$ lsindex.html$ cat index.html Hello World from GlusterFS!!!
服务的外部访问,参考:
- 基于Kubernetes的服务网格系统,
- Nodeport、Loadbalancer和Ingress,
- Ingress
- 部署Ingress访问代理与负载均衡器,
- Nginx ingress安装,
- nginx-ingress chart,
- traefik ingress安装,