我在这两个指南的混合之后在两个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 ""
任何人都有任何想法如何从这里开始?
答案 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 resturl
中StorageClass
的值。
正如@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,它错过了现代版本的许多优化。