将新的glusterfs StorageClass添加到Kubernetes?

时间:2017-12-20 22:46:28

标签: kubernetes storage glusterfs kubernetes-helm

我在这两个指南的混合之后在两个VirtualBox VM上设置了GlusterFS存储:

https://wiki.centos.org/HowTos/GlusterFSonCentOS

http://docs.gluster.org/en/latest/Quick-Start-Guide/Quickstart/

内部网络的DHCP分配IP为10.10.10.4和10.10.10.5。我已经验证了存储是否正常工作并且符合预期。

此时,我尝试使用YAML文件向Kubernetes添加新的StorageClass,我可以在该主题上找到的唯一资源与OpenShift或Heketi GlusterFS有关。

我开始创建存储类,如下所示:

# storage-class.yml
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: gluster-container
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "10.10.10.5"

我假设这不完整但无法找到有关如何配置此信息的更多信息。当我尝试使用它进行测试时,我收到以下错误:

ProvisioningFailed - Failed to provision volume with StorageClass "gluster-container": create volume error: error creating volume Post 10.10.10.5/volumes: unsupported protocol scheme ""

任何人都有任何想法如何从这里开始?

2 个答案:

答案 0 :(得分:1)

kubernetes中的GlusterFS配置程序想要动态配置GlusterFS卷 - 如下所示:

gluster volume create glustervol1 replica 2 transport tcp 
gluster1.example.com:/bricks/brick1/brick \ 
gluster2.example.com:/bricks/brick1/brick.

GlusterFS本身没有API端点来触发创建这些卷的命令;但是,社区已经开发Heketi作为GlusterFS的API端点。 Heketi的RESTful管理界面端点是您的kubernetes resturlStorageClass的值。

正如@Vishal Biyani评论的那样,http://blog.infracloud.io/gluster-heketi-kubernetes/是关于如何在GCP上快速开始使用Heketi并将其连接到kubernetes的文章。

如果您的环境中不需要动态配置GlusterFS卷,则可以使用NFS StorageClass并指向GlusterFS前面的负载均衡器。您仍然可以获得GlusterFS复制和分发的强大功能,但它需要您启用NFS gluster服务并手动创建要向kubernetes公开的每个gluster卷。

答案 1 :(得分:0)

我创建了一个脚本来管理glusterFS卷声明:

if [[ "$#" -le 3 ]]; then
  echo "Usage:"
  echo "   $0 <operation> <namespace> <name> <size>"
  echo "   - operation: create | delete"
  exit
fi

OPERATION=$1
NAMESPACE=$2
NAME=$3
SIZE=$4

function create {
  gluster volume create $NAMESPACE-$NAME replica 3  server1:/mnt/gluster-storage/brick-$NAMESPACE-$NAME server2:/mnt/gluster-storage/brick-$NAMESPACE-$NAME server3:/mnt/gluster-storage/brick-$NAMESPACE-$NAME  
  gluster volume start $NAMESPACE-$NAME

  kubectl -n $NAMESPACE apply -f /etc/kubernetes/glusterfs-endpoints.yml
  kubectl -n $NAMESPACE apply -f /etc/kubernetes/glusterfs-service.yml

  cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
  name: $NAME
  namespace: $NAMESPACE
spec:
  capacity:
    storage: $SIZE
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: glusterfs-cluster
    path: $NAMESPACE-$NAME
    readOnly: false
  persistentVolumeReclaimPolicy: Retain
  claimRef:
    namespace: $NAMESPACE
    name: $NAME
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: $NAME
  namespace: $NAMESPACE
spec:
  accessModes:
  - ReadWriteMany
  resources:
     requests:
       storage: $SIZE
EOF
}

function delete {
  kubectl -n $NAMESPACE delete pvc $NAME
  kubectl delete pv $NAME

  yes | gluster volume stop $NAMESPACE-$NAME
  echo
  yes | gluster volume delete $NAMESPACE-$NAME
  echo
  echo "#################################################################"
  echo "REMOVE BRICKS MANUALLY:"
  echo "  server1:/mnt/gluster-storage/brick-$NAMESPACE-$NAME"
  echo "  server2:/mnt/gluster-storage/brick-$NAMESPACE-$NAME"
  echo "  server3:/mnt/gluster-storage/brick-$NAMESPACE-$NAME"
  echo "#################################################################"
}

case $OPERATION in
  create)
    create
    ;;
  delete)
    delete
    ;;
esac

这将创建gluster卷并将其映射到Kubernetes中的卷声明。因此,您可以使用glusterfs挂载而无需自动配置。

确保在docker之外运行kubelet,否则你将使用旧版本的gluster.fuse,它错过了现代版本的许多优化。