provisioning-catalog/components/democratic_csi/taskserv/install-democratic_csi.sh

111 lines
4 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
set -euo pipefail
[ -r "env-democratic_csi" ] && . ./env-democratic_csi
DEMOCRATIC_CSI_VERSION="${DEMOCRATIC_CSI_VERSION:-0.14.6}"
DEMOCRATIC_CSI_STORAGE_CLASS="${DEMOCRATIC_CSI_STORAGE_CLASS:-nfs-shared}"
DEMOCRATIC_CSI_NFS_SERVER="${DEMOCRATIC_CSI_NFS_SERVER:-}"
DEMOCRATIC_CSI_NFS_SHARE_BASE="${DEMOCRATIC_CSI_NFS_SHARE_BASE:-/shared}"
DEMOCRATIC_CSI_RECLAIM_POLICY="${DEMOCRATIC_CSI_RECLAIM_POLICY:-Retain}"
DEMOCRATIC_CSI_ACCESS_MODE="${DEMOCRATIC_CSI_ACCESS_MODE:-ReadWriteMany}"
NAMESPACE="democratic-csi"
CHART_REPO="https://democratic-csi.github.io/charts"
echo "=== democratic-csi: v${DEMOCRATIC_CSI_VERSION} ==="
# Resolve kubectl and kubeconfig for k0s
if command -v k0s &>/dev/null && k0s kubectl version --client=true &>/dev/null; then
kubectl() { k0s kubectl "$@"; }
# Export kubeconfig for helm (helm doesn't know about k0s kubectl)
K0S_DATA_DIR="${K0S_DATA_DIR:-/var/lib/k0s}"
if [ -z "${KUBECONFIG:-}" ]; then
if [ -f "${K0S_DATA_DIR}/pki/admin.conf" ]; then
export KUBECONFIG="${K0S_DATA_DIR}/pki/admin.conf"
elif [ -f /root/.kube/config ]; then
export KUBECONFIG=/root/.kube/config
else
k0s kubeconfig admin > /tmp/k0s-kubeconfig.yaml
export KUBECONFIG=/tmp/k0s-kubeconfig.yaml
fi
fi
elif ! command -v kubectl &>/dev/null; then
echo "ERROR: neither kubectl nor k0s found" >&2
exit 1
fi
if ! helm version &>/dev/null; then
echo "=== democratic-csi: installing helm ==="
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
fi
# Deferred mode: NFS server not yet assigned — create namespace only.
# State is marked completed; re-run after external_nfs activates on a node.
if [ -z "${DEMOCRATIC_CSI_NFS_SERVER}" ]; then
echo "=== democratic-csi: nfs_server empty — deferred (namespace only) ==="
kubectl create namespace "${NAMESPACE}" --dry-run=client -o yaml | kubectl apply -f -
echo " Set nfs_server to the private IP of the external_nfs node and re-run."
exit 0
fi
echo "=== democratic-csi: deploying nfs-client driver (server=${DEMOCRATIC_CSI_NFS_SERVER}) ==="
kubectl create namespace "${NAMESPACE}" --dry-run=client -o yaml | kubectl apply -f -
helm repo add democratic-csi "${CHART_REPO}" --force-update 2>/dev/null || true
helm repo update democratic-csi 2>/dev/null || true
# nfs-client driver: creates NFS subdirectories via SSH + NFS mount.
# No FreeNAS/TrueNAS API required — works with any Linux NFS server.
cat > /tmp/democratic-csi-values.yaml <<EOF
csiDriver:
name: "org.democratic-csi.nfs-client"
# external-resizer calls NodeGetCapabilities which the nfs-client driver does not
# implement — disabling prevents CrashLoopBackOff on the controller pod.
controller:
externalResizer:
enabled: false
storageClasses:
- name: "${DEMOCRATIC_CSI_STORAGE_CLASS}"
defaultClass: false
reclaimPolicy: "${DEMOCRATIC_CSI_RECLAIM_POLICY}"
volumeBindingMode: Immediate
allowVolumeExpansion: false
accessModes:
- "${DEMOCRATIC_CSI_ACCESS_MODE}"
mountOptions:
- noatime
- nfsvers=4
driver:
config:
driver: nfs-client
instance_id: ""
nfs:
shareHost: "${DEMOCRATIC_CSI_NFS_SERVER}"
shareBasePath: "${DEMOCRATIC_CSI_NFS_SHARE_BASE}"
shareAlldirs: false
shareAllowedHosts: []
shareAllowedNetworks: []
sshConnection:
host: "${DEMOCRATIC_CSI_NFS_SERVER}"
port: 22
username: root
privateKeyFile: /root/.ssh/id_ed25519
EOF
helm template democratic-csi democratic-csi/democratic-csi \
--version "${DEMOCRATIC_CSI_VERSION}" \
--namespace "${NAMESPACE}" \
-f /tmp/democratic-csi-values.yaml \
| kubectl apply -n "${NAMESPACE}" -f -
rm -f /tmp/democratic-csi-values.yaml
echo "=== democratic-csi: waiting for controller ==="
kubectl rollout status deployment/democratic-csi-controller -n "${NAMESPACE}" --timeout=120s
echo "=== democratic-csi: ready (nfs=${DEMOCRATIC_CSI_NFS_SERVER}${DEMOCRATIC_CSI_NFS_SHARE_BASE}, class=${DEMOCRATIC_CSI_STORAGE_CLASS}) ==="