有了一個 Kubernetes cluster 集羣,以及一個工做的 Heketi Server。下一步咱們將建立一個 NGINX HelloWorld application,使用Kubernetes動態存儲提供機制和Heketi。html
本例子假定你已經熟悉 Kubernetes 和 Kubernetes Persistent Storage 架構模型。node
驗證 Heketi REST URL 和 Server IP Address:nginx
$ echo $HEKETI_CLI_SERVER http://10.42.0.0:8080
缺省狀況下,user_authorization
被關閉。若是被打開,你將須要找到 rest user 和 rest user secret key (本例程不適用,任何值均可以工做)。也能夠配置一個 secret
而後傳遞到Gluster dynamic provisioner的credentials,經過StorageClass 參數來進行。git
kubectl get endpoints NAME ENDPOINTS AGE heketi 10.42.0.0:8080 22h heketi-storage-endpoints 192.168.10.100:1,192.168.10.101:1,192.168.10.102:1 22h kubernetes 192.168.10.90:6443 23h
從 Kubernetes 1.5 開始,手動的Endpoint對於 GlusterFS dynamic provisioner再也不須要了。在Kubernetes 1.6 和後續版本,手動指定endpoint將引發失敗。當 dynamic provisioner 建立volume時將自動建立 Endpoint。github
Kubernetes中這裏有另外的 StorageClass 參數 (e.g. cluster, GID) 被添加到 Gluster dynamic provisioner。請參閱 GlusterFS Dynamic Provisioning 得到更多的參數設置的信息。web
Kuberentes Storage Classes 用於管理和支持Persistent Storage。下面是 Storage Class的例子, 將請求建立一個 5GB 的即時存儲,用於這裏的 HelloWorld 應用。api
對 Kubernetes 1.5和之後版本:架構
apiVersion: storage.k8s.io/v1beta1 kind: StorageClass metadata: 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>
建立StorageClass YAML 文件,保存,而後提交到Kubernetes:app
kubectl create -f gluster-storage-class.yaml storageclass "gluster-heketi" created
查看StorageClass:負載均衡
kubectl get storageclass NAME TYPE gluster-heketi kubernetes.io/glusterfs
下一步,咱們建立PVC,將請求 5GB存儲空間,Kubernetes Dynamic Provisioning Framework 和 Heketi 將自動提供新的 GlusterFS volume 而後建立 Kubernetes PersistentVolume (PV) 對象。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: gluster1 annotations: volume.beta.kubernetes.io/storage-class: gluster-heketi <1> spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi <2>
建立PVC的YAML文件,保存,而後提交到Kubernetes集羣:
kubectl create -f gluster-pvc.yaml persistentvolumeclaim "gluster1" created
查看 PVC:
kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESSMODES AGE gluster1 Bound pvc-7d37c7bd-bb5b-11e6-b81e-525400d87180 5Gi RWO 14h
注意,PVC 綁定到動態建立的volume. 咱們能夠看見這個Volume (PV):
kubectl get pv NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE pvc-7d37c7bd-bb5b-11e6-b81e-525400d87180 5Gi RWO Delete Bound default/gluster1 14h
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: v1 kind: Pod metadata: name: nginx-pod1 labels: name: nginx-pod1 spec: 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
建立 Pod YAML 文件,保存,而後提交到 Kubernetes集羣:
kubectl create -f nginx-pod.yaml pod "nginx-pod1" created
查看Pod (可能須要幾分鐘,由於須要下載 image):
kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-pod1 1/1 Running 0 9m 10.38.0.0 node1 glusterfs-node0-2509304327-vpce1 1/1 Running 0 1d 192.168.10.100 node0 glusterfs-node1-3290690057-hhq92 1/1 Running 0 1d 192.168.10.101 node1 glusterfs-node2-4072075787-okzjv 1/1 Running 0 1d 192.168.10.102 node2 heketi-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 $ ls index.html $ exit
如今,能夠經過 curl訪問 pod的URL地址(內部地址,只能內部訪問,外面要用service+ingerss等方法訪問):
curl http://10.38.0.0 Hello 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 $ ls index.html $ cat index.html Hello World from GlusterFS!!!
服務的外部訪問,參考: