parent
67aa497236
commit
59f31a98f2
Binary file not shown.
|
@ -0,0 +1,19 @@
|
|||
annotations:
|
||||
catalog.cattle.io/certified: partner
|
||||
catalog.cattle.io/display-name: Quobyte Cluster Deployment
|
||||
catalog.cattle.io/kube-version: 1.20-0 - 1.24-0
|
||||
catalog.cattle.io/release-name: quobyte-cluster
|
||||
apiVersion: v2
|
||||
appVersion: "3"
|
||||
description: Quobyte Cluster Helm Chart Deployment
|
||||
home: https://www.quobyte.com
|
||||
icon: https://quobyte.github.io/quobyte-k8s-resources/images/quobyte.png
|
||||
keywords:
|
||||
- quobyte
|
||||
- storage
|
||||
kubeVersion: 1.20-0 - 1.24-0
|
||||
name: quobyte-cluster
|
||||
sources:
|
||||
- https://github.com/quobyte/quobyte-k8s-resources
|
||||
type: application
|
||||
version: 0.1.5
|
|
@ -0,0 +1,31 @@
|
|||
# Quobyte Cluster Helm Chart
|
||||
|
||||
This Helm Chart will install a Quobyte storage cluster.
|
||||
|
||||
## Preparation
|
||||
|
||||
You need to specify the infrastructure provider to provision
|
||||
storage devices. A sample "values.yaml" looks like this:
|
||||
|
||||
```
|
||||
quobyte:
|
||||
# Name depends on the cloud environment, e.g. pd-ssd for Google Kubernetes Engine
|
||||
# flashStorage: gp2 # AWS general purpose SSD
|
||||
flashStorage: pd-ssd
|
||||
# Storage provider depending to the cloud environment
|
||||
# storageProvisioner: kubernetes.io/aws-ebs
|
||||
storageProvisioner: kubernetes.io/gce-pd
|
||||
|
||||
```
|
||||
|
||||
You can inspect the values.yaml for other values to modify, but default should work.
|
||||
|
||||
This Helm Chart can be installed as usual:
|
||||
|
||||
```
|
||||
helm repo add quobyte https://quobyte.github.io/quobyte-k8s-resources/helm-charts
|
||||
helm repo update
|
||||
helm install my-storage-cluster quobyte/quobyte-cluster
|
||||
```
|
||||
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
# Quobyte Storage Cluster
|
||||
|
||||
This Helm Chart will install a Quobyte storage cluster:
|
||||
https://www.quobyte.com
|
||||
|
||||
Quobyte is a software defined, distributed storage system.
|
||||
|
||||
It allows parallel access from thousands of clients.
|
||||
|
||||
From a Kubernetes point of view it supports dynamic volume
|
||||
provisioning with
|
||||
|
||||
* Multi Tenancy
|
||||
* Encryption at Rest
|
||||
* ReadWriteMany
|
||||
|
||||
To read about the full feature set have a look at the Quobyte documentation:
|
||||
|
||||
https://docs.quobyte.com/
|
||||
|
||||
or the more generic product overview:
|
||||
|
||||
https://www.quobyte.com/product/
|
||||
|
||||
For a detailed description of possbile configuration options comments and defaults in
|
||||
values.yaml.
|
|
@ -0,0 +1,24 @@
|
|||
questions:
|
||||
- variable: quobyte.storageProvisioner
|
||||
default: kubernetes.io/gce-pd
|
||||
required: true
|
||||
type: string
|
||||
label: Storage Provisioner
|
||||
description: >
|
||||
The provisioner Quobyte uses to provision storage devices.
|
||||
For example "kubernetes.io/gce-pd" on Google GKE, "kubernetes.io/aws-ebs" on AWS.
|
||||
- variable: quobyte.flashStorage
|
||||
default: pd-ssd
|
||||
required: true
|
||||
type: string
|
||||
label: Storage Class
|
||||
description: >
|
||||
The cloud provider storage class Quobyte uses when provisioning fast storage devices.
|
||||
For example "pd-ssd" on Google GKE, "gp2" on AWS.
|
||||
- variable: quobyte.replicas
|
||||
default: 3
|
||||
required: false
|
||||
label: Service Replicas
|
||||
description: >
|
||||
The number of service replicas for each Quobyte service (registry, metadata, data).
|
||||
Must not be greater than number of available nodes.
|
|
@ -0,0 +1,10 @@
|
|||
Welcome to Quobyte :)
|
||||
|
||||
You just installed a truly scalable storage cluster.
|
||||
|
||||
You can now log in to the quobyte web console. To get the
|
||||
webconsole address you can get the k8s service like this:
|
||||
|
||||
$ kubectl get svc/quobyte-webui
|
||||
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: quobyte-api
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: quobyte-api # has to match .spec.template.metadata.labels
|
||||
replicas: {{ .Values.quobyte.replicas }} # by default is 4
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: quobyte-api # has to match .spec.selector.matchLabels
|
||||
annotations:
|
||||
timestamp: "{{ now }}"
|
||||
spec:
|
||||
terminationGracePeriodSeconds: 10
|
||||
hostNetwork: true
|
||||
dnsPolicy: ClusterFirstWithHostNet
|
||||
containers:
|
||||
- name: quobyte-api
|
||||
image: {{ .Values.quobyte.image }}
|
||||
imagePullPolicy: Always
|
||||
env:
|
||||
- name: NODENAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: MY_POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: HOST_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: QUOBYTE_DATA_PORT
|
||||
value: "7863"
|
||||
- name: QUOBYTE_META_PORT
|
||||
value: "7862"
|
||||
- name: QUOBYTE_REG_PORT
|
||||
value: "7861"
|
||||
- name: QUOBYTE_API_PORT
|
||||
value: "7860"
|
||||
- name: CLOUD_INSTALL
|
||||
value: "1"
|
||||
- name: QUOBYTE_SERVICE
|
||||
value: api
|
||||
- name: QUOBYTE_REGISTRY
|
||||
value: _quobyte._tcp.quobyte.{{ .Release.Namespace }}.svc.cluster.local
|
||||
- name: CLUSTER_NS
|
||||
value: {{ .Release.Namespace }}
|
||||
- name: LIMIT_OPEN_FILES
|
||||
value: "{{ .Values.quobyte.maxopenfiles }}"
|
||||
- name: LIMIT_MAX_PROCESSES
|
||||
value: "{{ .Values.quobyte.maxprocs }}"
|
||||
ports:
|
||||
- containerPort: 7860
|
||||
name: quobyteapi
|
||||
{{- if .Values.nodepoolname }}
|
||||
nodeSelector:
|
||||
storage-node-pool: {{ .Values.nodepoolname }}
|
||||
{{- end }}
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- quobyte
|
||||
topologyKey: "kubernetes.io/hostname"
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
# This is a headless service in order to get svc entries in kube-dns
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: quobyte-api
|
||||
labels:
|
||||
app: quobyte-api
|
||||
spec:
|
||||
ports:
|
||||
- port: 7860
|
||||
name: "quobyte"
|
||||
protocol: "TCP"
|
||||
targetPort: 7860
|
||||
selector:
|
||||
app: quobyte-api
|
||||
|
|
@ -0,0 +1,157 @@
|
|||
---
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: quobyte-data
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: quobyte-data # has to match .spec.template.metadata.labels
|
||||
serviceName: "quobyte-data"
|
||||
replicas: {{ .Values.quobyte.replicas }} # by default is 4
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: quobyte-data # has to match .spec.selector.matchLabels
|
||||
annotations:
|
||||
timestamp: "{{ now }}"
|
||||
spec:
|
||||
terminationGracePeriodSeconds: 10
|
||||
hostNetwork: true
|
||||
dnsPolicy: ClusterFirstWithHostNet
|
||||
initContainers:
|
||||
- name: quobyte-data-pre
|
||||
image: {{ .Values.quobyte.image }}
|
||||
env:
|
||||
- name: NODENAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: MY_POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: HOST_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: QUOBYTE_DATA_PORT
|
||||
value: "7863"
|
||||
- name: QUOBYTE_META_PORT
|
||||
value: "7862"
|
||||
- name: QUOBYTE_REG_PORT
|
||||
value: "7861"
|
||||
- name: QUOBYTE_API_PORT
|
||||
value: "7860"
|
||||
- name: QUOBYTE_SERVICE
|
||||
value: data
|
||||
- name: CLOUD_INSTALL
|
||||
value: "1"
|
||||
- name: CLUSTER_NS
|
||||
value: {{ .Release.Namespace }}
|
||||
- name: LIMIT_OPEN_FILES
|
||||
value: "{{ .Values.quobyte.maxopenfiles }}"
|
||||
- name: LIMIT_MAX_PROCESSES
|
||||
value: "{{ .Values.quobyte.maxprocs }}"
|
||||
volumeMounts:
|
||||
- name: config
|
||||
mountPath: /etc/quobyte
|
||||
{{- range .Values.quobyte.datadisks }}
|
||||
- name: {{ .name }}
|
||||
mountPath: {{ .mountpoint }}
|
||||
{{- end }}
|
||||
command:
|
||||
- /bin/sh
|
||||
- -xc
|
||||
- |
|
||||
touch /etc/quobyte/$QUOBYTE_SERVICE.cfg
|
||||
echo test.device_dir=/var/lib/quobyte/devices >> /etc/quobyte/data.cfg
|
||||
echo rpc.bind.address=${MY_POD_IP} >> /etc/quobyte/data.cfg
|
||||
echo hostname=${HOSTNAME} >> /etc/quobyte/data.cfg
|
||||
for j in $(ls -d /var/lib/quobyte/devices/data*)
|
||||
do
|
||||
i=$(basename $j)
|
||||
if [ ! -e /var/lib/quobyte/devices/${i}/QUOBYTE_DEV_SETUP ];then
|
||||
/usr/bin/qmkdev -d -t DATA /var/lib/quobyte/devices/${i}
|
||||
fi
|
||||
done
|
||||
containers:
|
||||
- name: quobyte-data
|
||||
image: {{ .Values.quobyte.image }}
|
||||
imagePullPolicy: Always
|
||||
env:
|
||||
- name: NODENAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: MY_POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: HOST_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: QUOBYTE_DATA_PORT
|
||||
value: "7863"
|
||||
- name: QUOBYTE_META_PORT
|
||||
value: "7862"
|
||||
- name: QUOBYTE_REG_PORT
|
||||
value: "7861"
|
||||
- name: QUOBYTE_API_PORT
|
||||
value: "7860"
|
||||
- name: QUOBYTE_SERVICE
|
||||
value: data
|
||||
- name: CLOUD_INSTALL
|
||||
value: "1"
|
||||
- name: CLUSTER_NS
|
||||
value: {{ .Release.Namespace }}
|
||||
- name: QUOBYTE_REGISTRY
|
||||
value: _quobyte._tcp.quobyte.{{ .Release.Namespace }}.svc.cluster.local
|
||||
- name: LIMIT_OPEN_FILES
|
||||
value: "{{ .Values.quobyte.maxopenfiles }}"
|
||||
- name: LIMIT_MAX_PROCESSES
|
||||
value: "{{ .Values.quobyte.maxprocs }}"
|
||||
ports:
|
||||
- containerPort: 7863
|
||||
name: quobyte-data
|
||||
volumeMounts:
|
||||
- name: config
|
||||
mountPath: /etc/quobyte
|
||||
{{- range .Values.quobyte.datadisks }}
|
||||
- name: {{ .name }}
|
||||
mountPath: {{ .mountpoint }}
|
||||
{{- end }}
|
||||
{{- if .Values.nodepoolname }}
|
||||
nodeSelector:
|
||||
storage-node-pool: {{ .Values.nodepoolname }}
|
||||
{{- end }}
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- quobyte
|
||||
topologyKey: "kubernetes.io/hostname"
|
||||
volumeClaimTemplates:
|
||||
- metadata:
|
||||
name: config
|
||||
spec:
|
||||
accessModes: [ "ReadWriteOnce" ]
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
{{- range .Values.quobyte.datadisks }}
|
||||
- metadata:
|
||||
name: {{ .name }}
|
||||
spec:
|
||||
accessModes: [ "ReadWriteOnce" ]
|
||||
storageClassName: "faster"
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .size }}
|
||||
{{- end }}
|
||||
|
|
@ -0,0 +1,156 @@
|
|||
---
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: quobyte-meta
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: quobyte-meta # has to match .spec.template.metadata.labels
|
||||
serviceName: "quobyte-meta"
|
||||
replicas: {{ .Values.quobyte.replicas }} # by default is 4
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: quobyte-meta # has to match .spec.selector.matchLabels
|
||||
annotations:
|
||||
timestamp: "{{ now }}"
|
||||
spec:
|
||||
terminationGracePeriodSeconds: 10
|
||||
hostNetwork: true
|
||||
dnsPolicy: ClusterFirstWithHostNet
|
||||
initContainers:
|
||||
- name: quobyte-meta-pre
|
||||
image: {{ .Values.quobyte.image }}
|
||||
env:
|
||||
- name: NODENAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: MY_POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: HOST_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: QUOBYTE_DATA_PORT
|
||||
value: "7863"
|
||||
- name: QUOBYTE_META_PORT
|
||||
value: "7862"
|
||||
- name: QUOBYTE_REG_PORT
|
||||
value: "7861"
|
||||
- name: QUOBYTE_API_PORT
|
||||
value: "7860"
|
||||
- name: QUOBYTE_SERVICE
|
||||
value: metadata
|
||||
- name: CLOUD_INSTALL
|
||||
value: "1"
|
||||
- name: CLUSTER_NS
|
||||
value: {{ .Release.Namespace }}
|
||||
- name: LIMIT_OPEN_FILES
|
||||
value: "{{ .Values.quobyte.maxopenfiles }}"
|
||||
- name: LIMIT_MAX_PROCESSES
|
||||
value: "{{ .Values.quobyte.maxprocs }}"
|
||||
volumeMounts:
|
||||
- name: config
|
||||
mountPath: /etc/quobyte
|
||||
{{- range .Values.quobyte.metadatadisks }}
|
||||
- name: {{ .name }}
|
||||
mountPath: {{ .mountpoint }}
|
||||
{{- end }}
|
||||
command:
|
||||
- /bin/sh
|
||||
- -xc
|
||||
- |
|
||||
touch /etc/quobyte/$QUOBYTE_SERVICE.cfg
|
||||
echo test.device_dir=/var/lib/quobyte/devices >> /etc/quobyte/metadata.cfg
|
||||
echo rpc.bind.address=${MY_POD_IP} >> /etc/quobyte/metadata.cfg
|
||||
echo hostname=${HOSTNAME} >> /etc/quobyte/metadata.cfg
|
||||
for j in $(ls -d /var/lib/quobyte/devices/metadata*)
|
||||
do
|
||||
i=$(basename $j)
|
||||
if [ ! -e /var/lib/quobyte/devices/${i}/QUOBYTE_DEV_SETUP ];then
|
||||
/usr/bin/qmkdev -d -t METADATA /var/lib/quobyte/devices/${i}
|
||||
fi
|
||||
done
|
||||
containers:
|
||||
- name: quobyte
|
||||
image: {{ .Values.quobyte.image }}
|
||||
imagePullPolicy: Always
|
||||
env:
|
||||
- name: NODENAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: MY_POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: HOST_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: QUOBYTE_DATA_PORT
|
||||
value: "7863"
|
||||
- name: QUOBYTE_META_PORT
|
||||
value: "7862"
|
||||
- name: QUOBYTE_REG_PORT
|
||||
value: "7861"
|
||||
- name: QUOBYTE_API_PORT
|
||||
value: "7860"
|
||||
- name: CLOUD_INSTALL
|
||||
value: "1"
|
||||
- name: QUOBYTE_SERVICE
|
||||
value: metadata
|
||||
- name: QUOBYTE_REGISTRY
|
||||
value: _quobyte._tcp.quobyte.{{ .Release.Namespace }}.svc.cluster.local
|
||||
- name: CLUSTER_NS
|
||||
value: {{ .Release.Namespace }}
|
||||
- name: LIMIT_OPEN_FILES
|
||||
value: "{{ .Values.quobyte.maxopenfiles }}"
|
||||
- name: LIMIT_MAX_PROCESSES
|
||||
value: "{{ .Values.quobyte.maxprocs }}"
|
||||
ports:
|
||||
- containerPort: 7862
|
||||
name: quobyte-meta
|
||||
volumeMounts:
|
||||
- name: config
|
||||
mountPath: /etc/quobyte
|
||||
{{- range .Values.quobyte.metadatadisks }}
|
||||
- name: {{ .name }}
|
||||
mountPath: {{ .mountpoint }}
|
||||
{{- end }}
|
||||
{{- if .Values.nodepoolname }}
|
||||
nodeSelector:
|
||||
storage-node-pool: {{ .Values.nodepoolname }}
|
||||
{{- end }}
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- quobyte
|
||||
topologyKey: "kubernetes.io/hostname"
|
||||
volumeClaimTemplates:
|
||||
- metadata:
|
||||
name: config
|
||||
spec:
|
||||
accessModes: [ "ReadWriteOnce" ]
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
{{- range .Values.quobyte.metadatadisks }}
|
||||
- metadata:
|
||||
name: {{ .name }}
|
||||
spec:
|
||||
accessModes: [ "ReadWriteOnce" ]
|
||||
storageClassName: "faster"
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .size }}
|
||||
{{- end }}
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
# Quobyte registry service.
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: quobyte
|
||||
labels:
|
||||
app: quobyte
|
||||
spec:
|
||||
clusterIP: "None"
|
||||
ports:
|
||||
- port: 7861
|
||||
name: "quobyte"
|
||||
targetPort: 7861
|
||||
selector:
|
||||
app: quobyte-reg
|
||||
|
|
@ -0,0 +1,149 @@
|
|||
---
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: quobyte-reg
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: quobyte-reg # has to match .spec.template.metadata.labels
|
||||
serviceName: "quobyte"
|
||||
replicas: {{ .Values.quobyte.replicas }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: quobyte-reg # has to match .spec.selector.matchLabels
|
||||
annotations:
|
||||
timestamp: "{{ now }}"
|
||||
spec:
|
||||
subdomain: "quobyte"
|
||||
terminationGracePeriodSeconds: 10
|
||||
hostNetwork: true
|
||||
dnsPolicy: ClusterFirstWithHostNet
|
||||
initContainers:
|
||||
- name: quobyte-reg-pre
|
||||
image: {{ .Values.quobyte.image }}
|
||||
env:
|
||||
- name: NODENAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: MY_POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: QUOBYTE_DATA_PORT
|
||||
value: "7863"
|
||||
- name: QUOBYTE_META_PORT
|
||||
value: "7862"
|
||||
- name: QUOBYTE_REG_PORT
|
||||
value: "7861"
|
||||
- name: QUOBYTE_API_PORT
|
||||
value: "7860"
|
||||
- name: QUOBYTE_SERVICE
|
||||
value: registry
|
||||
- name: CLOUD_INSTALL
|
||||
value: "1"
|
||||
- name: CLUSTER_NS
|
||||
value: {{ .Release.Namespace }}
|
||||
- name: LIMIT_OPEN_FILES
|
||||
value: "{{ .Values.quobyte.maxopenfiles }}"
|
||||
- name: LIMIT_MAX_PROCESSES
|
||||
value: "{{ .Values.quobyte.maxprocs }}"
|
||||
volumeMounts:
|
||||
- name: config
|
||||
mountPath: /etc/quobyte
|
||||
- name: registry
|
||||
mountPath: /var/lib/quobyte/devices/registry
|
||||
command:
|
||||
- /bin/sh
|
||||
- -xc
|
||||
- |
|
||||
touch /etc/quobyte/$QUOBYTE_SERVICE.cfg
|
||||
echo test.device_dir=/var/lib/quobyte/devices >> /etc/quobyte/registry.cfg
|
||||
echo rpc.bind.address=${MY_POD_IP} >> /etc/quobyte/registry.cfg
|
||||
echo hostname=${HOSTNAME} >> /etc/quobyte/registry.cfg
|
||||
NODENUM=$(echo "$NODENAME" | tr -dc "0-9")
|
||||
if [ ! -e /var/lib/quobyte/devices/registry/QUOBYTE_DEV_SETUP ]; then
|
||||
if [[ $NODENUM == 0 ]]; then
|
||||
/usr/bin/qbootstrap -y -d /var/lib/quobyte/devices/registry
|
||||
else
|
||||
/usr/bin/qmkdev -d -t REGISTRY /var/lib/quobyte/devices/registry
|
||||
fi
|
||||
fi
|
||||
containers:
|
||||
- name: quobyte-reg
|
||||
image: {{ .Values.quobyte.image }}
|
||||
imagePullPolicy: Always
|
||||
env:
|
||||
- name: NODENAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: MY_POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: HOST_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: QUOBYTE_DATA_PORT
|
||||
value: "7863"
|
||||
- name: QUOBYTE_META_PORT
|
||||
value: "7862"
|
||||
- name: QUOBYTE_REG_PORT
|
||||
value: "7861"
|
||||
- name: QUOBYTE_API_PORT
|
||||
value: "7860"
|
||||
- name: QUOBYTE_SERVICE
|
||||
value: registry
|
||||
- name: CLOUD_INSTALL
|
||||
value: "1"
|
||||
- name: CLUSTER_NS
|
||||
value: {{ .Release.Namespace }}
|
||||
- name: QUOBYTE_REGISTRY
|
||||
value: _quobyte._tcp.quobyte.{{ .Release.Namespace }}.svc.cluster.local
|
||||
- name: LIMIT_OPEN_FILES
|
||||
value: "{{ .Values.quobyte.maxopenfiles }}"
|
||||
- name: LIMIT_MAX_PROCESSES
|
||||
value: "{{ .Values.quobyte.maxprocs }}"
|
||||
ports:
|
||||
- containerPort: 7861
|
||||
name: quobyte-reg
|
||||
volumeMounts:
|
||||
- name: config
|
||||
mountPath: /etc/quobyte
|
||||
- name: registry
|
||||
mountPath: /var/lib/quobyte/devices/registry
|
||||
{{- if .Values.nodepoolname }}
|
||||
nodeSelector:
|
||||
storage-node-pool: {{ .Values.nodepoolname }}
|
||||
{{- end }}
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- quobyte-reg
|
||||
topologyKey: "kubernetes.io/hostname"
|
||||
volumeClaimTemplates:
|
||||
- metadata:
|
||||
name: config
|
||||
spec:
|
||||
accessModes: [ "ReadWriteOnce" ]
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
- metadata:
|
||||
name: registry
|
||||
spec:
|
||||
accessModes: [ "ReadWriteOnce" ]
|
||||
storageClassName: "faster"
|
||||
resources:
|
||||
requests:
|
||||
storage: 25Gi
|
||||
|
|
@ -0,0 +1,137 @@
|
|||
{{- if .Values.quobyte.s3.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: quobyte-s3
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: quobyte-s3 # has to match .spec.template.metadata.labels
|
||||
serviceName: "quobyte"
|
||||
replicas: {{ .Values.quobyte.replicas }} # by default is 4
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: quobyte-s3 # has to match .spec.selector.matchLabels
|
||||
annotations:
|
||||
timestamp: "{{ now }}"
|
||||
spec:
|
||||
terminationGracePeriodSeconds: 10
|
||||
hostNetwork: true
|
||||
dnsPolicy: ClusterFirstWithHostNet
|
||||
initContainers:
|
||||
- name: quobyte-s3-pre
|
||||
image: {{ .Values.quobyte.image }}
|
||||
env:
|
||||
- name: NODENAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: MY_POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: HOST_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: QUOBYTE_DATA_PORT
|
||||
value: "7863"
|
||||
- name: QUOBYTE_META_PORT
|
||||
value: "7862"
|
||||
- name: QUOBYTE_REG_PORT
|
||||
value: "7861"
|
||||
- name: QUOBYTE_API_PORT
|
||||
value: "7860"
|
||||
- name: QUOBYTE_SERVICE
|
||||
value: s3
|
||||
- name: CLOUD_INSTALL
|
||||
value: "1"
|
||||
- name: CLUSTER_NS
|
||||
value: {{ .Release.Namespace }}
|
||||
- name: LIMIT_OPEN_FILES
|
||||
value: "{{ .Values.quobyte.maxopenfiles }}"
|
||||
- name: LIMIT_MAX_PROCESSES
|
||||
value: "{{ .Values.quobyte.maxprocs }}"
|
||||
- name: QUOBYTE_S3_HOSTNAME
|
||||
value: "{{ .Values.s3.dnsname }}"
|
||||
volumeMounts:
|
||||
- name: config-s3
|
||||
mountPath: /etc/quobyte
|
||||
command:
|
||||
- /bin/sh
|
||||
- -xc
|
||||
- |
|
||||
touch /etc/quobyte/$QUOBYTE_SERVICE.cfg
|
||||
echo test.device_dir=/var/lib/quobyte/devices >> /etc/quobyte/s3.cfg
|
||||
echo rpc.bind.address=${MY_POD_IP} >> /etc/quobyte/s3.cfg
|
||||
echo hostname=${HOSTNAME} >> /etc/quobyte/s3.cfg
|
||||
containers:
|
||||
- name: quobyte-s3
|
||||
image: {{ .Values.quobyte.image }}
|
||||
imagePullPolicy: Always
|
||||
env:
|
||||
- name: NODENAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: MY_POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: HOST_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: QUOBYTE_DATA_PORT
|
||||
value: "7863"
|
||||
- name: QUOBYTE_META_PORT
|
||||
value: "7862"
|
||||
- name: QUOBYTE_REG_PORT
|
||||
value: "7861"
|
||||
- name: QUOBYTE_API_PORT
|
||||
value: "7860"
|
||||
- name: QUOBYTE_SERVICE
|
||||
value: s3
|
||||
- name: CLOUD_INSTALL
|
||||
value: "1"
|
||||
- name: CLUSTER_NS
|
||||
value: {{ .Release.Namespace }}
|
||||
- name: LIMIT_OPEN_FILES
|
||||
value: "{{ .Values.quobyte.maxopenfiles }}"
|
||||
- name: LIMIT_MAX_PROCESSES
|
||||
value: "{{ .Values.quobyte.maxprocs }}"
|
||||
- name: QUOBYTE_SERVICE
|
||||
value: s3
|
||||
- name: QUOBYTE_S3_HOSTNAME
|
||||
value: "{{ .Values.s3.dnsname }}"
|
||||
ports:
|
||||
- containerPort: 80
|
||||
name: quobyte-s3
|
||||
volumeMounts:
|
||||
- name: config-s3
|
||||
mountPath: /etc/quobyte
|
||||
{{- if .Values.nodepoolname }}
|
||||
nodeSelector:
|
||||
storage-node-pool: {{ .Values.nodepoolname }}
|
||||
{{- end }}
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- quobyte
|
||||
topologyKey: "kubernetes.io/hostname"
|
||||
volumeClaimTemplates:
|
||||
- metadata:
|
||||
name: config-s3
|
||||
spec:
|
||||
accessModes: [ "ReadWriteOnce" ]
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
{{- end }}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
apiVersion: storage.k8s.io/v1
|
||||
kind: StorageClass
|
||||
metadata:
|
||||
name: faster
|
||||
provisioner: {{ .Values.quobyte.storageProvisioner }}
|
||||
parameters:
|
||||
type: {{ .Values.quobyte.flashStorage }}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: quobyte-web
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: quobyte-web # has to match .spec.template.metadata.labels
|
||||
##replicas: {{ .Values.quobyte.replicas }} # by default is 4
|
||||
replicas: 1 # by default is 4
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: quobyte-web # has to match .spec.selector.matchLabels
|
||||
annotations:
|
||||
timestamp: "{{ now }}"
|
||||
spec:
|
||||
terminationGracePeriodSeconds: 10
|
||||
hostNetwork: true
|
||||
dnsPolicy: ClusterFirstWithHostNet
|
||||
containers:
|
||||
- name: quobyte-web
|
||||
image: {{ .Values.quobyte.image }}
|
||||
imagePullPolicy: Always
|
||||
env:
|
||||
- name: NODENAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: MY_POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: HOST_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: QUOBYTE_DATA_PORT
|
||||
value: "7863"
|
||||
- name: QUOBYTE_META_PORT
|
||||
value: "7862"
|
||||
- name: QUOBYTE_REG_PORT
|
||||
value: "7861"
|
||||
- name: QUOBYTE_API_PORT
|
||||
value: "7860"
|
||||
- name: QUOBYTE_SERVICE
|
||||
value: webconsole
|
||||
- name: QUOBYTE_WEBCONSOLE_PORT
|
||||
value: "{{ .Values.quobyte.webconsoleport }}"
|
||||
- name: CLOUD_INSTALL
|
||||
value: "1"
|
||||
- name: QUOBYTE_REGISTRY
|
||||
value: _quobyte._tcp.quobyte.{{ .Release.Namespace }}.svc.cluster.local
|
||||
- name: CLUSTER_NS
|
||||
value: {{ .Release.Namespace }}
|
||||
- name: LIMIT_OPEN_FILES
|
||||
value: "{{ .Values.quobyte.maxopenfiles }}"
|
||||
- name: LIMIT_MAX_PROCESSES
|
||||
value: "{{ .Values.quobyte.maxprocs }}"
|
||||
ports:
|
||||
- containerPort: 8080
|
||||
name: quobyte-web
|
||||
{{- if .Values.nodepoolname }}
|
||||
nodeSelector:
|
||||
storage-node-pool: {{ .Values.nodepoolname }}
|
||||
{{- end }}
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- quobyte
|
||||
topologyKey: "kubernetes.io/hostname"
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: quobyte-webui
|
||||
{{- if .Values.quobyte.lbinternal }}
|
||||
annotations:
|
||||
cloud.google.com/load-balancer-type: "Internal"
|
||||
{{- end }}
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
selector:
|
||||
app: quobyte-web
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 8080
|
||||
targetPort: 8080
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
# Name of the nodepool in which the Quobyte services will be deployed.
|
||||
# A separate nodepool can be used for performance isolation to avoid
|
||||
# other workloads from impacting your storage.
|
||||
# You can create a nodepool by labeling worker nodes
|
||||
# "kubectl label nodes <your-node-name> storage-node-pool=quobyte"
|
||||
## nodepoolname: quobyte
|
||||
|
||||
# Configuration for the Quobyte services, i.e. the Quobyte cluster providing storage.
|
||||
quobyte:
|
||||
# Loadbalancer to make the Quobyte webconsole accessible.
|
||||
# If set to true an internal IP will be used, if set to false an external IP will be used
|
||||
# the exact semantics of internal/external depend on your k8s config or provider.
|
||||
lbinternal: false
|
||||
|
||||
# Configuration for the persistent disks used by the Quobyte services.
|
||||
# This is *not* the configuration for the CSI plugin and the storage classes
|
||||
# to consume the Quobyte storage!
|
||||
|
||||
# Name depends on the cloud environment, e.g. pd-ssd for Google Kubernetes Engine
|
||||
# flashStorage: gp2 # AWS general purpose SSD
|
||||
flashStorage: pd-ssd
|
||||
# Storage provider depending to the cloud environment
|
||||
# storageProvisioner: kubernetes.io/aws-ebs
|
||||
storageProvisioner: kubernetes.io/gce-pd
|
||||
|
||||
# Minimum number of replicas per Quobyte services, minimum is 3.
|
||||
# Your nodepool must have at least 3 nodes.
|
||||
replicas: 3
|
||||
|
||||
# Data disks attached to each Quobyte data services, minimum is one data disk,
|
||||
# maximum is 16. Please note that adding more data disks will increase capacity,
|
||||
# but not necessarily the performance of your Quobyte cluster.
|
||||
# The name MUST start with "data".
|
||||
# The mount point MUST start with "/var/lib/quobyte/devices/data..." and the last
|
||||
# part MUST match the disk name. E.g. if the name is "data5" the mountpoint
|
||||
# must be "/var/lib/quobyte/devices/data5".
|
||||
# The minimum capacity of a disk must be 100Gi, recommended size depends on the
|
||||
# cloud environment, e.g. 840Gi for Google Persistent SSDs.
|
||||
datadisks:
|
||||
- name: data0
|
||||
mountpoint: /var/lib/quobyte/devices/data0
|
||||
size: "840Gi"
|
||||
- name: data1
|
||||
mountpoint: /var/lib/quobyte/devices/data1
|
||||
size: "840Gi"
|
||||
|
||||
# Metadata disks attached to each Quobyte metadata service, minimum is one
|
||||
# metadata disk. Similar to datadisks, names MUST start with "metadata".
|
||||
# Minimum capacity is 100Gi, recommended size depends on the cloud environment.
|
||||
# Please make sure to use SSDs or media with similar peformance characteristics.
|
||||
metadatadisks:
|
||||
- name: metadata0
|
||||
mountpoint: /var/lib/quobyte/devices/metadata0
|
||||
size: "100Gi"
|
||||
|
||||
# Set enabled to start the Quobyte S3 service. Requires a properly
|
||||
# configured domain name.
|
||||
# As S3 is an HTTP-based protocol, it requires a correct DNS hostname setup.
|
||||
# Generally the S3 service will be available under a specific hostname such as s3.example.com.
|
||||
# Buckets can be addressed as a subdomain of the host e.g., <bucket name>.s3.example.com.
|
||||
#
|
||||
# HTTP requires a setup of both the S3 hostname and a wildcard hostname for subdomains in your DNS
|
||||
# infrastructure which points to the machine or machines running the S3 Proxy.
|
||||
# So at a minimum, there are two CNAME records that point to a machine running the S3 proxy
|
||||
s3:
|
||||
enabled: false
|
||||
dnsname: s3.example.com
|
||||
|
||||
webconsoleport: 8080
|
||||
image: quay.io/quobyte/quobyte-server:3
|
||||
# Maximum number of open file descriptors per container,
|
||||
# must be set to 999,999 or more.
|
||||
maxopenfiles: "1048576"
|
||||
# Maximum number of processes, must be set to 16,000 or more.
|
||||
maxprocs: "16384"
|
24
index.yaml
24
index.yaml
|
@ -5254,6 +5254,30 @@ entries:
|
|||
urls:
|
||||
- assets/portworx/portworx-essentials-2.9.100.tgz
|
||||
version: 2.9.100
|
||||
quobyte-cluster:
|
||||
- annotations:
|
||||
catalog.cattle.io/certified: partner
|
||||
catalog.cattle.io/display-name: Quobyte Cluster Deployment
|
||||
catalog.cattle.io/kube-version: 1.20-0 - 1.24-0
|
||||
catalog.cattle.io/release-name: quobyte-cluster
|
||||
apiVersion: v2
|
||||
appVersion: "3"
|
||||
created: "2022-10-20T22:43:10.454029-04:00"
|
||||
description: Quobyte Cluster Helm Chart Deployment
|
||||
digest: 8bdba16d91129ae9cba6fa3c6540d2cabb179ebc1764f6231e5f9fedd79f41bc
|
||||
home: https://www.quobyte.com
|
||||
icon: https://quobyte.github.io/quobyte-k8s-resources/images/quobyte.png
|
||||
keywords:
|
||||
- quobyte
|
||||
- storage
|
||||
kubeVersion: 1.20-0 - 1.24-0
|
||||
name: quobyte-cluster
|
||||
sources:
|
||||
- https://github.com/quobyte/quobyte-k8s-resources
|
||||
type: application
|
||||
urls:
|
||||
- assets/quobyte/quobyte-cluster-0.1.5.tgz
|
||||
version: 0.1.5
|
||||
redpanda:
|
||||
- annotations:
|
||||
artifacthub.io/images: |
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
# Quobyte Storage Cluster
|
||||
|
||||
This Helm Chart will install a Quobyte storage cluster:
|
||||
https://www.quobyte.com
|
||||
|
||||
Quobyte is a software defined, distributed storage system.
|
||||
|
||||
It allows parallel access from thousands of clients.
|
||||
|
||||
From a Kubernetes point of view it supports dynamic volume
|
||||
provisioning with
|
||||
|
||||
* Multi Tenancy
|
||||
* Encryption at Rest
|
||||
* ReadWriteMany
|
||||
|
||||
To read about the full feature set have a look at the Quobyte documentation:
|
||||
|
||||
https://docs.quobyte.com/
|
||||
|
||||
or the more generic product overview:
|
||||
|
||||
https://www.quobyte.com/product/
|
||||
|
||||
For a detailed description of possbile configuration options comments and defaults in
|
||||
values.yaml.
|
|
@ -0,0 +1,24 @@
|
|||
questions:
|
||||
- variable: quobyte.storageProvisioner
|
||||
default: kubernetes.io/gce-pd
|
||||
required: true
|
||||
type: string
|
||||
label: Storage Provisioner
|
||||
description: >
|
||||
The provisioner Quobyte uses to provision storage devices.
|
||||
For example "kubernetes.io/gce-pd" on Google GKE, "kubernetes.io/aws-ebs" on AWS.
|
||||
- variable: quobyte.flashStorage
|
||||
default: pd-ssd
|
||||
required: true
|
||||
type: string
|
||||
label: Storage Class
|
||||
description: >
|
||||
The cloud provider storage class Quobyte uses when provisioning fast storage devices.
|
||||
For example "pd-ssd" on Google GKE, "gp2" on AWS.
|
||||
- variable: quobyte.replicas
|
||||
default: 3
|
||||
required: false
|
||||
label: Service Replicas
|
||||
description: >
|
||||
The number of service replicas for each Quobyte service (registry, metadata, data).
|
||||
Must not be greater than number of available nodes.
|
|
@ -0,0 +1,4 @@
|
|||
HelmRepo: https://quobyte.github.io/quobyte-k8s-resources/helm-charts
|
||||
HelmChart: quobyte-cluster
|
||||
Vendor: Quobyte
|
||||
DisplayName: Quobyte
|
Loading…
Reference in New Issue